1. 课程导入与全景认知
量子计算程序从一行代码到一次真实测量,中间要经过一条相当长的链路。初学者最容易产生的误解,是把“在本地跑通一个量子线路”等同于“在量子计算机上跑通同一个线路”。事实上,这两件事在输入形式、执行机制、误差来源、结果含义和成本结构上都存在系统性差异。本课程的核心任务,就是把这套差异讲清楚,并让你具备在模拟器与真实硬件之间做选择、做迁移、做结果判读的能力。
一、两个概念:模拟与执行分别指什么
量子线路模拟,是用经典计算机(CPU/GPU)上的线性代数运算,去复现量子态在门作用下的演化。一个 n 量子比特的纯态可以用 2ⁿ 个复数振幅表示,单比特门作用于某个比特,等价于对振幅向量做一次成对的分块矩阵乘法;双比特门则涉及更复杂的索引配对。模拟器本质上是在经典内存里维护这个振幅向量,并按门序列逐步更新它。
量子硬件执行,是把同一个线路编译成目标设备能识别的脉冲或指令序列,在超导、离子阱、中性原子或光量子等物理载体上真正施加操作,最后通过测量读出经典比特串。此时量子态由物理系统本身承载,经典计算机只负责编译、调度和读取结果。
两者的共同点是:都接受同一套线路描述(如 OpenQASM 或 Qiskit 的 QuantumCircuit 对象),都输出测量计数。差异则集中在“谁来承载量子态”这一点上,并由此衍生出下面几个维度。
二、差异维度:一张全景对照
理解差异不能停留在“模拟是假的、硬件是真的”这种粗糙判断上。真正影响你工程决策的,是下面这些可量化的维度:
- 可扩展规模:模拟器的振幅向量随比特数指数增长。n=30 时约需 16 GB 内存(双精度复数),n=40 已超出单机能力;而硬件比特数是物理固定的,当前主流设备在几十到几百比特量级。
- 噪声模型:模拟器默认理想无噪声,也可注入自定义噪声模型;硬件噪声是内生的,包括退相干、门错误、读出错误、串扰。
- 可重复性:模拟器给定随机种子后完全可复现;硬件每次运行都受环境漂移影响,同一线路多次提交结果会有波动。
- 成本与排队:模拟器消耗本地算力,几乎零边际成本;硬件执行按 shot 计费,且需要排队等待调度。
- 可观测性:模拟器可直接读取完整态向量、密度矩阵、任意可观测量期望值;硬件只能通过多次测量统计估计,无法直接看到态。
- 可用门集:模拟器支持任意酉门;硬件只支持原生门集(如超导的 {RZ, SX, X, CZ} 或 {RZ, RX, CZ}),其他门必须编译分解。
这些维度不是并列的,它们之间存在因果链:正因为硬件只支持原生门集,才需要编译与映射;正因为有映射和噪声,才需要读出纠错与误差缓解;正因为只能统计测量,才需要 shot 数与置信区间的考量。下面的 SVG 把这条链路和两类执行路径放在同一张图上,便于建立整体印象。
三、学习路线:从模拟到硬件的四步走
本课程建议按“先模拟、后硬件、再对比”的顺序推进,具体分为四个阶段。
第一阶段:建立线路与态的基本直觉。用模拟器跑通 Bell 态、GHZ 态、量子傅里叶变换等小规模线路,直接打印态向量,观察振幅的相位与模长如何随门变化。这一阶段的目标不是算得快,而是看得见。
第二阶段:引入噪声与误差。在模拟器中加载噪声模型(如 depolarizing error、thermal relaxation),对比理想结果与含噪结果的保真度差异。你会第一次看到“同样的线路,为什么结果不再干净”。
第三阶段:迁移到硬件。把同一线路提交到真实后端,观察编译前后的线路深度变化、映射后的物理比特、以及读出错误对计数分布的影响。此时需要引入误差缓解手段,如读出校正矩阵、零噪声外推(ZNE)。
第四阶段:做对比与决策。针对具体任务,判断该用模拟器还是硬件。例如验证算法逻辑、调试线路结构,优先用模拟器;评估真实设备性能、做基准测试,必须用硬件。
四、工具链概览
当前主流工具链可以按“线路构建—模拟—编译—硬件执行—结果分析”五层来理解。线路构建层常用 Qiskit、Cirq、PennyLane;模拟层有 Qiskit Aer、Cirq Simulator、QuEST、cuQuantum;编译层包括 Qiskit Transpiler、tket;硬件执行层通过各家云平台(IBM Quantum、Amazon Braket、Azure Quantum)提交;结果分析层则依赖 Qiskit Experiments、Mitiq 等做误差缓解与统计。
下面给出一个最小可运行示例,用 Qiskit 构建 Bell 态并在模拟器上采样。注意 shot 数与随机种子的设置,它们直接决定结果的可复现性。
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
qc = QuantumCircuit(2, 2)
qc.h(0) # 对 qubit 0 施加 Hadamard 门
qc.cx(0, 1) # CNOT 纠缠
qc.measure([0, 1], [0, 1])
sim = AerSimulator()
compiled = transpile(qc, sim)
result = sim.run(compiled, shots=4096, seed_simulator=42).result()
counts = result.get_counts()
print(counts) # 预期近似 {'00': 2048, '11': 2048}
运行后你会看到 00 与 11 各占约一半,01 与 10 几乎为零。这个“几乎为零”正是理想模拟的特征;若换到真实硬件,01 与 10 会出现不可忽略的比例,那部分就是噪声与读出错误的贡献。
shots 改为 100、1000、10000 各跑一次,观察计数比例的波动如何随 shot 数减小。这是理解“统计估计”与“精确值”区别的最直接方式。五、本课程要解决的问题
学完本课程,你应当能够回答三类问题:第一,给定一个线路,它在模拟器上的理想输出是什么,在硬件上可能偏离多少;第二,当硬件结果不理想时,问题出在编译映射、门错误、读出错误还是 shot 数不足;第三,面对一个新任务,如何选择模拟或硬件,并给出合理的参数配置与结果判读依据。接下来的章节将围绕这三类问题逐步展开。