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 这类带相位定义的门时,要注明所采用的相位约定,避免“电路看起来一样、态只差一个全局相位”却被误判为不一致。
建议在 QASM 文件头部用注释固定元信息,例如 // 平台: 某超导设备 // 基础门集: rz,sx,x,cx // 映射: q0→3, q1→5。注释不参与解析,却是复现时最有价值的线索。

从图形电路到标准文本的转换与核对

实际工作中,电路常在可视化编辑器里搭建。导出 QASM 后不要直接存档,而应做一次“回读核对”:把导出的文本重新导入另一个工具(或同一工具的文本模式),确认门数量、门顺序、参数值、测量映射四项一致。常见偏差包括:编辑器把 h 后接 rz 合并成 u2 导致门名变化;连续单比特门被优化重排;测量被自动追加到所有比特。这些都会让“同一电路”在文本层面不再相同。

下面这张图展示了一份 QASM 描述从书写到跨平台执行的完整链路,以及每个环节需要固定下来的信息。它强调的不是步骤顺序,而是“哪些约定必须在文本中显式表达,才能保证下游解析结果一致”。

OpenQASM 电路描述的可移植链路 可视化电路编辑 拖拽门 / 连线 设置参数与测量 导出 QASM 文本 版本声明 + 门库 寄存器 / 门序列 / 测量 回读核对 门数 / 顺序 / 参数 测量映射一致性 版本化存档 .qasm + 元信息 注释记录约定 平台 A 解析执行 基础门集: u1,u2,u3,cx 映射: q0→3, q1→5 平台 B 解析执行 基础门集: rz,sx,x,cx 映射: q0→1, q1→2 本地模拟器 理想门 / 无噪声 用于基线对照 复现时必须显式固定的三项约定: ① 逻辑比特到物理比特的映射 ② 目标平台基础门集与分解策略 ③ 角度单位与相位约定 门集不同 → 分解不同

图中虚线表示同一份存档被分发到不同后端。可以看到,平台 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),应在记录中标注“深度变化原因”,而不是简单认为电路写错了。标准化描述的价值,正是让这些差异变得可解释、可比较,而不是被掩盖。

不要把平台导出的 QASM 当作唯一真相。导出文本可能已包含平台自动插入的初始化、屏障或测量,与你在编辑器里看到的逻辑电路并不等价。存档前务必回读核对,并在注释中写明“此为编译后文本”还是“逻辑电路文本”。

掌握到这一步,你就拥有了一个与平台无关的电路“源文件”。后续无论是做结果对比、版本回溯,还是把实验交给他人复现,都可以从这份标准文本出发,而不是依赖某张截图或某次会话的记忆。