引言
不是每个人都能随时用真机——量子模拟器是开发、调试、教学的主力:它在经典计算机上「模拟」量子计算机的行为。本文系统讲模拟器生态:先讲最基本的状态向量模拟(为什么指数级贵、有哪些技巧),再讲噪声模拟(如何用错误模型模拟真机),接着讲密度矩阵(处理退相干)与张量网络(压缩大电路),最后给模拟器性能对比、GPU 加速与选型指南,让你在开发量子程序时用对模拟器。
前置:/quantum-qiskit-programming/(Qiskit 基础)、/quantum-qubit-gates-basics/(量子态)、/quantum-error-mitigation/(噪声模型)。
目录
- 1. 为什么要模拟:真机之外的开发利器
- 2. 状态向量模拟:指数级昂贵的基础方法
- 3. 噪声模拟:用错误模型模拟真机
- 4. 密度矩阵与测量模拟
- 5. 张量网络模拟:压缩大电路
- 6. Qiskit Aer 核心 API
- 7. 模拟器性能对比与选型
- 8. GPU 与并行加速
- 9. 模拟 vs 真机:开发的正确姿势
- 10. 速查表
- 延伸阅读
1. 为什么要模拟:真机之外的开发利器
模拟器的三大价值:
1. 开发调试:随时可跑、可检查中间态
2. 算法验证:无噪声理想结果 → 对照真机噪声
3. 教学研究:深挖量子态结构
模拟 vs 真机:
| 维度 | 模拟器 | 真机 |
|---|---|---|
| 可用性 | 随时 | 排队 |
| 噪声 | 可设 0 | 固有 |
| 中间态 | 可看 | 测量破坏 |
| 规模 | 受内存 | 受比特数 |
| 速度 | 指数慢 | 硬件快 |
心智:模拟器是「显微镜」、真机是「战场」——先在模拟器验证逻辑,再上真机验证现实。
2. 状态向量模拟:指数级昂贵的基础方法
状态向量模拟:直接存储 2^n 个振幅:
n 个比特 → 2^n 个复数振幅
n=20 → 2^20 × 16字节 ≈ 16MB
n=30 → 2^30 × 16 ≈ 16GB(内存见底)
n=40 → 16TB(普通机器不可能)
为什么指数贵:
量子叠加 = 同时表示所有状态 → 经典存储必然指数
这就是「量子优势」的另一面:模拟它很难
常用技巧:
1. 分层采样(只测感兴趣比特)
2. 稀疏表示(很多振幅为 0)
3. 尽早测量(减少活跃维度)
4. Clifford 电路用稳定子模拟(多项式快)
# 状态向量大小
n_qubits = 20
memory = 2**n_qubits * 16 # 字节
print(f"{n_qubits} 比特状态向量: {memory/1e9:.1f} GB")
记忆:状态向量模拟是 2^n 指数贵——20 比特 16MB、30 比特 16GB,这是模拟器的物理天花板。
3. 噪声模拟:用错误模型模拟真机
噪声模拟 = 在模拟器里注入错误模型——模拟真机的「不完美」:
from qiskit_aer.noise import NoiseModel
from qiskit_aer.noise import depolarizing_error, thermal_relaxation_error
# 1. 构建错误模型
noise = NoiseModel()
noise.add_all_qubit_quantum_error(
depolarizing_error(0.001, 1), ['u1','u2','u3']) # 单比特门 0.1% 错误
noise.add_all_qubit_quantum_error(
depolarizing_error(0.02, 2), ['cx']) # CNOT 2% 错误
noise.add_all_qubit_readout_error([[0.99, 0.01],[0.02, 0.98]]) # 测量错误
# 2. 用带噪声的后端跑
from qiskit_aer import AerSimulator
noisy_backend = AerSimulator(noise_model=noise)
result = execute(qc, noisy_backend, shots=8192).result()
错误模型类型:
| 错误 | 用哪个类 |
|---|---|
| 门错误(depolarizing) | depolarizing_error(p, n) |
| 退相干(T1/T2) | thermal_relaxation_error(t1, t2, gate_time) |
| 测量错误 | add_all_qubit_readout_error |
记忆:噪声模拟 = 给模拟器注入「错误模型」——单比特门、CNOT、测量三类错误都配上,模拟器就变成「虚拟真机」。
4. 密度矩阵与测量模拟
密度矩阵模拟:处理退相干与部分测量(比纯态更完整):
纯态:|ψ⟩(2^n 振幅)
混合态:密度矩阵 ρ(2^n × 2^n)→ 更大,但能表示噪声与纠缠丢失
什么时候用密度矩阵:
1. 模拟热/混合初始态
2. 部分测量后的子系统
3. 噪声过程的精确追踪
from qiskit_aer import AerSimulator
# 密度矩阵模拟(可看退相干)
backend = AerSimulator(method='density_matrix')
result = backend.run(qc).result()
dm = result.data(0)['density_matrix']
print(dm) # 对角外的非零反映纠缠/相干
测量模拟:直接看测量统计分布(qasm 模式):
# qasm 模拟器:测量 → 计数分布
backend = AerSimulator(method='qasm')
result = execute(qc, backend, shots=8192).result()
print(result.get_counts()) # {'00': 4096, '11': 4096}
记忆:密度矩阵管「混合态与退相干」、qasm 管「测量统计」——纯算法验证用 statevector、有噪声用 density_matrix。
5. 张量网络模拟:压缩大电路
张量网络(TN):把量子态表示成张量收缩网络,利用低纠缠结构压缩:
核心:很多量子态「纠缠有限」→ 可用 MPS(矩阵乘积态)近似
优势:一维/低纠缠电路可以模拟到百比特
代价:纠缠高(如 GHZ 后)则压缩失效
MPS 的核心概念:
MPS:把 2^n 振幅拆成 n 个矩阵的链
内存:O(n·χ²)(χ=截断维度)替代 O(2^n)
χ 越大越精确、越贵
工具:
# Quimb:张量网络量子模拟
import quimb
import quimb.tensor as qtn
# 构造 MPS 并压缩
state = qtn.MPS_computational_state('0'*50)
# 施加门 → 逐层收缩,控制 χ
何时用 TN:
1. 一维/浅层电路(模拟 ~50-100 比特)
2. 低纠缠区域(如绝热演化的局部态)
3. 不适合:深纠缠电路(贝尔态链、随机电路)
记忆:张量网络 = 用「低纠缠假设」把指数压成多项式——适合一维浅电路、对高纠缠失效,是模拟器的「扩展弹药」。
6. Qiskit Aer 核心 API
Aer 是 Qiskit 的高性能模拟器:
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
# 不同 method
sim = AerSimulator(method='statevector') # 纯态(默认)
sim = AerSimulator(method='qasm') # 测量统计
sim = AerSimulator(method='density_matrix') # 混合态
sim = AerSimulator(method='matrix_product_state') # MPS(大电路)
sim = AerSimulator(method='unitary') # 单位矩阵(看门矩阵)
sim = AerSimulator(method='stabilizer') # Clifford 快模拟
# 带噪声
sim = AerSimulator(noise_model=noise)
方法速查:
| method | 适用 | 规模 |
|---|---|---|
| statevector | 理想算法 | ≤30 比特 |
| qasm | 测量统计 | ≤30 |
| density_matrix | 噪声/混合 | ≤15 |
| mps | 低纠缠大电路 | 50-100 |
| stabilizer | Clifford 门 | 巨大 |
| unitary | 验证门矩阵 | 小 |
记忆:Aer 按 method 选模拟器——默认 statevector、噪声用 density_matrix、大电路用 mps、Clifford 用 stabilizer。
7. 模拟器性能对比与选型
主要模拟器对比:
| 模拟器 | 方法 | 语言 | 亮点 |
|---|---|---|---|
| Qiskit Aer | statevector/TN/GPU | C++ | 生态全 |
| QuEST | 高性能 statevector | C | 极快 |
| qsim | Google 模拟器 | C++ | 并行好 |
| Quimb | 张量网络 | Python | 灵活 |
| cirq simulator | statevector | C++ | TensorFlow 集成 |
选型指南:
小电路(≤20 比特)调试:Qiskit Aer(生态最顺)
大理想电路:QuEST / qsim(C++ 快)
低纠缠大电路:Quimb MPS
Clifford 电路:stabilizer method
GPU 需求:Aer GPU / qsim GPU
记忆:生态看 Aer、性能看 QuEST/qsim、张量网络看 Quimb、Clifford 用 stabilizer——需求不同选型不同。
8. GPU 与并行加速
模拟器是「内存带宽密集」——GPU 并行能大幅提速:
状态向量更新 = 矩阵乘向量 → 天然适合 GPU
GPU 可模拟更大规模(显存替代内存)
Aer GPU 模式:
from qiskit_aer import AerSimulator
# 启用 GPU(需安装 qiskit-aer-gpu)
sim = AerSimulator(method='statevector', device='GPU')
# 并行线程
sim = AerSimulator(max_parallel_threads=8, max_parallel_shot=8192)
并行维度:
1. 多线程(CPU 核并行)
2. 多 shot 并行(采样并行)
3. GPU(CUDA 加速矩阵运算)
记忆:模拟加速三板斧——多线程、多 shot 并行、GPU——显存大就上 GPU,规模立刻翻倍。
9. 模拟 vs 真机:开发的正确姿势
开发工作流的正确姿势:
1. 模拟器验证算法逻辑(理想结果)
2. 噪声模拟预测真机表现(带错误模型)
3. 小电路上真机实测(真实噪声)
4. 缓解/优化对比(见错误缓解)
对照技巧:
# 同一电路:理想 vs 噪声 vs 真机
ideal_counts = execute(qc, AerSimulator(), shots=8192).result().get_counts()
noise_counts = execute(qc, AerSimulator(noise_model=noise), shots=8192).result().get_counts()
real_counts = sampler.run([qc], shots=8192).result().get_counts()
# 三层对照 → 定位「算法问题」还是「硬件问题」
记忆:开发三部曲——理想模拟 → 噪声模拟 → 真机——用三层对照把「算法 bug」和「硬件噪声」分开。
10. 速查表
| 需求 | 做法 |
|---|---|
| 理想算法验证 | AerSimulator(method='statevector') |
| 测量统计 | method='qasm' |
| 噪声模拟 | NoiseModel + AerSimulator(noise_model) |
| 混合态 | method='density_matrix' |
| 大电路 | method='matrix_product_state' |
| Clifford | method='stabilizer' |
| GPU 加速 | device='GPU' |
| 性能选型 | 小用 Aer、大用 qsim/QuEST |
| 张量网络 | Quimb MPS |
| 开发流程 | 理想 → 噪声 → 真机三层对照 |
一句话记忆:模拟器是量子开发的显微镜——statevector 管理想算法、density_matrix 管噪声混合、MPS 管大电路低纠缠、stabilizer 管 Clifford;噪声模拟用错误模型造「虚拟真机」;性能选型看生态与规模、GPU 提速靠显存;开发先理想再噪声再真机三层对照——模拟器玩得转,量子程序写得稳。
延伸阅读
- /quantum-qiskit-programming/ — Qiskit 编程实战
- /quantum-qubit-gates-basics/ — 量子态与测量
- /quantum-error-mitigation/ — 噪声模型与缓解
- /quantum-circuit-optimization/ — 编译与深度
- /quantum-algorithms-advanced/ — 算法验证场景
- [[hpc]] — GPU 并行计算
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。