2. 量子电路与量子门基础

在开始用 Qiskit 搭建电路之前,需要先把三个基础概念对齐:量子比特的状态如何描述、量子门在数学上是什么、以及 Qiskit 中 QuantumCircuit 与 Gate 对象之间是什么关系。这三者构成了后续所有门操作与电路构建工作的共同语言。

一、量子比特与态矢量

经典比特只能取 0 或 1,而一个量子比特(qubit)的纯态可以写成基态 |0⟩ 与 |1⟩ 的线性组合:

|ψ⟩ = α|0⟩ + β|1⟩,   α, β ∈ ℂ,   |α|² + |β|² = 1

这里 α、β 称为概率幅,是复数。测量时得到 0 的概率为 |α|²,得到 1 的概率为 |β|²,归一化条件保证概率之和为 1。注意概率幅本身不可直接观测,能观测的是它的模平方;相位信息虽然看不见,却会在干涉中起作用,这正是量子计算区别于经典概率计算的关键。

在 Qiskit 中,态矢量用 Statevector 表示,习惯上把 |0⟩ 对应向量 [1, 0]ᵀ,|1⟩ 对应 [0, 1]ᵀ。例如 Statevector([1/np.sqrt(2), 1/np.sqrt(2)]) 描述的就是等概率叠加态。多比特系统的态空间是各比特空间的张量积,n 个比特的态矢量有 2ⁿ 个分量,这也是量子电路模拟规模受限的根本原因。

二、布洛赫球:单比特态的几何图像

忽略全局相位后,任意单比特纯态都可以用两个角度参数化:

|ψ⟩ = cos(θ/2)|0⟩ + e^(iφ) sin(θ/2)|1⟩

其中 θ ∈ [0, π] 是极角,φ ∈ [0, 2π) 是方位角。把 (θ, φ) 映射到三维单位球面上,就得到布洛赫球(Bloch sphere):北极对应 |0⟩,南极对应 |1⟩,赤道上的点对应等概率叠加态,φ 决定叠加态的相对相位。Qiskit 提供 plot_bloch_multivector 可直接把态矢量画到球面上。

布洛赫球的价值在于把“门做了什么”变成“球面上的点怎么转”。例如 X 门把北极转到南极,相当于绕 x 轴旋转 π;H 门把 |0⟩ 转到赤道上的 +x 方向;Rz(λ) 则是绕 z 轴旋转 λ 角,只改变 φ 不改变 θ。需要提醒的是,布洛赫球只适用于单比特纯态,纠缠态和多比特混合态无法用单个球面表示,此时应改用密度矩阵或态矢量分量来观察。

三、量子门即酉矩阵

量子门是对态矢量的线性变换 |ψ'⟩ = U|ψ⟩。由于变换后总概率必须仍为 1,要求 U†U = I,即 U 必须是酉矩阵(unitary matrix)。酉性带来两个直接推论:门操作可逆,U⁻¹ = U†;且任意两个合法态之间的内积在变换后保持不变。这也解释了为什么量子电路中的门大多有对应的逆门,如 S 与 S†、T 与 T†。

几个最常用的单比特门及其矩阵形式如下(基为 {|0⟩, |1⟩}):

门矩阵几何作用(布洛赫球)
X[[0,1],[1,0]]绕 x 轴转 π,翻转 |0⟩↔|1⟩
Z[[1,0],[0,-1]]绕 z 轴转 π,翻转 |1⟩ 的相位
H(1/√2)[[1,1],[1,-1]]绕 (x+z)/√2 轴转 π,|0⟩→|+⟩
S[[1,0],[0,i]]绕 z 轴转 π/2
T[[1,0],[0,e^(iπ/4)]]绕 z 轴转 π/4

