2. 量子比特与门操作的数学表示
在经典计算中,一个比特的状态只有 0 或 1,而门操作就是真值表上的布尔函数。量子计算则完全不同:量子比特的状态是复向量空间中的单位向量,门操作是作用在该向量上的酉矩阵。理解这套代数结构,是后续编写模拟器、优化电路、乃至做 GPU 加速的前提。本节从状态向量出发,逐步建立“态—门—电路”的完整数学表示。
一、量子比特的状态向量
单个量子比特的纯态写成二维复列向量:
|ψ⟩ = α|0⟩ + β|1⟩ = [α, β]ᵀ, α, β ∈ ℂ, |α|² + |β|² = 1
其中 |0⟩ = [1,0]ᵀ,|1⟩ = [0,1]ᵀ 是计算基。归一化条件 |α|²+|β|²=1 保证测量概率之和为 1。测量时得到 0 的概率为 |α|²,得到 1 的概率为 |β|²,测量后态坍缩到对应基态。注意 α、β 是复数,携带相位信息,这正是量子并行性的来源。
多比特系统用张量积组合。两个量子比特的态向量是 4 维:
|ψ⟩ = |ψ₀⟩ ⊗ |ψ₁⟩ = [α₀α₁, α₀β₁, β₀α₁, β₀β₁]ᵀ
n 个量子比特对应 2ⁿ 维复向量。这个指数增长正是量子模拟的核心难点:30 个量子比特就需要约 10 亿个复数(约 16 GB 双精度内存),因此高性能模拟必须依赖分块、稀疏化和并行化。
二、门操作即酉矩阵
量子门是作用在态向量上的线性算子,用矩阵 U 表示,满足酉性:
U†U = UU† = I
酉性保证内积(概率幅)不变,即总概率守恒,且操作可逆。常见单比特门:
| 门 | 矩阵 | 作用 |
|---|---|---|
| X | [[0,1],[1,0]] | 比特翻转,|0⟩↔|1⟩ |
| Z | [[1,0],[0,-1]] | 相位翻转,|1⟩→−|1⟩ |
| H | 1/√2·[[1,1],[1,−1]] | 生成叠加态 |
| S | [[1,0],[0,i]] | 施加 π/2 相位 |
以 H 门作用在 |0⟩ 为例:
H|0⟩ = 1/√2·[1,1]ᵀ = (|0⟩+|1⟩)/√2
测量得到 0 或 1 的概率各为 1/2。若再作用一次 H,则回到 |0⟩,体现 H 的自逆性(H²=I)。
两比特门以 CNOT 为代表,控制位为 1 时翻转目标位。其 4×4 矩阵为:
CNOT = [[1,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,1,0]]
CNOT 能把乘积态变成纠缠态,例如作用于 (|00⟩+|10⟩)/√2 得到 (|00⟩+|11⟩)/√2,即 Bell 态。纠缠无法用两个单比特态的张量积表示,这是量子优势的关键资源。
三、量子电路的代数结构
一个量子电路就是一系列门的矩阵乘积。若电路依次作用 U₁, U₂, …, Uₖ,则整体演化为:
|ψ_out⟩ = Uₖ ⋯ U₂ U₁ |ψ_in⟩
注意矩阵乘法顺序与电路时间顺序相反:最先作用的最靠近态向量。模拟器通常按时间顺序逐个左乘,或先合并相邻门再统一作用,以减少计算量。
多比特门在完整 2ⁿ 维空间中的矩阵是稀疏的:单比特门只影响一个比特,其余比特保持不变,可用张量积与单位阵拼接。例如在 3 比特系统中对第 1 位作用 H:
U = H ⊗ I ⊗ I
这种结构让模拟器不必显式构造 2ⁿ×2ⁿ 的稠密矩阵,而是用“作用于第 k 位”的索引映射直接更新态向量,复杂度从 O(4ⁿ) 降到 O(2ⁿ)。这正是高性能模拟的第一层优化。
四、从数学到代码:一个可执行的模拟片段
下面用 Python/NumPy 演示单比特门作用于 2 比特态向量的索引映射实现。约定:态向量按 |q₀q₁⟩ 排列,q₀ 为高位。对第 k 位(k=0 为高位)作用 2×2 矩阵 M:
import numpy as np
def apply_1q(state, M, k, n):
# state: 长度 2^n 的复向量
# M: 2x2 酉矩阵, k: 目标位(0 为最高位), n: 比特数
dim = 1 << n
step = 1 << (n - 1 - k) # 该位对应的块跨度
out = state.copy()
for base in range(0, dim, step << 1):
for off in range(step):
i0 = base + off # 该位为 0 的索引
i1 = i0 + step # 该位为 1 的索引
a, b = state[i0], state[i1]
out[i0] = M[0,0]*a + M[0,1]*b
out[i1] = M[1,0]*a + M[1,1]*b
return out
# 示例:2 比特初态 |00⟩,对高位作用 H
psi = np.array([1,0,0,0], dtype=complex)
H = np.array([[1,1],[1,-1]]) / np.sqrt(2)
psi = apply_1q(psi, H, k=0, n=2)
print(psi) # [0.707, 0, 0.707, 0] → (|00⟩+|10⟩)/√2
运行结果中非零分量为索引 0 和 2,对应 |00⟩ 和 |10⟩,概率各 0.5,与理论一致。这个循环结构天然适合向量化:把内层 off 循环展开为 NumPy 切片操作,即可获得数十倍加速;进一步映射到 GPU 的线程块,每个线程处理一个 (i0,i1) 对,就是量子模拟器最核心的 kernel。
五、参照约定与常见陷阱
本文及图示统一采用:态向量按 |q₀q₁…q_{n−1}⟩ 排列,q₀ 为最高位;矩阵乘法按“先作用在左”书写,即 U₁ 先作用时整体为 U₂U₁|ψ⟩。切换约定(如 q₀ 为最低位)会改变索引映射中的 step 计算,必须全文一致,否则模拟结果与预期比特顺序错位。