4. 量子电路描述标准化
在复现实验时,最容易出问题的往往不是量子算法本身,而是“电路到底长什么样”没有被准确记录下来。同一份实验,用某平台的图形化编辑器画出来,换到另一台机器、另一个 SDK 版本,门顺序、参数符号、比特编号稍有差异,结果就对不上。OpenQASM(Open Quantum Assembly Language)正是为解决这个问题而生的中间表示:它用纯文本描述量子寄存器、经典寄存器、门操作与测量,既能被人读懂,也能被不同工具解析执行。
本节的目标不是把 OpenQASM 语法背全,而是建立一套“写得出、读得懂、换得动”的描述习惯。我们以 OpenQASM 2.0 为主线(多数平台兼容性最好),在需要时说明 3.0 的差异。
一份最小但完整的电路描述
先看一个可直接保存为 .qasm 文件、用于制备贝尔态的示例。它包含了一个可复现电路所需的全部关键信息:版本声明、寄存器定义、门序列、测量。
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2]; // 2 个量子比特
creg c[2]; // 2 个经典比特
h q[0]; // 对 q[0] 施加 Hadamard 门
cx q[0], q[1]; // 以 q[0] 为控制、q[1] 为目标施加 CNOT
measure q -> c; // 逐位测量并写入经典寄存器
逐行理解这份描述,比记住语法更重要。OPENQASM 2.0; 声明语言版本,解析器据此决定语法规则;include "qelib1.inc"; 引入标准门库,h、cx、x、rz 等门名都来自这里,缺少它会导致“未知门”报错。qreg 与 creg 分别声明量子比特和经典比特的数组,下标从 0 开始,这一点在跨平台时尤其要确认——有的图形界面从 1 开始显示,导出时却按 0 编号,容易错位。
门语句的写法是“门名 + 作用对象”。单比特门如 h q[0];;带参数的门如 rz(pi/4) q[1];,参数可以是数值表达式;受控门如 cx q[0], q[1];,第一个是控制位、第二个是目标位,顺序不能颠倒。测量语句 measure q -> c; 表示把量子寄存器按位映射到经典寄存器,也可以写成 measure q[0] -> c[0]; 逐位指定。
可移植性的三个关键约定
把电路写成 QASM 只是第一步,真正决定它能否在别的平台复现的,是下面三件事是否被明确固定下来。
- 比特编号与物理映射:QASM 里的
q[0]是逻辑比特,落到真实设备上还要经过拓扑映射。复现记录中应同时保存逻辑电路和映射关系(如q[0]→物理比特 3),否则换一台耦合结构不同的设备,同样的 QASM 会因需要插入 SWAP 而改变深度与结果。 - 门集与分解约定:不同平台原生门集不同。若电路里用了
ccx(Toffoli),而目标设备只支持cx与单比特门,编译器会做分解。复现时应记录使用的是哪套基础门集(如u1,u2,u3,cx或rz,sx,x,cx),以及是否允许自动优化。 - 参数与全局相位:角度单位在 QASM 2.0 中默认是弧度,
pi可直接使用。涉及u1、rz这类带相位定义的门时,要注明所采用的相位约定,避免“电路看起来一样、态只差一个全局相位”却被误判为不一致。
// 平台: 某超导设备 // 基础门集: rz,sx,x,cx // 映射: q0→3, q1→5。注释不参与解析,却是复现时最有价值的线索。从图形电路到标准文本的转换与核对
实际工作中,电路常在可视化编辑器里搭建。导出 QASM 后不要直接存档,而应做一次“回读核对”:把导出的文本重新导入另一个工具(或同一工具的文本模式),确认门数量、门顺序、参数值、测量映射四项一致。常见偏差包括:编辑器把 h 后接 rz 合并成 u2 导致门名变化;连续单比特门被优化重排;测量被自动追加到所有比特。这些都会让“同一电路”在文本层面不再相同。
下面这张图展示了一份 QASM 描述从书写到跨平台执行的完整链路,以及每个环节需要固定下来的信息。它强调的不是步骤顺序,而是“哪些约定必须在文本中显式表达,才能保证下游解析结果一致”。
图中虚线表示同一份存档被分发到不同后端。可以看到,平台 A 与平台 B 的基础门集不同,同一段 h、cx 序列在编译后可能变成不同的原生门组合;本地模拟器则提供无噪声基线。三者对比时,若只看最终概率分布,容易把“编译差异”误认为“硬件噪声”。因此,复现记录里应同时保留原始 QASM、各平台编译后的 QASM 以及映射信息,形成可追溯的对照链。
OpenQASM 3.0 的补充能力
当电路涉及经典控制流(如根据测量结果条件执行门)、更丰富的数据类型或时序信息时,2.0 的表达力不够。OpenQASM 3.0 引入了 if 条件语句、bit 与 int 类型、duration 与 box 等时序结构,并支持 input/output 声明。例如条件复位可写成 if (c[0] == 1) x q[0];。但要注意,3.0 的生态支持尚不均衡,跨平台复现时若目标工具只支持 2.0,应把条件逻辑在 2.0 中展开为等价电路或改用平台专有格式,并在文档中注明降级方式。
一份可直接套用的电路描述记录模板
为了让复现可执行,建议每份电路配一份伴随记录。字段不必多,但必须覆盖解析与执行的关键输入:
| 字段 | 示例值 | 作用 |
|---|---|---|
| QASM 版本 | 2.0 | 决定语法与门库解析规则 |
| 基础门集 | rz, sx, x, cx | 说明编译目标,便于解释门分解差异 |
| 逻辑→物理映射 | q0→3, q1→5 | 复现硬件执行路径与串扰环境 |
| 角度单位 | 弧度(pi 可用) | 避免参数被误按角度制解释 |
| 优化开关 | 关闭自动优化 | 保证门序列与存档一致 |
| 测量映射 | q[i] → c[i] | 确保结果比特序一致 |
填写时有一个实用判断:如果换一个平台后,编译前后的 QASM 门数变化超过预期(例如仅因映射就插入多个 SWAP),应在记录中标注“深度变化原因”,而不是简单认为电路写错了。标准化描述的价值,正是让这些差异变得可解释、可比较,而不是被掩盖。
掌握到这一步,你就拥有了一个与平台无关的电路“源文件”。后续无论是做结果对比、版本回溯,还是把实验交给他人复现,都可以从这份标准文本出发,而不是依赖某张截图或某次会话的记忆。