2. 动态电路的核心构件
静态量子电路从制备、演化到测量是一条单向链:所有门在运行前已经确定,测量只出现在末尾。动态电路打破了这个限制,它允许在电路执行到中途时读取部分量子比特,把结果写入经典寄存器,再根据这些经典比特的取值决定后续施加什么门、是否重置、是否继续测量。要真正写出可编译、可执行的动态电路,必须先把四类核心构件及其交互语义弄清楚:中电路测量、条件门、重置操作,以及经典寄存器与量子寄存器之间的数据通道。
中电路测量:把量子信息转成可读的经典比特
中电路测量(mid-circuit measurement, MCM)是在电路尚未结束时对指定量子比特执行测量。它遵循与末端测量相同的投影规则:以计算基测量为例,量子比特以概率 |α|² 坍缩到 |0⟩、以 |β|² 坍缩到 |1⟩,测量结果写入一个经典比特。关键区别在于,测量之后电路还在继续,因此该量子比特的后续状态必须被当作已坍缩的确定态来处理。
例如在 Qiskit 中,中电路测量写作 measure(q[i], c[j]),它同时完成两件事:对量子比特 q[i] 投影,并把结果存进经典比特 c[j]。这个 c[j] 就是后续条件门的输入。需要特别注意的是,测量会破坏该量子比特原有的叠加与纠缠关系,如果它原本与其它比特纠缠,测量会同时改变整个纠缠态的结构。因此中电路测量的位置选择,本质上是在“获取信息”和“保留相干性”之间做权衡。
条件门:用经典比特控制量子操作
条件门是动态电路的“决策执行器”。它的语义是:当经典寄存器中某个(或某组)比特满足指定取值时,才对目标量子比特施加某个量子门。最基础的形式是“单比特条件”,例如“若 c[0] == 1,则对 q[1] 施加 X 门”。在 OpenQASM 3 中可写成:
if (c[0] == 1) {
x q[1];
}
条件门与普通受控门有本质区别。普通 CNOT 的控制位是量子比特,控制关系是量子相干叠加的;条件门的控制位是经典比特,取值是确定的 0 或 1,因此它不会产生量子叠加意义上的控制,而是产生经典分支。这意味着条件门在编译时通常被展开为“测量—经典判断—条件执行”的序列,在硬件上依赖经典控制通路。
条件还可以组合成更复杂的判断,例如 if (c[0] == 1 && c[1] == 0),或对经典寄存器整体比较 if (c == 3)。这类多比特条件在量子纠错、自适应相位估计等场景中非常常见。
重置操作:把量子比特拉回 |0⟩ 并复用
重置(reset)把量子比特强制置回 |0⟩,无论它当前处于什么状态。它的物理语义是:先测量该比特,若结果为 1 则施加 X 门翻转回 |0⟩,若为 0 则不做操作。因此 reset 在硬件层面通常由“测量 + 条件 X”实现,是一种带经典反馈的操作。
重置的价值在于量子比特复用。在只有少量物理量子比特的硬件上,如果某个比特已经完成计算、不再需要保留其状态,就可以 reset 后重新制备,用于承载新的逻辑。这在动态电路中尤其重要,因为中电路测量已经让部分比特“提前退休”,reset 让它们可以重新上岗。
经典寄存器与量子寄存器的交互语义
动态电路里有两套寄存器:量子寄存器 qreg 保存量子态,经典寄存器 creg 保存测量结果。它们之间的交互遵循一条清晰的单向数据流:量子态 → 测量 → 经典比特 → 条件判断 → 量子门 / 重置。经典寄存器是这条链上的“信息中转站”,它把量子测量结果固化下来,供后续经典逻辑读取。
需要强调三点语义约束。第一,经典寄存器一旦被写入,其值在后续电路中保持不变,直到被新的测量覆盖;条件门读取的是“当前时刻”的经典值,而不是测量发生前的值。第二,条件门不会反向影响经典寄存器,它只读取、不写入,因此经典寄存器的更新只能来自测量。第三,多个测量可以写入同一个经典寄存器的不同比特,条件门也可以同时依赖多个经典比特,这构成了动态电路的分支网络。
下面这张图把四类构件放在同一条执行链上,展示量子寄存器、经典寄存器、测量、条件门与重置之间的数据流向和控制关系。
一个可执行的动态电路示例
下面用 Qiskit 写一个包含四类构件的短电路:制备 q[0] 到叠加态,测量它,根据结果决定是否翻转 q[1],最后重置 q[0] 并复用。
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
q = QuantumRegister(2, 'q')
c = ClassicalRegister(2, 'c')
qc = QuantumCircuit(q, c)
qc.h(q[0]) # 制备叠加态
qc.measure(q[0], c[0]) # 中电路测量,结果写入 c[0]
qc.x(q[1]).c_if(c, 1) # 条件门:c[0]==1 时翻转 q[1]
qc.reset(q[0]) # 重置 q[0],准备复用
qc.h(q[0]) # 复用 q[0] 做新一轮计算
qc.measure(q[0], c[1]) # 末端测量
这段电路的行为可以这样判断:若第一次测量得到 0,则 q[1] 保持 |0⟩;若得到 1,则 q[1] 被翻转到 |1⟩。q[0] 在 reset 后回到 |0⟩,再经 H 门重新进入叠加态,因此第二次测量 c[1] 会以约 50% 概率得到 0 或 1。运行多次采样后,c[0] 与 c[1] 的联合分布会呈现出相关性:c[0]=1 的样本中,q[1] 的最终测量结果应偏向 1。这正是动态电路“测量—反馈—复用”闭环的直接体现。
构件之间的语义边界
把四类构件放在一起看,可以总结出三条边界。第一,测量是唯一的量子→经典通道,经典寄存器不能凭空获得量子信息。第二,条件门是唯一的经典→量子控制通道,它把经典判断转化为量子操作,但不改变经典寄存器。第三,重置是量子寄存器的状态复位器,它内部依赖测量与条件 X,因此同时涉及两条通道。理解这三条边界,就能在编写动态电路时准确判断每一步操作会读写哪套寄存器、会不会破坏相干性、以及后续分支是否可达。
在实际编译与执行中,这些语义会进一步映射到硬件能力:中电路测量要求设备支持中途读出,条件门要求存在低延迟经典控制通路,reset 要求快速反馈。当硬件不支持时,编译器可能把动态电路展开为多次运行加经典后处理,或插入额外的测量与条件操作。因此,写出语义正确的动态电路只是第一步,还需要结合目标后端的支持情况来判断它能否被高效执行。