2. 量子计算实验环境搭建

要完成第一个可复现的量子电路实验,环境搭建不是“装个库跑一下”这么简单。可复现意味着:同一份电路代码、同一组依赖版本、同一套随机种子,在任何一台机器上都能得到统计上一致的结果。本节围绕本地模拟器、云量子平台、版本管理工具与依赖锁定四个对象,搭建一条从代码到结果的最小可复现链路,并实际跑通一个两比特纠缠电路。

一、三类运行环境的分工

量子程序通常有三种执行后端:本地状态向量模拟器、云端模拟器、云端真实量子处理器。本地模拟器(如 Qiskit Aer、Cirq Simulator)在 CPU 上直接计算态矢量,适合小比特数、高频次调试;云端模拟器(如 IBM Quantum 的 simulator 后端)算力更强,可跑更大规模电路;真实量子硬件则用于验证噪声下的实际行为。三者的接口往往一致,差别在于后端名称、排队时间和噪声模型。

可复现实验的关键在于:把“电路定义”与“执行后端”解耦。电路用同一份代码描述,后端通过参数切换。这样本地调试通过的电路,可以原样提交到云端,只需替换后端对象。

量子实验环境:代码—依赖—后端—结果 可复现链路 电路源码 bell.py H + CNOT + measure 依赖锁定 requirements.txt qiskit==1.0.2 numpy==1.26.4 Git 版本管理 commit + tag 执行后端 AerSimulator (本地) cloud_simulator real_qpu (含噪声) 测量结果 counts: {00:498, 11:502} seed = 42 shots = 1000 版本约束 快照 可复现三要素 1. 依赖锁定:精确版本号,避免库升级导致 API 变化 2. 随机种子:transpile(seed) 与 run(seed) 固定 3. 后端声明:记录 backend.name() 与 shots 数 → 三者一致时,counts 分布可稳定复现

二、本地模拟器:最小可运行环境

以 Qiskit 为例,推荐使用虚拟环境隔离依赖。创建环境并安装锁定版本:

python -m venv qenv
source qenv/bin/activate        # Windows: qenv\Scripts\activate
pip install qiskit==1.0.2 qiskit-aer==0.14.1
pip freeze > requirements.txt

这里 qiskit-aer 提供本地高性能模拟器。pip freeze 把当前所有包及其精确版本写入 requirements.txt,这就是依赖锁定的最小形式。之后任何人执行 pip install -r requirements.txt,都会得到完全相同的库版本。

接着编写第一个电路。目标是制备 Bell 态 (|00⟩+|11⟩)/√2,测量后应只出现 00 和 11 两种结果,各约一半。

from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator

qc = QuantumCircuit(2, 2)
qc.h(0)          # 对 qubit 0 施加 H 门
qc.cx(0, 1)      # CNOT 控制位 0,目标位 1
qc.measure([0, 1], [0, 1])

sim = AerSimulator()
compiled = transpile(qc, sim, seed_transpiler=42)
result = sim.run(compiled, shots=1000, seed_simulator=42).result()
print(result.get_counts())

关键参数有三个:shots=1000 决定统计样本量;seed_transpiler=42 固定编译阶段的随机映射;seed_simulator=42 固定采样随机数。三者固定后,同一台机器上重复运行会得到完全相同的 counts。示例输出形如 {'00': 498, '11': 502},两态接近 1:1,说明纠缠制备正确。

若结果中出现 01 或 10,说明 CNOT 控制关系或比特映射有误,应检查 qc.cx(0,1) 的参数顺序与测量映射。

三、云量子平台:从本地到远程

云平台(如 IBM Quantum)的使用流程是:注册账号获取 API Token → 本地保存凭证 → 选择后端 → 提交作业。凭证通过 QiskitRuntimeService.save_account(channel="ibm_quantum", token="...") 保存到本地配置文件,之后代码中无需硬编码 Token。

提交时把本地模拟器对象替换为云端后端:

from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
sampler = SamplerV2(mode=backend)
job = sampler.run([compiled], shots=1000)
print(job.result()[0].data.c.get_counts())

真实硬件上,由于退相干和门误差,counts 不会像模拟器那样干净,可能出现少量 01/10。判断实验是否成功,应看 00 与 11 是否仍占主导(例如合计超过 90%),而不是要求零噪声。这正是本地模拟器与真实后端的分工:本地验证逻辑正确性,云端评估噪声影响。

四、版本管理与依赖锁定

可复现的另一个支柱是代码版本。建议目录结构如下:

quantum-lab/
├── bell.py
├── requirements.txt
├── environment.yml      # 可选,conda 环境
└── results/
    └── bell_20240601.json

每次实验后,把 counts、后端名称、shots、种子写入 results/ 下的 JSON 文件,并执行 git add . && git commit -m "bell state, seed=42"。这样每个结果都能追溯到确切的代码与依赖版本。若使用 conda,可用 conda env export > environment.yml 导出包含 Python 版本在内的完整环境。

不要只写 qiskit 而不写版本号。Qiskit 1.x 与 0.x 的 API 差异很大,execute() 在 1.0 后已被移除,未锁定版本会导致旧代码直接报错。

五、可复现检查清单

检查项要求示例
依赖版本精确到补丁号qiskit==1.0.2
随机种子编译与采样均固定seed=42
后端记录名称与类型AerSimulator / real_qpu
采样次数明确 shots1000
结果归档JSON + Git 提交results/bell_20240601.json

完成以上步骤后,你就拥有了第一个可复现的量子电路实验:一份锁定依赖的 requirements.txt、一段固定种子的 Bell 态代码、一份带后端信息的 counts 记录,以及对应的 Git 提交。后续所有实验都可以沿用这套骨架,只需替换电路与后端参数。