QUANTUM COMPUTING · HANDS-ON TRACK

量子计算实作进阶:从模拟器到真实实验

Quantum Computing Practicum: From Simulator to Experiment

理论 21 天之后,用代码把“理解”变成“可运行、可测试、可解释”。当前开放 statevector、线路 IR、Deutsch–Jozsa/Grover、QFT/相位估计、N=15 周期骨架、噪声/重复码、VQE、QAOA 与 Qiskit 编译工作流;真实 QPU 作业由用户在自己的 Qiskit 环境中选择执行。

当前页面的模拟完全在浏览器本地运行;不需要账户、API key 或量子硬件。

完成实作阶段后,目标是做到什么

自己实现小型模拟器

理解复振幅数组、单比特门、受控门、测量采样与 O(2ⁿ) 状态存储的边界。

实现并验证典型算法

路线覆盖 Deutsch–Jozsa、Grover、QFT/相位估计、Shor 小规模示例、VQE 与 QAOA;以基准态、理论分布和经典结果交叉测试。

走通工程与实验闭环

学习噪声与基础纠错、Qiskit 构建和编译;再把理想模拟、含噪模拟与可选 QPU 结果放在一起分析。

能力边界:这是一条进阶实作路线,不保证仅凭阅读就达到独立研究水平。Day 1–8 教学材料和本地演示已完成;真实 QPU 作业需用户自行安装 Qiskit、管理服务商账户/凭据、选择真实后端并承担费用/排队限制,本网站不会上传凭据或声称代为运行硬件。

实作路线图:先造工具,再做算法

已开放

第 1 天|statevector 模拟器

复数振幅、H/X/Z/Ry、CNOT、规范化、固定种子测量与单元测试。

已开放

第 2 天|线路 IR 与测试

加入门序列、受控旋转、位序约定、测量映射、Bell 态与性质测试。

已开放

第 3 天|Deutsch–Jozsa 与 Grover

从 oracle 到目标概率,写小规模穷举基准,检查查询轮数和过冲。

已开放

第 4 天|QFT、相位估计与 Shor 周期

实现小位宽 QFT / 逆 QFT,比较精确相位与网格外相位;用理想化本征相位模型探索 N=15 周期和经典后处理。

已开放

第 5 天|噪声与重复码

加入退相位、振幅弛豫与读出错误,跑三比特重复码综合征;区分缓解、纠错与后选择。

已开放

第 6 天|VQE 与经典优化循环

用小型 Hamiltonian、参数化线路、期望值测量和经典优化器,比较精确基态、shot 噪声与优化稳定性。

已开放

第 7 天|QAOA 与 Max-Cut

把三角形 Max-Cut 写成代价 Hamiltonian,运行 p=1 交替算子线路,观察切分分布并与经典穷举最优值比较。

已开放 · 当前实验

第 8 天|Qiskit、编译与 QPU 工作流

查看 Qiskit 本地构建/编译的可复现命令,交互比较逻辑线路与受限拓扑上的 SWAP 路由;真实云硬件提交仅提供用户侧步骤,不伪造任务或结果。

第 1 天实验|亲手运行一个 statevector

模拟器用长度为 2ⁿ 的复数向量保存 n 个量子比特的振幅。下方使用两比特电路:先施加 H,再施加 CNOT,就会得到 Bell 态;你可以逐个加门,查看振幅、概率并做固定种子采样。

门操作(约定 q0 是最低有效位)

状态向量与概率


          
测量只抽样,不会修改这里的理论状态。每次加门都会从 |00⟩ 重放整条门序列;“运行测量”使用指定随机种子,因此相同线路、shots 和种子会得到相同计数。

第 2 天实验|线路 IR、受控旋转与测量位序

线路中间表示(IR)把“要执行哪些门、按什么顺序执行”保存成数据,再从 |00⟩ 重放。测量映射则明确指定经典位 cᵢ 记录哪个量子位;下面可构建门序列、检查 IR,并对照两种位序下的测量结果。

添加门(q0 为最低有效位)

线路 IR 与状态


          

        

位序要点:映射数组第 i 项表示 cᵢ ← q[mapping[i]]。因此 [0,1] 时 c0 取 q0、c1 取 q1;结果字符串按 c1c0 显示。Bell 态对换位序后仍是 00/11;用 X(q0) 制备 |01⟩ 才能直观看到映射改成 [1,0] 后显示为 |10⟩。

