2. 量子电路与后端基础

在 Qiskit 中,转译(transpile)本质上是把一段“逻辑上正确”的量子电路,改写成一段“能在特定后端上正确执行”的电路。要完成这件事,必须先同时掌握两端的输入:一端是电路本身的结构信息,另一端是后端设备的物理约束。本节围绕这两端展开,为后续的转译流程打好基础。

一、电路端:量子寄存器、门与测量

Qiskit 的量子电路由 QuantumCircuit 表示,其核心组成是量子寄存器、经典寄存器和指令序列。量子寄存器(QuantumRegister)声明一组量子比特,经典寄存器(ClassicalRegister)用于存放测量结果。一个最小可运行示例如下:

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister

qr = QuantumRegister(3, "q")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(qr, cr)

qc.h(0)          # 单比特门
qc.cx(0, 1)      # 双比特门,控制位 q0,目标位 q1
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])

这段电路包含三类关键信息:单比特门(如 h、x、rz)、双比特门(如 cx)以及测量指令。转译时,单比特门通常会被分解为后端基础门集中的旋转门;双比特门则受耦合图约束,可能需要插入 SWAP 来“搬运”量子态;测量指令必须映射到后端允许测量的物理比特上。因此,电路中的门种类、双比特门的作用位置、测量的比特映射,都是转译器需要读取的输入。

需要特别注意的是,量子比特的“逻辑编号”与“物理编号”是两回事。电路中的 q0、q1 只是逻辑标签,转译器会通过一个初始布局(initial layout)把它们映射到后端的具体物理比特上。理解这一点,是理解后续布局与路由的前提。

二、后端端:四类必须认识的设备属性

后端(Backend)代表一台真实的量子设备或模拟器。在 Qiskit 中可通过 backend.configuration() 与 backend.properties() 获取其属性。对转译而言,最关键的属性有四类:

  • 量子比特数(num_qubits):决定电路最多能映射到多少个物理比特,也决定布局搜索空间的大小。
  • 耦合图(coupling_map):描述哪些物理比特之间存在可执行的双比特门。它是一个有向边列表,例如 [[0,1],[1,2],[2,3]] 表示双比特门只能在这些方向上执行。若电路中的 cx(0,2) 两端在耦合图中不相邻,就必须通过路由插入 SWAP。
  • 基础门集(basis_gates):后端原生支持的门集合,例如 ['id','rz','sx','x','cx']。转译器会把电路中的门逐层分解,直到全部落在该集合内。
  • 错误率(error rates):包括单比特门错误率、双比特门错误率、读出错误率等。它们不改变电路的功能,但会影响转译器的优化选择——例如在多个可选映射中优先选择错误率较低的物理比特。
耦合图是有向的。若后端只声明了 [0,1] 而未声明 [1,0],则 cx(1,0) 不能直接执行,转译器需要通过翻转控制位与目标位(配合 H 门)或路由来满足方向约束。

三、两端如何“对上”:转译的核心约束关系

把电路端与后端端放在一起看,转译要解决的就是一组匹配问题:电路中的每个逻辑比特要落到某个物理比特上(布局);每个双比特门的两端必须在耦合图上相邻(路由);每个门必须属于基础门集(分解);在满足以上条件的前提下尽量降低错误率与电路深度(优化)。下面的图示把这一关系直观地呈现出来。

电路端(逻辑) q0 q1 q2 H M M M 门种类:H、CX、测量 双比特门:cx(0,1)、cx(1,2) 逻辑比特:q0、q1、q2 逻辑编号 ≠ 物理编号 转译 布局·路由·分解·优化 后端端(物理) 耦合图(有向边) 0 1 2 3 例:[[0,1],[1,2],[2,3]] 基础门集 rz sx x cx id 错误率(示例值) 单比特门:约 3e-4 双比特门:约 8e-3 读出错误:约 1.5e-2 量子比特数:4

四、一个具体的匹配示例

假设后端有 4 个物理比特,耦合图为 [[0,1],[1,2],[2,3]],基础门集为 ['id','rz','sx','x','cx']。电路中有 cx(0,2),而逻辑比特 q0、q2 若被初始布局映射到物理比特 0 和 2,则二者在耦合图上并不相邻(0 与 2 之间没有直接边),转译器必须插入路由。一种可行做法是借助物理比特 1 作为中转:先 cx(0,1)、cx(1,2)、cx(0,1) 组合实现等效的远程 CNOT,代价是额外的双比特门和更深的电路。若初始布局改为把 q0、q2 映射到相邻的物理比特 1 和 2,则无需路由。这正是“布局选择影响路由代价”的直接体现。

再看门分解:电路中的 h 门不在基础门集中,转译器会把它分解为 rz 与 sx 的组合(在 Qiskit 中通常表现为 rz(π/2)、sx、rz(π/2) 一类的等价序列)。分解不改变电路语义,但会改变门数量与深度,进而影响错误累积。

五、动手检查:转译前的两端信息核对

在真正调用 transpile() 之前,建议先做一次信息核对,把“电路需要什么”和“后端能提供什么”对齐。下面是一份可直接套用的检查清单:

检查项电路端要确认后端端要确认不匹配时的处理
比特数量电路使用的逻辑比特数num_qubits电路比特数不得超过后端比特数
双比特门所有 cx 的作用比特对coupling_map 的边不相邻则需路由或调整布局
门类型电路中出现的门集合basis_gates不在集合内的门将被分解
测量测量指令的目标比特可测量比特及读出错误率映射到低读出错误率的物理比特
优化目标电路深度、双比特门数量各门错误率设置 optimization_level 与种子

完成核对后,就可以带着明确的约束进入转译环节:先确定初始布局,再处理路由与方向约束,最后做门分解与优化。把电路端与后端端的信息都摸清楚,转译结果才可预期、可复现。