4. 仿真环境搭建与工具选型
E91协议的核心是纠缠态分发、基矢选择、贝尔不等式检验与密钥筛选,因此仿真环境必须同时具备三方面能力:量子态的制备与演化、测量与统计采样、以及经典后处理与可视化。Python生态中,QuTiP与Qiskit是最常用的两类工具,但它们的定位并不相同,选型前需要先明确本节要仿真什么。
工具定位与选型判断
QuTiP(Quantum Toolbox in Python)面向开放量子系统的数值求解,擅长用密度矩阵、算符和超算符描述量子态及其演化,内置 Qobj、tensor、expect、mesolve 等对象与函数,非常适合刻画E91中纠缠源的不完美、信道噪声和测量算符。Qiskit则以量子线路为中心,提供 QuantumCircuit、AerSimulator、Statevector 等组件,适合把E91的测量过程写成线路并做统计采样。对于本课程,推荐以QuTiP为主做态与测量的精确计算,以Qiskit Aer做采样与线路级验证,二者互补而非替代。
安装与最小可用环境
建议使用独立虚拟环境,避免QuTiP与Qiskit的依赖版本互相干扰。以下命令在Python 3.10环境下验证思路可行,具体版本号可按实际发布情况调整:
python -m venv e91env
source e91env/bin/activate # Windows 使用 e91env\Scripts\activate
pip install "qutip>=4.7" qiskit qiskit-aer numpy pandas matplotlib
python -c "import qutip, qiskit; print(qutip.__version__, qiskit.__version__)"
安装完成后先做一次冒烟测试:用QuTiP构造贝尔态并计算某个测量算符的期望值,确认 Qobj 运算正常;再用Qiskit Aer运行一个两比特线路并取 counts,确认采样链路可用。冒烟测试通过后再进入协议代码,能显著减少后续排障成本。
E91关键对象的代码化
E91使用四个测量算符,通常取A侧为A₀=σz、A₁=σx,B侧为B₀=(σz+σx)/√2、B₁=(σz−σx)/√2,对应CHSH组合 S=E(A₀,B₀)+E(A₀,B₁)+E(A₁,B₀)−E(A₁,B₁)。在QuTiP中可直接用 tensor(sigmaz(), qeye(2)) 这类写法构造两比特算符,再用 expect 求期望值。纠缠源用 bell_state('00') 或手工构造 |Φ⁺⟩=(|00⟩+|11⟩)/√2,噪声则通过退极化信道或混合态 ρ=(1−p)|Φ⁺⟩⟨Φ⁺|+p·I/4 引入,p为噪声比例。
采样层的关键是把“基矢选择”和“测量结果”对应起来。一种清晰做法是:对每一对光子随机抽取a∈{0,1}、b∈{0,1},按对应算符计算联合概率 P(±1,±1),再用 numpy.random.choice 按概率抽样,累计得到计数矩阵 N(a,b,ra,rb)。当样本量达到例如20000对时,关联值 E(a,b)=[N(+,+)+N(−,−)−N(+,−)−N(−,+)]/N_total 的统计涨落约在1/√N量级,足以观察S值是否越过2。
代码结构规划
建议按“配置—物理—采样—分析—入口”五层组织,目录不必复杂,但职责要清晰:
config.py:集中存放测量算符定义、噪声参数p、样本数shots、随机种子,保证实验可复现。states.py:贝尔态制备、退极化噪声施加、密度矩阵有效性检查(迹为1、半正定)。measure.py:四个算符的构造、联合概率计算、按基矢分组的采样函数。analyze.py:由计数矩阵计算E(a,b)、S值、QBER,并输出判定结论。run_e91.py:串起“制备→加噪→采样→统计→判定”,支持命令行传入p与shots。
结果观察与判定依据
仿真跑通后,至少观察三个量:理想无噪声时S应接近2.828,若明显偏离说明算符或计数映射有误;随噪声p增大,S单调下降,当S降至2附近时纠缠已不足以支撑安全密钥;QBER在无窃听、无噪声时应接近0,随p上升而增大。工程上常把QBER约11%作为安全边界参考,S>2与QBER低于阈值需同时满足才判定链路可用。把这些量打印成表并画成S–p曲线,是验证仿真环境是否正确的最直接方式。
tensor 的顺序与Qiskit线路中qubit编号的对应关系必须在 config.py 中统一说明并固定,否则测量算符会作用到错误的比特上,表现为S值异常但代码不报错。