1. 课程导入与学习路径
在 Qiskit 中写出一条量子线路并不难,难的是让线路“知道”自己刚刚测到了什么,并据此决定下一步做什么。这正是测量寄存器与条件控制要解决的问题。本节作为整门课程的导入,先建立一张全局地图:测量结果如何被保存、如何被读取、如何反过来驱动后续门操作,以及这门课将沿着哪条路径把这些能力真正用起来。
一、两个核心概念:结果存放处与决策开关
测量寄存器(classical register)是量子线路中用来存放测量结果的经典比特容器。在 Qiskit 里,一条线路通常同时拥有量子寄存器(存放 qubit)和经典寄存器(存放 bit)。当我们写 measure(q[0], c[0]) 时,发生的是:对 q[0] 做投影测量,把得到的 0 或 1 写入经典比特 c[0]。经典寄存器不是“日志”,而是线路内部可被后续逻辑引用的真实数据源。
条件控制则是让后续量子操作依赖这些经典比特的取值。例如“若 c[0] == 1,则对 q[1] 施加 X 门”。在 Qiskit 中,这通过 if_test(旧版本为 c_if)表达。它把经典信息反馈回量子线路,形成“测量—判断—再操作”的闭环。
二、为什么它们重要:从静态线路到动态量子程序
没有条件控制的线路是“开环”的:所有门在运行前就已确定,测量只是最后一步的读出。而真实量子算法中大量存在“根据中间结果调整后续操作”的需求,例如量子纠错中的综合征测量与纠正、量子 teleportation 中的经典前馈、变分算法中的自适应门选择、以及量子随机数生成中的后处理分支。这些场景的共同点是:经典信息必须在同一线路内被消费,而不是等到全部运行结束后在外部程序里处理。
需要说明的是,条件控制并不改变量子力学的概率本质,它只是把经典分支逻辑嵌入线路执行流程。理解这一点,有助于后续正确解读“条件执行后的统计结果”与“外部 if 判断”之间的差别。
三、课程整体结构:四个递进层次
本课程共 30 章,围绕“测量寄存器—条件控制—动态线路—实际应用”这条主线展开,可归纳为四个层次。
- 基础层(第 1–8 章):经典寄存器与量子寄存器的声明、测量映射、
measure与measure_all的差异、单比特与多比特测量结果的读取方式,以及counts、memory等结果字段的含义。 - 控制层(第 9–16 章):
if_test的语法与语义、条件表达式(等于、按位与、寄存器整体比较)、条件作用域、嵌套条件,以及条件控制与reset、c_if旧接口的对照。 - 动态层(第 17–24 章):带中间测量的线路、动态电路(dynamic circuit)的执行约束、
Transpile对条件块的处理、模拟器与真实硬件对反馈延迟的差异,以及如何用qiskit_aer验证条件分支。 - 应用层(第 25–30 章):量子 teleportation 的经典前馈、重复直到成功(repeat-until-success)结构、简单纠错综合征反馈、自适应测量策略,并完成一个综合项目。
四、学习目标与一个可运行的最小示例
学完本课程,你应当能够:独立声明并正确映射经典寄存器;读懂测量结果在 counts 与 memory 中的组织方式;用 if_test 写出带分支的线路并解释其执行语义;判断一条动态线路能否在目标后端运行;并能把条件控制用于 teleportation 这类真实任务。
下面是一个最小示例,展示“测量 q[0],若结果为 1 则翻转 q[1]”的完整写法。示例参数为教学设定,运行结果需以实际执行环境为准。
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
q = QuantumRegister(2, "q")
c = ClassicalRegister(1, "c")
qc = QuantumCircuit(q, c)
qc.h(q[0]) # 制造 50% 概率的 |1>
qc.measure(q[0], c[0]) # 结果写入 c[0]
with qc.if_test((c[0], 1)): # 条件:c[0] == 1
qc.x(q[1]) # 条件成立才翻转 q[1]
qc.measure(q[1], c[0]) # 复用 c[0] 读出 q[1] 的最终状态
sim = AerSimulator()
result = sim.run(qc, shots=1000).result()
print(result.get_counts())
观察要点:若条件控制生效,q[1] 的最终测量结果应始终为 1(因为只有 c[0]==1 时才翻转,而翻转后读出的正是 1);若把 if_test 去掉,则会看到 0 和 1 各约一半。这个对比就是判断“条件是否真正生效”的最直接依据。注意示例中复用了 c[0],实际工程中更推荐为不同测量分配独立经典比特,以免覆盖导致结果难以解读。