两比特门中最重要的是受控门。以 CNOT 为例,它以第一个比特为控制位、第二个为目标位,当控制位为 |1⟩ 时对目标位施加 X。其矩阵在基 {|00⟩, |01⟩, |10⟩, |11⟩} 下为分块对角形式 diag(I, X)。CNOT 与单比特门配合可以产生纠缠,例如对 |00⟩ 先施加 H 到第一个比特、再施加 CNOT,得到 (|00⟩+|11⟩)/√2,这是贝尔态,也是后续许多算法的起点。

四、Qiskit 中 QuantumCircuit 与 Gate 的关系

在 Qiskit 里,QuantumCircuit 是承载量子比特与经典比特的容器,同时记录按时间顺序排列的指令;Gate 则是可被放入电路的酉操作对象。二者的关系可以概括为:Gate 是“做什么”,QuantumCircuit 是“在哪里、按什么顺序做”。调用 qc.h(0) 时,Qiskit 会取用内置的 H 门对象并把它追加到电路的指令列表中;也可以用 qc.append(gate, [qubit]) 显式追加一个门对象,这在自定义门或复用门时更直观。

下面这段代码展示了从建电路、加门到查看指令的完整过程:

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)      # 2 个量子比特,2 个经典比特
qc.h(0)                        # 对 q0 施加 H 门
qc.cx(0, 1)                    # CNOT:控制 q0,目标 q1
qc.measure([0, 1], [0, 1])     # 测量并写入经典寄存器

print(qc.data)                 # 查看指令列表
print(qc.draw())               # 文本方式绘制电路

运行后 qc.data 会给出按顺序排列的 CircuitInstruction,每条包含 operation(门对象)、qubits 和 clbits;qc.draw() 则以文本画出时间从左到右的线路图。这里要区分两个层次:qc.h 是电路的方法,负责“放置”;而 H 门本身是一个 Gate 实例,携带矩阵、参数和名称等信息。若需要查看门的矩阵,可对单比特门调用 Gate.to_matrix(),或先用 Operator(qc) 得到整个电路的酉矩阵再检查。

量子门、态矢量与 QuantumCircuit 的关系 态矢量 / 布洛赫球 |0⟩ |1⟩ x |ψ⟩ = cos(θ/2)|0⟩ + e^(iφ)sin(θ/2)|1⟩ 测量概率:|α|²、|β|² 单比特纯态才可球面表示 量子门 = 酉矩阵 U U†U = I 可逆:U⁻¹ = U† X = [[0,1],[1,0]] H = (1/√2)[[1,1],[1,-1]] CNOT = diag(I, X) 产生纠缠 |ψ'⟩ = U|ψ⟩ 门作用于态矢量,改变其分量 QuantumCircuit 容器 q0 q1 H X M M qc.h(0) → 追加 H 门对象 qc.cx(0,1) → 追加 CNOT qc.measure(...) → 写入经典位 qc.data 记录指令序列 qc.draw() 可视化线路 时间从左向右推进 输入态 门对象

五、从对象关系到实际构建

理解上述关系后,构建电路时就有了清晰的检查顺序。第一步确定比特数与经典寄存器数,QuantumCircuit(n, m) 中的 n 与 m 分别对应量子位和经典位;第二步按算法设计依次放置门,注意控制位与目标位的顺序,qc.cx(control, target) 中第一个参数是控制位;第三步在需要读取结果时添加测量,测量会把量子态坍缩为经典比特串;第四步用 qc.draw() 或 qc.data 核对线路是否与设计一致,再用 Operator(qc) 或模拟器验证态变换是否符合预期。

一个常见误区是把“门对象”和“电路方法”混为一谈。门对象是可复用的酉操作描述,电路方法是把该操作放到指定比特上的动作。同一个门对象可以被追加到多个电路、多个位置,而电路本身只记录“哪个门作用在哪些比特上、顺序如何”。

最后强调参照约定:本课程中布洛赫球的 z 轴正方向对应 |0⟩,负方向对应 |1⟩,θ 从 +z 轴量起;电路图时间从左向右推进,比特从上到下编号。后续讨论旋转门角度、相位与测量结果时,均沿用这一约定,避免正负号与坐标方向混淆。