4. 重复码在比特翻转噪声下的逻辑错误率仿真

比特翻转噪声下的三量子比特重复码仿真设计

本节要完成的任务是:在比特翻转概率 p 可调的噪声模型下,对三量子比特重复码进行多次蒙特卡洛采样,统计逻辑错误率 P_L(p),并绘制曲线与理论阈值行为对比。三量子比特重复码只能纠正一个比特翻转,因此当两个或三个物理比特同时翻转时,纠错后逻辑态仍会出错。对独立比特翻转噪声,逻辑错误率的主导项为:

P_L(p) = 3p²(1−p) + p³ = 3p² − 2p³

该式在 p < 0.5 时小于 p,说明编码带来了净收益;当 p → 0.5 时 P_L → p,即阈值行为出现在 p = 0.5 附近。仿真中我们并不直接套用公式,而是通过“采样错误 → 计算症状 → 查表解码 → 判断逻辑错误”的完整链路统计,再与公式曲线对照,验证仿真实现是否正确。

噪声采样 每个比特独立 以概率 p 翻转 e = (e₀,e₁,e₂) 症状提取 s₀ = e₀⊕e₁ s₁ = e₁⊕e₂ (s₀,s₁) ∈ {00,01,10,11} 查表解码 00→无错 01→q₂ 10→q₀ 11→q₁ 输出恢复位置 逻辑错误判定 恢复后残余错误 e ⊕ ê ≠ 000 → 计为逻辑错误 典型错误模式与判定结果(示例) 单比特翻转 e=100 症状 (s₀,s₁)=(1,0) 解码 ê=100 → 恢复 q₀ 残余 000 → 纠错成功 双比特翻转 e=110 症状 (s₀,s₁)=(1,1) 解码 ê=010 → 恢复 q₁ 残余 100 → 逻辑错误 三比特翻转 e=111 症状 (s₀,s₁)=(0,0) 解码 ê=000 → 不恢复 残余 111 → 逻辑错误 P_L(p) 与 p 的关系(示意) p P_L P_L=p 3p²−2p³ p=0.5 阈值

仿真实现:从采样到逻辑错误统计

下面给出一个自洽、可直接运行的 Python 仿真脚本。它不依赖任何量子仿真框架,而是直接对三量子比特重复码的比特翻转噪声做经典蒙特卡洛模拟——因为比特翻转噪声下重复码的纠错行为完全可以用经典比特模型精确描述,这样既保证结果可复现,又便于逐行核对逻辑。

import numpy as np

# 三量子比特重复码:症状提取与查表解码
# 症状 s0 = e0 ^ e1, s1 = e1 ^ e2
# 解码表:症状 -> 恢复位置(None 表示不恢复)
DECODE = {
    (0, 0): None,   # 无错或三比特全错
    (1, 0): 0,      # 仅 q0 错
    (1, 1): 1,      # 仅 q1 错
    (0, 1): 2,      # 仅 q2 错
}

def extract_syndrome(e):
    e0, e1, e2 = e
    return (e0 ^ e1, e1 ^ e2)

def correct(e):
    s = extract_syndrome(e)
    pos = DECODE[s]
    e_hat = [0, 0, 0]
    if pos is not None:
        e_hat[pos] = 1
    return e_hat

def is_logical_error(e):
    e_hat = correct(e)
    residual = [e[i] ^ e_hat[i] for i in range(3)]
    return any(residual)

def simulate(p, shots=200000, seed=42):
    rng = np.random.default_rng(seed)
    errors = rng.random((shots, 3)) < p   # 每个比特独立以概率 p 翻转
    logical = np.array([is_logical_error(tuple(row.astype(int))) for row in errors])
    return logical.mean()

# 扫描物理错误率 p,统计逻辑错误率
p_values = np.linspace(0.01, 0.5, 25)
P_L_sim = np.array([simulate(p) for p in p_values])
P_L_theory = 3 * p_values**2 - 2 * p_values**3

for p, sim, th in zip(p_values[::4], P_L_sim[::4], P_L_theory[::4]):
    print(f"p={p:.3f}  仿真 P_L={sim:.5f}  理论 P_L={th:.5f}")

运行后应观察到:在 p 较小时,仿真值 P_L_sim 与理论值 3p²−2p³ 高度吻合(差异在统计涨落范围内,约 1/√shots 量级);随着 p 增大,两者仍保持一致,直到 p = 0.5 时 P_L = 0.5,与 p 相等,体现阈值行为。若仿真曲线明显偏离理论曲线,通常说明症状映射或解码表写错,例如把 (1,1) 映射到位置 0 而非位置 1。

采样数 shots 决定统计精度:要分辨 p=0.05 时约 7×10⁻³ 的逻辑错误率,shots=200000 已足够;若想分辨 p=0.01 时约 3×10⁻⁴ 的量级,建议提高到 10⁶ 以上,或对每个 p 使用不同随机种子重复取平均。

结果判读与阈值行为分析

把仿真结果与理论曲线放在同一张图上对照,重点看三个区域:

  • 低噪声区(p < 0.1):P_L ≈ 3p²,逻辑错误率随 p 平方下降,这是编码带来的“二次抑制”收益,也是重复码相对裸比特的核心优势。
  • 中等噪声区(0.1 ≤ p < 0.4):三次项 −2p³ 开始显现,曲线略低于纯二次拟合,但仍显著低于 p。
  • 阈值附近(p → 0.5):P_L → p,编码不再带来收益;p > 0.5 时 P_L > p,编码反而有害。这正是“阈值”概念的直观体现——三量子比特重复码的阈值约为 0.5(针对比特翻转噪声)。

判读时还应注意:仿真曲线在 p 接近 0.5 处会因采样涨落出现轻微抖动,这是正常统计现象,不应误判为解码逻辑错误;判断解码是否正确,应优先看低噪声区是否严格贴合 3p²−2p³。

本仿真只覆盖比特翻转(X 型)噪声,不包含相位翻转或退相干。若把该模型直接用于相位噪声场景,症状提取与解码表都需要重新设计,逻辑错误率曲线也会不同。阈值 0.5 仅对独立比特翻转噪声成立,不可外推到其他噪声模型。