练习与自动性质检查

  1. 依次添加 H(q0)、CNOT(q0,q1),检查 IR 顺序与 Bell 态概率;清空后添加 X(q0),切换测量映射,观察 |01⟩ 与 |10⟩ 的标签变化。
  2. 先加 X(q0),将 CRy 角度设为 π,再添加 CRy(q0,q1);控制位为 1 时,目标位应从 0 旋转到 1,得到 |11⟩。
  3. 运行自动化性质测试:对固定种子生成的 80 组随机小线路,逐条检查范数为 1、映射概率和为 1、shots 总数守恒且采样可复现。

第 3 天实验|Deutsch–Jozsa 与 Grover 搜索

两个算法都用黑盒 oracle 学习查询复杂度,但问题不同:Deutsch–Jozsa 在“常量或平衡”的 promise 下分类函数;Grover 为未排序搜索放大目标态振幅。下方运行的是可检查门序列的 2 输入位 / 4 项小型理想 statevector 实验,不是硬件运行,也不代表量子计算对所有任务都有指数加速。

A. Deutsch–Jozsa:先检查 promise,再看干涉

函数 oracle 实现 |x,y⟩ → |x, y XOR f(x)⟩。辅助位先制备为 |−⟩,让函数值变成相位;末尾对输入位做 H。若 f 为常量,测得输入 00;若 f 平衡,00 的概率为零。这个“1 次量子 oracle 查询 vs 最坏 3 次经典确定性查询”只针对两输入位且保证属于 promise 集的查询模型。

真值表、查询基准与线路摘要


        

B. Grover:目标振幅放大与迭代过冲

四个候选态中标记一个,初态均匀叠加。每轮由 phase oracle 和 diffuser 组成;目标概率理论上为 sin²((2k+1)θ),其中 sin²θ=1/4。此 N=4 示例 k=1 恰好达到 100%;k=0 仅 25%,继续到 k=2 又降至 25%,展示离散迭代的过冲。一般搜索需按目标数量选择轮数,不能把本例的一轮当作通用规则。

理论概率、门数与采样结果


        

实验边界:oracle 已编译成当前模拟器支持的 H/X/CNOT 门,显示的线路门数不包含噪声、硬件路由或编译开销;此处“查询次数”按 oracle 使用次数计,不等同于基础门数。全部计算在浏览器本地完成,采样是固定种子伪随机模拟。

练习与验收

  1. 逐个切换 5 个 DJ oracle,检查每个真值表是不是常量或平衡;常量应只测得 00,平衡应完全排除 00。
  2. 把 Grover 迭代设为 0、1、2,观察目标概率 25% → 100% → 25%,再更换目标态确认位序约定无关。
  3. 改变 shots 与 seed:理论概率不变,样本计数总和应等于 shots;相同参数应可复现。
  4. 解释为何 DJ 的查询分离依赖 promise,以及为何 Grover 继续迭代会过冲;对一般 N 用 sin²θ=M/N 推导合适的轮数。

第 4 天实验|QFT、相位估计与 N=15 周期寻找

QFT 把基态索引编码为相位斜坡;逆 QFT 把相位转回可测频率。本实验使用 q0 为最低有效位、最多 5 个量子位,直接构造受控相位门序列,并以正逆变换回到输入态作为校验。所有结果都是浏览器本地的理想 statevector 模拟。

A. QFT / 逆 QFT:检查振幅与往返误差

输出分布与门序列


        

B. 相位估计:精确网格与 off-grid 相位

用 4 个估计位构造相位回踢,再施加逆 QFT。可输入相位 φ∈[0,1):当 φ=k/16 时理论结果集中在 k;偏离 1/16 网格时概率会展宽。这里的本征相位是直接编码到估计寄存器的可控模型,不包含通用目标寄存器或真实模乘 oracle。

相位分辨率、概率峰与门序列


        

C. Shor 骨架:N=15 的周期与经典因子后处理

选择与 15 互素的底数 a,查看相位测量 y/16 的连分数分母候选;经典端验证 aʳ mod 15=1,再在 r 为偶数且 a^(r/2)≠−1 mod 15 时计算 gcd(a^(r/2)±1,15)。y=0、分母不可靠或因子条件失败都要重试。为控制范围,本演示用经典枚举得到参考周期,并将该周期的本征相位等权混合后送入 4 位 QPE;这不是完整可逆模指数电路,也不是 Shor 量子加速或 QPU 运行。非互素底数会由经典 gcd 预检直接给出因子。

测量结果、连分数与重试判据


        

