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 风格。建议先精通一个,再对照理解另一个。

量子计算环境链路与首个电路执行流程 本地环境 Python 3.10+ / venv Jupyter Notebook 框架层 Qiskit + Aer Cirq(对照) 电路构建 QuantumCircuit(1,1) H 门 → 叠加态 执行后端 AerSimulator shots=1024 电路: q0 |0⟩ H M → 经典比特 c0 测量统计(示例) counts ≈ {'0': 508, '1': 516} 比例接近 1:1,验证叠加态 异常判据 比例严重偏离 → 检查门序列 Statevector 报错 → 移除测量

五、常见问题与排查

环境搭建阶段最容易卡在三处:一是 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 --version3.10~3.12
Qiskit 可用import qiskit无报错,打印版本号
Aer 模拟器from qiskit_aer import AerSimulator导入成功
Cirq 可用import cirq导入成功
绘图依赖qc.draw('mpl')输出电路图
Jupyter 内核Notebook 中 import qiskit与终端一致