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⟩ [1, 0]ᵀ H 叠加态 (1/√2)[1, 1]ᵀ 概率 [0.5, 0.5] Z π 相位 (1/√2)[1, −1]ᵀ 相位 [0, π] S π/2 相位 (1/√2)[1, i]ᵀ 相位 [0, π/2] T π/4 相位 (1/√2)[1, e^{iπ/4}]ᵀ 相位 [0, π/4] 验证要点: ① 概率之和恒为 1;② Z/S/T 不改变概率,只改变相对相位;③ S² = Z,T⁴ = Z;④ 全局相位不可观测,比较时忽略整体符号。

把上述流程固化成习惯后,面对更复杂的门序列也能逐层拆解。例如要构造 (|0⟩ − i|1⟩)/√2,可以先 H 再 S,也可以先 X 再 H 再 S,只要最终状态向量一致即可。验证时始终以状态向量为准,而不是凭直觉猜测门的组合效果。下一阶段进入多量子比特时,这套“矩阵左乘、逐步推演、数值核对”的方法仍然是基础。