验收练习:验证 3 位 QFT 后接逆 QFT 回到 |x⟩;用 φ=5/16 检查只出现 y=5,用 φ=0.30 观察主峰向 y=5 附近展宽;运行 a=2 与 a=4 比较恢复 r=4、r=2 及因子 3、5;再用 a=3 解释 gcd 预检为何已足够。QPE 的 shot 采样与 Shor 模型均固定种子、完全本地执行。

第 5 天实验|噪声通道、三比特重复码與后选择

对三物理比特编码态逐次采样独立 X 翻转、Z 退相位、振幅弛豫与经典读出错误。可以切换 bit-flip 码(|000⟩/|111⟩)和 phase-flip 码(|+++⟩/|---⟩),看综合征如何定位单个可纠错误;比较未经处理的逻辑读出、综合征纠正和只保留零综合征的后选择。这里是独立噪声的 Monte Carlo 轨迹模型,不含门故障、泄漏、相关噪声或完整容错架构。

原始结果、综合征与三种处理


        

判读要点:综合征 s₀=q₀⊕q₁、s₁=q₁⊕q₂;01、11、10 分别指向 q₀、q₁、q₂ 单错。纠错是按综合征主动翻转相应物理位;后选择只丢弃非零综合征样本,会降低有效样本数但不能发现 000→111 这种零综合征逻辑错;读出错误也会污染综合征。重复码只能纠正所选基底中的单一 Pauli 翻转,另一类 Pauli 错误可能成为逻辑错误。

第 6 天实验|VQE、Pauli 测量与经典优化

变分量子本征求解器(VQE)在参数化线路中制备 |ψ(θ,φ)⟩,分别估计 Hamiltonian 各 Pauli 项的期望值,再由经典优化器调整参数。这里使用两比特各向同性 Heisenberg 模型 H = ½(XX + YY + ZZ):已知精确基态是单重态,能量 −1.5;本实验的小型 ansatz 可以到达该状态,方便检查测量和优化是否正确。

线路顺序为 X(q0) → Ry(q1, θ) → CNOT(q1→q0) → Rz(q1, φ)。q0 是最低有效位。θ=π/2、φ=π 时制备单重态(忽略全局相位)。每个 Pauli 项使用独立测量基底,每项采样 shots 次,所以总采样数为 3×shots。

精确期望、shot 估计与优化轨迹


        

模型与优化边界:精确基态能量 −1.5 来自这个两比特 Hamiltonian 的解析谱,不是量子硬件测得。有限 shots 分别采样 XX、YY、ZZ,因此能量估计有统计误差。演示中的参数移步梯度由本地精确 statevector 期望计算,采样能量只作并列对照、没有反馈到参数更新;真实 VQE 会受有限 shots、噪声、ansatz 表达能力、优化器与设备编译影响。

第 7 天实验|QAOA 与三角形 Max-Cut

最大割(Max-Cut)把图的顶点分到两组,目标是让尽可能多的边跨越两组。此处固定三节点三角形,三条边为 (0,1)、(1,2)、(0,2)。用 bᵢ∈{0,1} 表示分组,经典代价为 C(b)=Σ(bᵢ XOR bⱼ),对应的量子代价 Hamiltonian 为 HC=Σ(1−ZᵢZⱼ)/2;三角形无法二分,经典穷举最大割为 2 条边。

p=1 QAOA 先制备均匀叠加态,再交替施加代价演化 UC(γ)=e−iγHC 与混合演化 UB(β)=e−iβ(X₀+X₁+X₂),最后测量位串。模拟器把每条边的代价门分解为 CNOT—Rz(−γ)—CNOT(忽略全局相位),混合层对每位使用 Rx(2β)。显示位串按 q₂q₁q₀ 排列,q0 是最低有效位。

理想分布、shots 与经典基准


        

实验边界:图、线路只有 3 个量子位,statevector 与全部 8 个切分都可经典穷举。参数优化按钮是在 CPU 上做二维均匀网格搜索,目标函数取精确理想 statevector 期望,shots 仅采样最后选出的线路;这不是量子硬件运行、不是有限-shot 反馈优化,也不是量子加速证据。网格分辨率会影响得到的参数精度。

第 8 天实验|Qiskit 构建、transpile 与可选 QPU

Qiskit 工作流通常分为:构造 QuantumCircuit → 选择 backend/目标指令集 → transpile(门分解、布局、路由、优化)→ 在本地模拟器或真实 backend 上 run → 记录 backend 名称、shots、作业 ID 与结果。编译不是单纯“缩短门数”:受限耦合图会触发 SWAP 路由,优化级别和初始布局也会改变结果。下方线路拓扑动画是教学模型;后面列出可由用户在自己的 Qiskit 环境运行的 API 轮廓。

