2. 量子比特与量子门实战
单量子比特门是量子线路中最基本的操作单元。它们作用在一个量子比特的二维状态向量上,通过 2×2 复矩阵乘法改变振幅与相位。本节不讨论抽象定义,而是直接围绕“给定初态,施加门,算出末态,验证结果”这一条主线展开,把 X、Y、Z、H、S、T 六个门放进同一套可复现的计算流程里。
约定与状态向量表示
先固定参照约定,全文保持一致。量子比特基态取计算基:
|0⟩ = [1, 0]ᵀ
|1⟩ = [0, 1]ᵀ
任意单量子比特纯态写成 |ψ⟩ = α|0⟩ + β|1⟩,对应列向量 [α, β]ᵀ,满足 |α|² + |β|² = 1。α、β 是复数,可写成模长乘相位因子。全局相位不可观测,因此判断两个态是否等价时,只看相对相位。本文所有门矩阵均采用标准定义,作用方式为“门矩阵左乘态向量”:|ψ′⟩ = U|ψ⟩。
六个单量子比特门的矩阵与作用
六个门的矩阵如下,这是后续所有计算的唯一依据:
X = [[0, 1], [1, 0]]
Y = [[0, -i], [i, 0]]
Z = [[1, 0], [0, -1]]
H = (1/√2)[[1, 1], [1, -1]]
S = [[1, 0], [0, i]]
T = [[1, 0], [0, e^{iπ/4}]]
从作用效果看,X 把 |0⟩ 与 |1⟩ 互换,是比特翻转;Z 保持 |0⟩ 不变、给 |1⟩ 加 π 相位,是相位翻转;Y 同时包含比特翻转与相位翻转,可视为 iXZ 的组合。H 把计算基映射到叠加基,是最常用的叠加态构造门。S 和 T 都是相位门,只改变 |1⟩ 分量的相位,分别加 π/2 和 π/4,它们不改变测量概率,只改变相对相位。
这里有一个容易混淆的点:Z、S、T 作用在 |0⟩ 上时结果仍是 |0⟩,看不出任何变化;只有作用在含 |1⟩ 分量的态上,相位差异才显现。因此构造相位态时,通常先用 H 造出叠加态,再施加相位门。
典型构造路径与状态向量推演
下面给出四条最常用的构造路径,每条都给出逐步向量计算,便于手工核对。
路径一:H 构造等幅叠加态。从 |0⟩ 出发:
H|0⟩ = (1/√2)[[1,1],[1,-1]] · [1,0]ᵀ
= (1/√2)[1, 1]ᵀ
= (|0⟩ + |1⟩)/√2
测量得到 0 和 1 的概率各为 1/2,相对相位为 0。
路径二:H 后接 Z 构造反相叠加态。
Z·H|0⟩ = [[1,0],[0,-1]] · (1/√2)[1,1]ᵀ
= (1/√2)[1, -1]ᵀ
= (|0⟩ − |1⟩)/√2
概率分布与路径一完全相同,但相对相位变成 π。这说明仅看测量概率无法区分这两个态,必须借助干涉或态层析才能区分。
路径三:H 后接 S 构造 π/2 相位态。
S·H|0⟩ = [[1,0],[0,i]] · (1/√2)[1,1]ᵀ
= (1/√2)[1, i]ᵀ
|1⟩ 分量相位为 π/2。若再施加一次 S,得到 (1/√2)[1, −1]ᵀ,与路径二的 Z·H|0⟩ 在忽略全局相位后等价,因为 S² = Z。
路径四:H 后接 T 构造 π/4 相位态。
T·H|0⟩ = [[1,0],[0,e^{iπ/4}]] · (1/√2)[1,1]ᵀ
= (1/√2)[1, e^{iπ/4}]ᵀ
T 是 S 的平方根,两次 T 等价于一次 S,四次 T 等价于一次 Z。这条性质在需要精细相位调节时非常有用。
状态向量模拟验证流程
把上述推演落到可执行的验证流程上,核心是四步:准备初态、按顺序左乘门矩阵、归一化检查、输出振幅与概率。下面给出一段可直接运行的 Python 代码,使用 NumPy 完成全部计算,不依赖任何量子计算框架,便于看清每一步的数值。
import numpy as np
# 基态
ket0 = np.array([1, 0], dtype=complex)
ket1 = np.array([0, 1], dtype=complex)
# 门矩阵
X = np.array([[0, 1], [1, 0]], dtype=complex)
Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
Z = np.array([[1, 0], [0, -1]], dtype=complex)
H = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2)
S = np.array([[1, 0], [0, 1j]], dtype=complex)
T = np.array([[1, 0], [0, np.exp(1j*np.pi/4)]], dtype=complex)
def apply(state, *gates):
for g in gates:
state = g @ state
return state
def report(name, state):
prob = np.abs(state)**2
phase = np.angle(state)
print(f"{name}: {np.round(state, 4)}")
print(f" 概率 = {np.round(prob, 4)}, 相位(rad) = {np.round(phase, 4)}")
report("H|0>", apply(ket0, H))
report("Z·H|0>", apply(ket0, H, Z))
report("S·H|0>", apply(ket0, H, S))
report("T·H|0>", apply(ket0, H, T))
report("X|0>", apply(ket0, X))
report("Y|0>", apply(ket0, Y))
report("S·S·H|0>", apply(ket0, H, S, S))
report("T·T·T·T·H|0>",apply(ket0, H, T, T, T, T))
预期输出中,H|0⟩ 的振幅为 [0.7071, 0.7071],概率 [0.5, 0.5],相位 [0, 0];Z·H|0⟩ 的振幅为 [0.7071, −0.7071],概率仍为 [0.5, 0.5],但第二个分量相位为 π(约 3.1416)。S·H|0⟩ 的第二个分量相位为 π/2(约 1.5708),T·H|0⟩ 为 π/4(约 0.7854)。S·S·H|0⟩ 应与 Z·H|0⟩ 数值一致,T 连续四次后也应与 Z·H|0⟩ 一致,这两条是验证相位门幂次关系是否正确的关键检查点。
结果判读与常见错误
判读结果时抓住三条:第一,概率之和必须为 1,若明显偏离说明矩阵乘法或归一化出错;第二,Z、S、T 不改变概率分布,只改变相位,若概率发生变化,说明门矩阵用错或作用顺序颠倒;第三,全局相位不影响物理结果,例如 −|0⟩ 与 |0⟩ 等价,比较时不要被符号误导。
常见错误有三类。一是把门作用顺序写反,矩阵乘法不满足交换律,H 后 Z 与 Z 后 H 结果不同;二是把 S 与 T 的相位角记混,S 是 π/2,T 是 π/4;三是误以为相位不可观测就无需关心,实际上在后续施加 H 或其他门时,相对相位会通过干涉转化为可观测的概率差异,这正是量子算法利用相位的关键。
把上述流程固化成习惯后,面对更复杂的门序列也能逐层拆解。例如要构造 (|0⟩ − i|1⟩)/√2,可以先 H 再 S,也可以先 X 再 H 再 S,只要最终状态向量一致即可。验证时始终以状态向量为准,而不是凭直觉猜测门的组合效果。下一阶段进入多量子比特时,这套“矩阵左乘、逐步推演、数值核对”的方法仍然是基础。