4. 跨SDK电路表示与转换原理

不同量子SDK对同一段量子算法的“内部表示”并不一致。Qiskit 用 QuantumCircuit 组织指令,Cirq 用 Circuit 与 Moment 描述时序,Braket 用 Circuit 加 Instruction 表达门与结果类型,而 OpenQASM 2/3 则用文本语法描述门、寄存器与测量。跨SDK迁移时,真正要解决的不是“把代码抄过去”,而是把一种电路表示等价地映射到另一种表示。这个映射过程通常包含四个关键问题:门集映射、量子比特映射、测量与重置语义对齐、全局相位处理。

门集映射:从抽象门到目标设备原生门

门集映射的核心是:源电路中的逻辑门,必须被替换为目标SDK或目标硬件支持的门集合。例如源电路里出现 ccx(Toffoli)、swap、rzz,而目标设备只支持 u1/u2/u3、cx 和若干单比特旋转门,就需要把多比特门分解为原生门序列。常见分解包括:

  • swap 分解为三个 cx;
  • ccx 分解为若干 cx 与单比特门,典型实现需要 6 个 cx 加若干 h、t、tdg;
  • rzz(θ) 可分解为 cx、rz(θ)、cx 的组合。

在 Qiskit 中,这一过程由 transpile() 的 basis_gates 参数控制;在 Cirq 中,可通过 cirq.optimize_for_target_gateset() 指定目标门集;在 Braket 中,则通过设备属性中的 nativeGateSet 判断可用门。门集映射不是简单替换,它还会改变电路深度和保真度,因此需要关注分解后的 cx 数量与深度变化。

量子比特映射:逻辑比特到物理比特的对应

源电路通常使用逻辑比特名,如 q[0]、q[1]、q[2];目标设备则使用物理比特编号,如 0..N-1,并且只有部分比特对之间存在耦合。量子比特映射要解决两件事:一是把逻辑比特分配到物理比特上,二是当两比特门作用在无耦合的比特对时,插入 swap 或桥接门,把量子态“搬”到可执行门的位置。

例如目标设备耦合图为 0—1—2—3,源电路需要执行 cx(q0, q3)。若初始映射为 q0→0, q3→3,则 0 与 3 之间没有直接耦合,需要插入 swap(1,2) 或 swap(2,3) 等操作,把 q3 的状态移动到与 0 相邻的位置。Qiskit 的 SabreSwap、Cirq 的 RouteCQC、Braket 的编译流程都会自动完成这类路由,但不同策略产生的 swap 数量不同,直接影响电路深度。

测量与重置语义对齐

测量语义的差异常被忽略。Qiskit 中 measure(q, c) 把量子比特测量结果写入经典寄存器;Cirq 中 cirq.measure(q, key='m') 把结果绑定到测量键;Braket 中则通过 result_types 或 measure 指令声明测量。迁移时必须保证:测量对象、测量顺序、经典寄存器位宽、结果键名一一对应。

重置语义同样关键。Qiskit 的 reset(q) 表示把量子比特复位到 |0⟩;Cirq 中常用 cirq.reset(q);部分硬件不支持中途重置,只能通过测量后条件反馈或重新初始化实现。若源电路依赖“测量后重置再复用”,而目标设备不支持 reset,就必须改写为“测量—条件 X—继续”或拆分为多个独立电路。

全局相位处理

全局相位是跨SDK转换中最隐蔽的坑。量子态 |ψ⟩ 与 e^{iφ}|ψ⟩ 在物理上不可区分,但不同SDK对全局相位的跟踪方式不同。Qiskit 的 Operator 与 Statevector 会保留全局相位;Cirq 在比较电路等价性时默认忽略全局相位;OpenQASM 文本本身不显式记录全局相位。若迁移后直接比较态矢量,可能因全局相位差异误判为“不等价”。

处理原则是:若只关心测量概率与期望值,可忽略全局相位;若要做受控操作、相位估计或态层析,则必须显式跟踪。Qiskit 中可用 global_phase 属性;Cirq 中可用 cirq.global_phase_operation() 显式加入;Braket 中则需在电路末尾补一个全局相位门或通过结果后处理补偿。

跨SDK电路转换的四类映射关系 源电路表示 Qiskit / Cirq / Braket 逻辑门:h, cx, ccx rzz, swap 逻辑比特:q[0..n-1] 经典寄存器 c[0..m-1] 测量:measure(q,c) 重置:reset(q) 全局相位:global_phase 或隐式忽略 源SDK语义约定 门集 / 比特 / 测量 / 相位 转换与映射层 ① 门集映射 ccx → 6×cx + h/t/tdg swap → 3×cx;rzz → cx-rz-cx ② 量子比特映射 逻辑 q[i] → 物理 p[j] 无耦合时插入 swap 路由 ③ 测量与重置语义对齐 measure(q,c) ↔ measure(q,key) reset 不支持时改写为条件反馈 ④ 全局相位处理 |ψ⟩ 与 e^{iφ}|ψ⟩ 物理等价 受控/相位估计时需显式跟踪 目标电路表示 目标SDK / 硬件 原生门集 u1/u2/u3, cx 物理比特 0..N-1 耦合图约束 结果类型 / 测量键 经典寄存器映射 全局相位补偿 或后处理修正 目标SDK语义约定 门集 / 比特 / 测量 / 相位 等价性验证:态矢量 / 测量概率 / 期望值 / 全局相位

转换后的等价性验证

完成四类映射后,必须验证源电路与目标电路是否等价。验证方式取决于关注点:若只关心测量结果,可比较测量概率分布;若关心态矢量,可比较 Statevector 并允许全局相位差异;若关心期望值,可比较多个可观测量在两组电路上的期望值。Qiskit 中可用 Operator.from_circuit() 与 equiv();Cirq 中可用 cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent();Braket 中可通过本地模拟器比较结果类型输出。

迁移时建议先固定一个最小可验证电路(如 3 比特 GHZ 态),依次检查门集、比特映射、测量键、全局相位四项,再扩展到完整算法。这样能把问题定位到具体映射环节,而不是在整段电路里盲目排查。

一个可执行的迁移检查清单

检查项源侧关注点目标侧关注点判断依据
门集ccx、swap、rzz 等非原生门basis_gates / nativeGateSet分解后 cx 数量与深度
比特映射逻辑比特名与数量物理比特编号与耦合图swap 插入次数、路由后深度
测量measure(q,c) 顺序与位宽结果键名、result_types经典寄存器位与结果键一一对应
重置reset(q) 是否中途使用硬件是否支持 reset不支持时改写为条件反馈
全局相位global_phase 是否显式是否跟踪全局相位态矢量比较时允许 e^{iφ} 差异

实际迁移中,门集映射与量子比特映射往往由SDK的编译流程自动完成,但测量语义与全局相位需要人工确认。尤其是当源电路包含中途测量、条件重置或受控全局相位时,自动转换可能丢失语义。建议在转换后保留一份“映射记录”,记录每个逻辑比特对应的物理比特、每个测量键对应的经典位、以及全局相位的处理方式,便于后续调试与复现。