逻辑线路与教学路由摘要


        

用户侧 Qiskit 本地示例

在独立 Python 环境安装兼容版本的 Qiskit(例如 python -m pip install qiskit qiskit-aer),保存以下脚本后运行。模拟器由本地安装提供,不会创建云作业;执行前请根据安装版本核对 import 和 API 文档。

from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator

qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])

backend = AerSimulator()
compiled = transpile(qc, backend=backend, optimization_level=1, seed_transpiler=7)
result = backend.run(compiled, shots=1024, seed_simulator=2026).result()
print("depth", compiled.depth(), "ops", compiled.count_ops())
print(result.get_counts())

可选:由用户自行提交真实 QPU 作业

  1. 依量子服务商官方文档创建账户,把凭据存入本机环境变量或官方凭据存储;不要把 token 写进网页、仓库或聊天内容。
  2. 查看当前 Qiskit provider 插件的文档,确认账户初始化、后端名称、可用位数、原生门、耦合图和作业 API;不同服务商接口并不相同。
  3. 先将同一 QuantumCircuit transpile 到所选 backend,记录 seed_transpiler、optimization_level、初始布局、输出深度、门数和 SWAP 数。
  4. 调用该 provider 的公开 run / Sampler API 提交有限 shots;安全保存 job ID,完成后取回 counts,同时记录后端校准与作业时间。
  5. 把实测分布与理想模拟、有限 shots 统计区间和本地噪声模型对照,区分采样波动、门/读出误差与漂移。

真实硬件边界:本网页不包含 provider SDK、凭据输入或网络作业提交,也不显示虚构的 backend、校准值、job ID 或 QPU counts。拓扑路由结果只是固定简化规则的概念演示,并非 Qiskit transpile 输出;请勿把教学 SWAP 数当成真实编译结果。

核心实现:只更新目标位对应的振幅对

把基态编号 x 写成二进制,目标量子位 q 对应掩码 2^q。当该位为 0 时,和翻转该位后的基态组成一对;对这两个振幅应用 2×2 门矩阵即可,不需要建立庞大的 2ⁿ×2ⁿ 全局矩阵。

mask = 1 << target
for basis in 0 .. 2^n - 1:
    if basis & mask == 0:
        partner = basis | mask
        a0, a1 = state[basis], state[partner]
        state[basis]   = m00*a0 + m01*a1
        state[partner] = m10*a0 + m11*a1
检查项怎样验证
归一化每次幺正门后,所有振幅模方之和 Σ|αₓ|² = 1;浮点误差使用容差比较。
已知态验证 X|0⟩=|1⟩、H|0⟩=(|0⟩+|1⟩)/√2。
纠缠与位序H(q0) 后接 CNOT(q0,q1),应得到 |00⟩、|11⟩ 各一半,而非相邻两个编号。
测量统计计数和必须等于 shots;固定种子可复现;经验频率会围绕理论概率波动。

规模边界:状态向量内存随 2ⁿ 指数增长。单个单比特门直接作用于 statevector 需要约 O(2ⁿ) 次更新;这适合学习和小规模验证,不意味着可在普通设备模拟任意大电路。

动手任务与验收标准

  1. 依次运行 H(q0),观察 |00⟩ 与 |01⟩ 各占一半;再加 CNOT(q0,q1),确认 Bell 态只有 |00⟩、|11⟩ 两条结果。
  2. 尝试 X、Z、Ry(π/2) 与反向 CNOT,观察“概率不变但相位改变”与“位序改变”的差异。
  3. 运行两次相同线路和种子,比较采样计数;更换种子后计数可变,但 Bell 态的 |01⟩、|10⟩ 仍不应出现。
  4. 打开对应源码与测试:解释索引约定、单门复杂度,并增加一个“门与其逆门相消”或“概率和为 1”的自动测试。

本页配套代码:量子线路模拟器、算法、QFT、噪声、VQE、QAOA 与周期后处理、Day 5 噪声实验、Day 6 VQE 实验、Day 7 QAOA 实验、Day 8 拓扑路由教学模型。在项目仓库中运行 node --test tests/quantum-simulator.test.cjs 执行模拟器与算法回归测试。算法实验限于小规模本地模型;真实 QPU 作业需用户自行安装 Qiskit、管理 provider 凭据并依其文档操作,本页不会代为提交。

觉得好用?Found it useful?