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⟩
H1/√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ⁿ)。这正是高性能模拟的第一层优化。

量子电路代数结构:态向量 → 门矩阵 → 电路乘积 态向量 |ψ⟩ 2ⁿ 维复列向量 |α|²+|β|²=1 n=30 → 2³⁰ ≈ 10⁹ 项 门矩阵 U 酉性 U†U = I 单比特 2×2 CNOT 4×4 稀疏 电路演化 |ψ_out⟩ = Uₖ⋯U₂U₁|ψ_in⟩ 矩阵乘法顺序与时间相反 可合并相邻门减少运算 模拟器实现路径:从稠密矩阵到索引映射 稠密矩阵法 构造 2ⁿ×2ⁿ 矩阵 复杂度 O(4ⁿ),仅适合小 n 张量积拼接 U = H ⊗ I ⊗ I 利用稀疏结构 索引映射更新 直接更新第 k 位分量 复杂度 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。

判断实现是否正确,可检查三点:① 输出向量模长仍为 1;② 对同一门连续作用两次应回到原态(自逆门如 H、X、CNOT);③ 对 |0⟩ 作用 H 后测量 1000 次,0 和 1 的频数应接近 500:500。

五、参照约定与常见陷阱

本文及图示统一采用:态向量按 |q₀q₁…q_{n−1}⟩ 排列,q₀ 为最高位;矩阵乘法按“先作用在左”书写,即 U₁ 先作用时整体为 U₂U₁|ψ⟩。切换约定(如 q₀ 为最低位)会改变索引映射中的 step 计算,必须全文一致,否则模拟结果与预期比特顺序错位。