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 让它们可以重新上岗。

reset 与“测量后丢弃”不同:测量只是把结果读出,量子比特仍处于坍缩态;reset 则进一步把它确定性地恢复到 |0⟩,使其可以参与后续的制备与门操作。

经典寄存器与量子寄存器的交互语义

动态电路里有两套寄存器:量子寄存器 qreg 保存量子态,经典寄存器 creg 保存测量结果。它们之间的交互遵循一条清晰的单向数据流:量子态 → 测量 → 经典比特 → 条件判断 → 量子门 / 重置。经典寄存器是这条链上的“信息中转站”,它把量子测量结果固化下来,供后续经典逻辑读取。

需要强调三点语义约束。第一,经典寄存器一旦被写入,其值在后续电路中保持不变,直到被新的测量覆盖;条件门读取的是“当前时刻”的经典值,而不是测量发生前的值。第二,条件门不会反向影响经典寄存器,它只读取、不写入,因此经典寄存器的更新只能来自测量。第三,多个测量可以写入同一个经典寄存器的不同比特,条件门也可以同时依赖多个经典比特,这构成了动态电路的分支网络。

下面这张图把四类构件放在同一条执行链上,展示量子寄存器、经典寄存器、测量、条件门与重置之间的数据流向和控制关系。

动态电路核心构件与交互语义 量子寄存器 qreg q[0] q[1] q[2] 保存量子态 |ψ⟩ 可叠加、可纠缠 受量子门演化 中电路测量 MCM 投影到计算基 概率 |α|² / |β|² 破坏叠加与纠缠 经典寄存器 creg c[0] c[1] c[2] 保存确定 0/1 只由测量写入 供条件门读取 写入结果 测量 条件门 if 读取经典比特 c[j]==1 时触发 施加 X / Z / 任意门 经典控制 条件执行 重置 reset 测量 + 条件 X 强制回到 |0⟩ 实现量子比特复用 复用:reset 后重新制备 数据流:量子态 → 测量 → 经典比特 → 条件判断 → 量子门 / 重置;经典寄存器只写于测量,只读于条件门

一个可执行的动态电路示例

下面用 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。这正是动态电路“测量—反馈—复用”闭环的直接体现。

条件门依赖的经典比特必须已经被测量写入。如果条件门引用了尚未测量的经典比特,其值在多数实现中默认为 0,会导致条件分支被静默跳过,这是动态电路调试中最常见的错误之一。

构件之间的语义边界

把四类构件放在一起看,可以总结出三条边界。第一,测量是唯一的量子→经典通道,经典寄存器不能凭空获得量子信息。第二,条件门是唯一的经典→量子控制通道,它把经典判断转化为量子操作,但不改变经典寄存器。第三,重置是量子寄存器的状态复位器,它内部依赖测量与条件 X,因此同时涉及两条通道。理解这三条边界,就能在编写动态电路时准确判断每一步操作会读写哪套寄存器、会不会破坏相干性、以及后续分支是否可达。

在实际编译与执行中,这些语义会进一步映射到硬件能力:中电路测量要求设备支持中途读出,条件门要求存在低延迟经典控制通路,reset 要求快速反馈。当硬件不支持时,编译器可能把动态电路展开为多次运行加经典后处理,或插入额外的测量与条件操作。因此,写出语义正确的动态电路只是第一步,还需要结合目标后端的支持情况来判断它能否被高效执行。