2. 量子计算实验环境搭建
要完成第一个可复现的量子电路实验,环境搭建不是“装个库跑一下”这么简单。可复现意味着:同一份电路代码、同一组依赖版本、同一套随机种子,在任何一台机器上都能得到统计上一致的结果。本节围绕本地模拟器、云量子平台、版本管理工具与依赖锁定四个对象,搭建一条从代码到结果的最小可复现链路,并实际跑通一个两比特纠缠电路。
一、三类运行环境的分工
量子程序通常有三种执行后端:本地状态向量模拟器、云端模拟器、云端真实量子处理器。本地模拟器(如 Qiskit Aer、Cirq Simulator)在 CPU 上直接计算态矢量,适合小比特数、高频次调试;云端模拟器(如 IBM Quantum 的 simulator 后端)算力更强,可跑更大规模电路;真实量子硬件则用于验证噪声下的实际行为。三者的接口往往一致,差别在于后端名称、排队时间和噪声模型。
可复现实验的关键在于:把“电路定义”与“执行后端”解耦。电路用同一份代码描述,后端通过参数切换。这样本地调试通过的电路,可以原样提交到云端,只需替换后端对象。
二、本地模拟器:最小可运行环境
以 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 |
| 采样次数 | 明确 shots | 1000 |
| 结果归档 | JSON + Git 提交 | results/bell_20240601.json |
完成以上步骤后,你就拥有了第一个可复现的量子电路实验:一份锁定依赖的 requirements.txt、一段固定种子的 Bell 态代码、一份带后端信息的 counts 记录,以及对应的 Git 提交。后续所有实验都可以沿用这套骨架,只需替换电路与后端参数。