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(n, m) 中的 n 与 m 分别对应量子位和经典位;第二步按算法设计依次放置门,注意控制位与目标位的顺序,qc.cx(control, target) 中第一个参数是控制位;第三步在需要读取结果时添加测量,测量会把量子态坍缩为经典比特串;第四步用 qc.draw() 或 qc.data 核对线路是否与设计一致,再用 Operator(qc) 或模拟器验证态变换是否符合预期。
最后强调参照约定:本课程中布洛赫球的 z 轴正方向对应 |0⟩,负方向对应 |1⟩,θ 从 +z 轴量起;电路图时间从左向右推进,比特从上到下编号。后续讨论旋转门角度、相位与测量结果时,均沿用这一约定,避免正负号与坐标方向混淆。