2. 量子比特与量子门基础回顾
在进入 Shor 九比特纠错码的电路仿真之前,有必要把量子比特的数学表示和常用量子门的矩阵形式重新梳理一遍。纠错码的编码、伴随式测量和恢复操作,本质上都是由这些基本门组合而成的;如果对 X、Z、H、CNOT 的作用方向与相位关系不够熟悉,后面阅读九比特编码电路时很容易把"哪个比特被翻转、哪个比特被相位翻转"搞混。本节的目标不是重新推导线性代数,而是把表示法、门矩阵和真值表三者对齐,并用一段可执行的仿真代码验证它们确实一致。
量子比特的表示与约定
一个量子比特的纯态写成二维复向量 |ψ⟩ = α|0⟩ + β|1⟩,其中 α、β 为复振幅且满足 |α|² + |β|² = 1。计算基取
|0⟩ = [1, 0]^T, |1⟩ = [0, 1]^T
在 Qiskit 等框架中,多比特寄存器按"小端序"排列:寄存器 q0q1 的态向量下标为二进制 b0b1,即 |q0 q1⟩。例如两比特态 |10⟩ 对应下标 2,向量为 [0,0,1,0]^T。这个约定必须与后续电路图保持一致,否则 CNOT 的控制位和目标位会读反。本节所有矩阵均作用在单比特子空间上,多比特门则用张量积或显式 4×4 矩阵给出。
单比特门的矩阵与作用
四个常用单比特门在计算基下的矩阵为:
X = [[0,1],[1,0]] Y = [[0,-i],[i,0]]
Z = [[1,0],[0,-1]] H = (1/√2)[[1,1],[1,-1]]
X 门是比特翻转:X|0⟩ = |1⟩,X|1⟩ = |0⟩,对应布洛赫球上绕 x 轴转 π。Z 门是相位翻转:Z|0⟩ = |0⟩,Z|1⟩ = −|1⟩,它不改变测量概率,却改变叠加态的相位,这正是相位翻转错误难以直接观测的原因。Y 门可看作 X 与 Z 的复合(差一个全局相位 i),同时引入比特翻转和相位翻转。H 门把计算基映射到叠加基:H|0⟩ = (|0⟩+|1⟩)/√2,H|1⟩ = (|0⟩−|1⟩)/√2,且 H² = I。H 的关键用途是"基变换"——把 Z 型相位信息转成 X 型比特信息,纠错码中测量 X 型稳定子前往往要先加 H。
需要注意,X、Y、Z 都是厄米且酉的,特征值为 ±1;H 也是厄米酉矩阵。这些性质保证了它们可以作为可观测量,也保证了门操作可逆。
双比特门:CNOT 与 CZ
CNOT(受控非)以第一个比特为控制位、第二个为目标位,矩阵为
CNOT = [[1,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,1,0]]
其作用是:控制位为 0 时目标位不变,控制位为 1 时对目标位施加 X。真值表为 |00⟩→|00⟩、|01⟩→|01⟩、|10⟩→|11⟩、|11⟩→|10⟩。CZ 则是控制位为 1 时对目标位施加 Z,矩阵为 diag(1,1,1,−1),真值表中只有 |11⟩ 获得 −1 相位。CZ 对两个比特对称,CNOT 不对称,这一点在画电路和写代码时都要留意。
CNOT 最重要的代数性质是它能把 X 和 Z 在控制位与目标位之间"搬运":CNOT·(X⊗I)·CNOT = X⊗X,CNOT·(I⊗X)·CNOT = I⊗X,CNOT·(Z⊗I)·CNOT = Z⊗I,CNOT·(I⊗Z)·CNOT = Z⊗Z。九比特纠错码的稳定子测量电路正是靠这类恒等式把数据比特上的错误"复制"到辅助比特上,因此本节先把这组关系验证清楚,后面读编码电路会顺畅很多。
用仿真验证矩阵与真值表
下面用 Qiskit 的 Operator 与 Statevector 做一次最小验证。思路是:先取出门的矩阵,再把它作用到基态上,与手算真值表比对;对 CNOT 的共轭关系则直接做矩阵乘法。以下代码为教学示例,运行环境为 Qiskit 1.x,结果由矩阵运算确定,不涉及真实硬件噪声。
from qiskit.quantum_info import Operator, Statevector
import numpy as np
X = Operator([[0,1],[1,0]]).data
Z = Operator([[1,0],[0,-1]]).data
H = Operator([[1,1],[1,-1]]).data / np.sqrt(2)
# 单比特门作用到 |0⟩、|1⟩
for name, U in [("X",X), ("Z",Z), ("H",H)]:
for k in (0,1):
v = np.zeros(2, dtype=complex); v[k] = 1
print(name, k, np.round(U @ v, 3))
# CNOT 真值表
CNOT = Operator([[1,0,0,0],[0,1,0,0],
[0,0,0,1],[0,0,1,0]]).data
for idx in range(4):
v = np.zeros(4, dtype=complex); v[idx] = 1
print("CNOT", format(idx,'02b'), "->", np.round(CNOT @ v, 3))
预期输出中,X 把 |0⟩ 变为 |1⟩、|1⟩ 变为 |0⟩;Z 对 |1⟩ 输出 −1;H 对 |0⟩ 输出 [0.707, 0.707]。CNOT 的四行分别给出 |00⟩、|01⟩、|11⟩、|10⟩,与真值表一致。若把 CNOT 矩阵写成控制位在后的形式,输出会变成 |00⟩、|11⟩、|10⟩、|01⟩,这就是小端序写反的典型症状,调试时应优先检查。
接着验证共轭关系。以 CNOT·(X⊗I)·CNOT 为例,用 np.kron 构造 X⊗I,做三次矩阵乘法后与 np.kron(X, X) 比较,最大元素误差应在 1e-15 量级。若结果不符,多半是 CNOT 的控制位与目标位顺序与张量积顺序不匹配。建议把四个恒等式写成一个循环,统一用 np.allclose 判定,输出 True/False 即可快速定位问题。
仿真中值得留意的几个细节
第一,全局相位不可观测。Z|1⟩ = −|1⟩ 与 |1⟩ 在测量上等价,比较态向量时应比较 Statevector 的等价性(Qiskit 提供 equiv 方法),而不是逐元素相等。第二,H 门矩阵中的 1/√2 不要漏乘,否则归一化检查会失败。第三,Y 门含虚数单位,态向量必须用复数 dtype,否则 NumPy 会截断虚部并给出错误结果。第四,多比特门用 Operator 构造时,输入矩阵的基顺序必须与电路寄存器顺序一致,建议在代码注释中显式写明"q0 为低位"。
np.allclose 批量检查四条共轭恒等式。全部通过后再进入九比特编码电路,可以避免把基础约定错误带入后续仿真。完成本节验证后,应当能够做到:看到 X、Z、H、CNOT 的电路符号就写出其矩阵;给定输入基态能口算输出;看到 CNOT 共轭式能判断错误被搬运到哪个比特。这三项能力是理解九比特纠错码中"数据位—辅助位"交互的前提,也是后续编写伴随式测量电路时排查符号错误的主要依据。