1. 量子计算项目环境搭建
量子计算程序与经典程序最大的差别,不在于语法,而在于运行位置:经典代码在本地 CPU 上执行,量子代码则必须把电路编译成目标后端能识别的指令,再提交到模拟器或真实量子设备上执行。因此,环境搭建的目标不是"装几个库",而是打通一条从本地代码到量子执行结果的完整链路。本章以 Qiskit 为主线,同时说明 Cirq 的安装与差异,并完成第一个可运行、可可视化的量子电路。
一、环境选型与安装
推荐使用 Python 3.10~3.12 配合虚拟环境,避免不同项目的依赖互相污染。Qiskit 自 1.0 起采用模块化拆分,核心包 qiskit 已包含 Terra(电路构建与编译)、Aer(高性能模拟器)等常用组件,无需再单独安装 qiskit-aer。Cirq 则是 Google 生态的独立框架,两者可以共存于同一环境。
# 创建并激活虚拟环境
python -m venv qc-env
# Windows: qc-env\Scripts\activate
source qc-env/bin/activate
# 安装 Qiskit 与 Cirq
pip install qiskit qiskit-aer
pip install cirq
# 安装 Jupyter 与可视化依赖
pip install notebook matplotlib pylatexenc
# 验证版本
python -c "import qiskit; print(qiskit.__version__)"
其中 pylatexenc 常被忽略,但它是 Qiskit 绘制电路图(circuit.draw('mpl'))的依赖,缺失时会报错。安装完成后启动 jupyter notebook,浏览器会自动打开工作目录。
二、第一个量子电路:叠加态与测量
量子电路的基本单位是量子比特(qubit),初始态默认为 |0⟩。对单个量子比特施加 Hadamard 门(H 门),会把它变成 |0⟩ 与 |1⟩ 的等幅叠加态;随后测量,会以约 50% 的概率坍缩到 0 或 1。这正是量子随机性的来源,也是后续所有算法的起点。
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
# 1 个量子比特,1 个经典比特
qc = QuantumCircuit(1, 1)
qc.h(0) # 施加 H 门,制备叠加态
qc.measure(0, 0) # 测量并写入经典比特
print(qc.draw()) # 文本电路图
sim = AerSimulator()
result = sim.run(qc, shots=1024).result()
counts = result.get_counts()
print(counts) # 例如 {'0': 512, '1': 512}
运行后 counts 会给出类似 {'0': 508, '1': 516} 的结果。由于模拟器使用伪随机数,每次数值略有波动,但两者比例应接近 1:1。若结果明显偏离(例如 900:124),需要检查是否误加了其他门,或测量映射写错。
三、结果可视化
Qiskit 提供多种可视化方式:qc.draw('mpl') 绘制彩色电路图,plot_histogram(counts) 绘制测量统计直方图,plot_bloch_multivector(state) 则展示量子态在布洛赫球上的位置。对于 H 门后的单比特,布洛赫矢量应指向赤道面,直观说明"既不是 0 也不是 1"。
from qiskit.visualization import plot_histogram
plot_histogram(counts)
from qiskit.quantum_info import Statevector
sv = Statevector.from_instruction(qc.remove_final_measurements(inplace=False))
print(sv) # Statevector([0.707+0j, 0.707+0j])
注意:Statevector 只能用于无测量的纯态电路,因此需要先移除测量指令。这是初学者常见的报错来源。
四、Cirq 的对照写法
Cirq 的抽象方式略有不同:它显式区分"量子比特对象"和"电路",测量用 cirq.measure,模拟用 cirq.Simulator。同样的 H 门实验在 Cirq 中写作:
import cirq
q = cirq.LineQubit(0)
circuit = cirq.Circuit(cirq.H(q), cirq.measure(q, key='m'))
print(circuit)
sim = cirq.Simulator()
res = sim.run(circuit, repetitions=1024)
print(res.histogram(key='m'))
两者概念一一对应,但 Qiskit 更强调"电路—后端—作业"的提交模型,Cirq 更贴近"线路即对象"的 Python 风格。建议先精通一个,再对照理解另一个。
五、常见问题与排查
环境搭建阶段最容易卡在三处:一是 ModuleNotFoundError: qiskit_aer,说明只装了 qiskit 而漏装 Aer,执行 pip install qiskit-aer 即可;二是绘图报 pylatexenc 缺失,按前文补装;三是 Jupyter 内核与虚拟环境不一致,表现为 import qiskit 在终端成功、在 Notebook 失败,此时需在虚拟环境中执行 python -m ipykernel install --user --name qc-env,再在 Notebook 中切换内核。
requirements.txt,固定 qiskit==1.x、qiskit-aer、cirq 的版本号,便于复现环境。量子框架迭代较快,跨版本 API 变动(如 execute() 被 backend.run() 取代)是常见坑点。六、环境自检清单
| 检查项 | 命令/操作 | 预期结果 |
|---|---|---|
| Python 版本 | python --version | 3.10~3.12 |
| Qiskit 可用 | import qiskit | 无报错,打印版本号 |
| Aer 模拟器 | from qiskit_aer import AerSimulator | 导入成功 |
| Cirq 可用 | import cirq | 导入成功 |
| 绘图依赖 | qc.draw('mpl') | 输出电路图 |
| Jupyter 内核 | Notebook 中 import qiskit | 与终端一致 |