引言
如果要在量子算法里选一个「最通用的引擎」,量子相位估计(Quantum Phase Estimation,QPE)几乎必然当选。Shor 的因数分解靠它找周期,HHL 解线性方程组靠它提取特征值,量子化学求基态能量靠它做能量投影——这些看似无关的算法,内核都是同一个:把某个酉算符的特征相位提取到一个寄存器里。而 QPE 的最后一环,正是量子傅里叶变换(QFT)。
本文系统拆解这条主线:先讲 QFT 的定义、线路与复杂度,澄清「指数加速」到底指什么;再完整拆解 QPE 的标准线路、精度与概率权衡;然后是更省比特的迭代式相位估计(IPEA)与 Kitaev 方法;接着讨论 QPE 作为公共内核的角色、资源估算、含噪可行性,最后给出 Qiskit 实现。目标:把 QPE 从「一个黑箱算法」变成「一个可估算、可组装、可评估的工程构件」。
前置:量子算法进阶 、HHL 与线性方程组 、量子比特与门基础 。
目录
- 1. QFT 的定义与线路实现
- 2. QFT 的复杂度与指数加速的准确含义
- 3. 相位估计 QPE 的标准线路
- 4. QPE 的精度与概率权衡
- 5. 迭代式相位估计与 Kitaev 方法
- 6. QPE 作为公共内核
- 7. 量子比特数与线路深度估算
- 8. 含噪环境下 QPE 的可行性
- 9. Qiskit 实现与模拟
- 速查表
- 延伸阅读
1. QFT 的定义与线路实现
离散傅里叶变换的量子版:作用在基态 |j⟩(j 为 n 位二进制数)上,
QFT|j⟩ = (1/√N) Σ_{k=0}^{N-1} exp(2πi·j·k/N) |k⟩,N = 2^n
等价的分量形式:
QFT|j⟩ = (1/√N) ⊗_{l=1}^{n} [ |0⟩ + exp(2πi·j/2^l)|1⟩ ]
→ 关键洞察:QFT 把「整数 j」变成「二进制小数 0.j_1 j_2 ... j_n」
在相位上逐位展开
线路实现:Hadamard + 受控相位门:
对每个比特 l:
1. 施加 H 门到比特 l
2. 对每个更低位 k > l,施加受控相位门 R_k:
R_k = diag(1, exp(2πi/2^(k-l+1)))
→ 最后(可选)交换比特顺序(bit-reversal)
门数:
n 个 H 门
n(n-1)/2 个受控相位门
→ 总门数 O(n^2),对比经典 FFT 的 O(N log N) = O(n·2^n)
无交换(without swaps)的写法:标准 QFT 末尾需要 n/2 个 SWAP 做比特反序。工程上常用「无交换」版本——把比特顺序反过来记录,或把反序吸收进后续门序列,从而省去 O(n) 个双比特门。
心智:QFT 的线路是「逐位生成相位」——第 l 位比特上累积的相位
2πj/2^l正比于 j 的二进制表示。因此 QFT 的复杂度是 O(n^2) 门,而不是经典 FFT 的 O(n·2^n)。这就是所谓「指数加速」的真正来源。
2. QFT 的复杂度与指数加速的准确含义
两种「加速」要分清:
经典 FFT:给定 N 个复数的完整向量,输出 N 个复数
代价 O(N log N) = O(n·2^n)
→ 输入输出都是「N 个经典数」
量子 QFT:作用在量子态 |j⟩ 上,输出叠加态
代价 O(n^2) 门
→ 但输出是「量子态」,无法直接读出全部 N 个振幅
「指数加速」的准确表述:
QFT 本身并没有「比 FFT 快指数倍地算出傅里叶变换」
经典:O(N log N) 算出全部 N 个系数
量子:O(n^2) 得到叠加态,但读出任意一个振幅都需 O(N) 次测量
→ QFT 的价值不在于「单独使用」
而在于「作为更大算法的一个子程序」
只要后续操作能「在傅里叶基上」完成而不需读出
指数加速才成立
对比要点:经典 FFT 输入输出都是 N 个复数、代价 O(N log N);量子 QFT 输入是基态、输出是叠加态、代价 O(n^2) 门,但读出全部系数需 O(N) 次测量,因此只能作为子程序使用。
心智:QFT 的指数加速是「作为子程序的加速」,不是「独立变换的加速」——它能以 O(n^2) 造出傅里叶变换后的量子态,但读不出全部系数。一旦你要求「把 QFT 的结果打印出来」,加速立刻消失。这与 HHL 的处境完全同构。
3. 相位估计 QPE 的标准线路
问题设定:给定酉算符 U 和它的一个特征态 |u⟩,满足
U|u⟩ = exp(2πi·φ)|u⟩,φ ∈ [0, 1) 未知
目标:估计 φ 的 n 位二进制近似 0.φ_1 φ_2 ... φ_n
线路的三个寄存器与五个步骤:
寄存器:
R1:n 个「计数比特」,初态 |0⟩^⊗n
R2:特征态寄存器,初态 |u⟩
步骤:
1. H^⊗n 作用于 R1 → 均匀叠加 (1/√N) Σ_j |j⟩
2. 受控 U^(2^j):R1 的第 j 位控制 U 的 2^j 次幂
在 |u⟩ 上累积相位 exp(2πi·φ·2^j)
3. R1 的态变为 (1/√N) Σ_j exp(2πi·φ·j)|j⟩
4. 对 R1 做逆 QFT(QFT†)
5. 测量 R1 → 得到 φ 的 n 位二进制近似
为什么是「逆 QFT」:
步骤 3 的态恰是 QFT|φ_approx⟩ 的形式
(相位 2πiφj 对应 QFT 定义中的 2πijk/N,k = φ·N)
→ 逆 QFT 把它「反变换」回计算基,集中到 |φ_approx⟩
→ 测量即读出 φ 的二进制近似
受控 U^(2^j) 的实现:
朴素做法:对第 j 位,连续施加 2^j 次受控 U → 指数级门数
高效做法:反复「平方」U
U^2 = U·U,U^4 = U^2·U^2,...
只需 j 次平方即可得到 U^(2^j)
→ 总代价 O(n) 次受控 U(每次是一份 U 的线路)
→ 这是 QPE 高效的关键:平方代替重复
心智:QPE 的骨架是「相位回踢 + 逆 QFT」——受控 U^(2^j) 把未知相位「回踢」到计数比特上(相位回踢是量子算法的通用技巧),逆 QFT 再把分散的相位信息集中成一个可测量的二进制数。用「反复平方」代替「重复 U」是它高效的核心。
4. QPE 的精度与概率权衡
精确可分辨的情形:若 φ 恰好是 n 位二进制有限小数 φ = 0.φ_1...φ_n,则逆 QFT 后测量以概率 1 得到精确值。
一般情形(φ 有无限二进制展开):
设 φ = φ* + δ,φ* 为 n 位近似,0 ≤ δ < 2^(-n)
测量得到 φ* 的概率:
P(φ*) = (1/N^2) · |Σ_{j=0}^{N-1} exp(2πiδj)|^2
= (1/N^2) · sin^2(πδN) / sin^2(πδ)
最小概率出现在 δ = 1/2(恰在两点中间):
P ≥ 4/π^2 ≈ 0.405
提高成功概率的两种手段:
1. 增加计数比特数 n:
精度 ε = 2^(-n),每加一个比特精度翻倍
但代价是线路深度与比特数线性增长
2. 额外增加 t 个比特(n → n + t):
测量后「四舍五入」到 n 位
成功概率 ≥ 1 - 1/(2·2^t) = 1 - 2^(-t-1)
→ t = 3 时成功概率 ≥ 0.9375
→ t = 10 时成功概率 ≥ 0.9995
| 额外比特 t | 成功概率下界 |
|---|---|
| 0 | ≥ 0.405 |
| 3 | ≥ 0.9375 |
| 5 | ≥ 0.984 |
| 10 | ≥ 0.9995 |
心智:QPE 的精度与概率是一对可调的权衡——精度由计数比特数 n 决定(ε = 2^(-n)),成功概率靠额外比特 t 补足(1 - 2^(-t-1))。工程上常用「n + 3 比特」把成功概率抬到 0.94 以上,或用振幅放大把成功分支挑出来。
5. 迭代式相位估计与 Kitaev 方法
标准 QPE 的资源痛点:需要 n 个计数比特加逆 QFT,线路深度 O(n^2),在 NISQ 上不可行。
迭代式相位估计(IPEA):
核心思想:每次只保留 1 个计数比特,逐位从低位到高位估计
流程(第 k 轮,从最低位开始):
1. 制备单个计数比特为 |+⟩
2. 受控 U^(2^(n-k)) 施加到特征态
3. 相位反馈:用已知的高位相位做一个 R_z 修正
4. H 门 + 测量 → 得到第 k 位
→ 比特数从 n 降到 1(加特征态寄存器)
代价:需要「经典反馈」与逐轮串行,线路深度仍 O(n^2) 但比特省
Kitaev 的相位估计算法:
思路:不显式做逆 QFT,而是「逐位测量相位」
对 k = 1, 2, 4, 8, ...(2 的幂)分别估计 φ 的小数部分
利用 Hadamard 测试读出 cos(2π·2^k·φ)
再用经典后处理重建 φ 的二进制展开
特点:对「单次测量」友好,适合早期硬件
缺点:噪声鲁棒性差,需要重复采样
三种方法的对比:
| 方法 | 计数比特 | 线路深度 | 反馈 | 适用场景 |
|---|---|---|---|---|
| 标准 QPE | n | O(n^2) | 无 | 容错量子计算 |
| IPEA | 1 | O(n^2) 串行 | 经典反馈 | 省比特的早期设备 |
| Kitaev | 1 | O(n) 轮 | 经典后处理 | 单次测量友好 |
心智:IPEA 与 Kitaev 都是「用串行换比特」的变形——标准 QPE 一次性并行估计全部 n 位,IPEA 逐位串行估计、每轮只需 1 个计数比特。它们在容错时代未必更优(串行深度更长),但在比特受限的早期硬件上更现实。
6. QPE 作为公共内核
QPE 是量子算法的「通用引擎」:
Shor 因数分解:
把「找周期 r」转化为「相位估计」问题
U|y⟩ = |a·y mod N⟩,其特征相位 φ ≈ s/r
用连分数从 φ 恢复 r → 分解 N
HHL 解线性方程组:
对 A 做相位估计,把特征值 λ_j 提取到寄存器
再用受控旋转做 1/λ_j 缩放
量子化学(能量估计):
对 e^(-iHt) 做相位估计,提取基态能量 E_0
→ 精度 ε 需计数比特 n ≈ log(1/ε)
量子模拟(振幅估计):
用 QPE 或振幅放大估计振幅
为什么 QPE 能统一它们:这些算法都有某个酉算符 U,其相位编码了想要的量——Shor 的相位对应周期、HHL 的相位对应特征值、化学的相位对应能量。QPE 就是「把相位翻译成可测量数字」的通用翻译器。
心智:QPE 是量子算法里复用度最高的构件——Shor、HHL、量子化学、振幅估计都把它当内核。理解 QPE,等于拿到了理解一大半「有理论保证的量子算法」的钥匙。这也解释了为什么 QPE 的资源估算如此关键。
7. 量子比特数与线路深度估算
比特数:
总比特数 = n(计数寄存器)+ n_sys(特征态/系统寄存器)+ 辅助比特
计数比特 n 由精度决定:n = log2(1/ε) + t(t 为额外比特)
系统比特 n_sys 由问题规模决定:
Shor 分解 N:n_sys ≈ 2·log2(N)
量子化学:n_sys = 轨道数 × 2(自旋轨道)
→ 总比特数是「精度 + 问题规模」的叠加
线路深度:
主要开销:受控 U^(2^j) 需要 U 的线路重复 O(n) 次(平方序列)
若 U 的线路深度为 D_U,则 QPE 深度 ≈ n · D_U + O(n^2)(逆 QFT)
→ 逆 QFT 的 O(n^2) 通常不是瓶颈,瓶颈是 n · D_U
例(Shor 分解 2048 位 RSA):
需要约 4000 ~ 6000 个逻辑比特
需要约 10^9 个 T 门(表面码下折算到物理比特 10^6 量级)
→ 这就是「量子优势门槛」的具体数字来源
| 应用 | 计数比特 | 系统比特 | T 门量级 |
|---|---|---|---|
| Shor(RSA-2048) | ~2·2048 | ~4096 | 10^9 |
| 化学(FeMoco) | ~100 | ~100 | 10^10 |
| HHL(N=2^20) | ~20 + log κ | 20 | 10^6 量级 |
| 简单演示 | 3 ~ 5 | 2 ~ 4 | 10^2 |
心智:QPE 的资源估算 = 「精度定计数比特、规模定系统比特、U 的深度乘 n 定线路深度」——瓶颈通常不是逆 QFT,而是
n · D_U。这也是为什么「把 U 的线路做浅」是容错量子计算的核心优化目标。
8. 含噪环境下 QPE 的可行性
NISQ 上的三重障碍:
1. 深度:n · D_U + O(n^2) 远超当前相干时间
当前设备 T2 ~ 100 μs,门时间 ~ 100 ns → 相干窗口 ~ 10^3 门
而 QPE 需要 10^6 门以上
2. 精度:噪声使相位信息随机化,估计值分布变宽
要压制噪声需重复测量 O(1/ε^2) 次
3. 比特数:容错所需的物理比特数远超当前设备
含噪 QPE 的误差表现:
理想 QPE:测量分布集中在 φ_approx
含噪 QPE:分布被展宽,出现「卫星峰」
- 退相干把主峰压低、尾部抬高
- 读出误差使峰位偏移
→ 用重复测量 + 中位数/众数估计可部分恢复
但代价随噪声指数增长
可行的过渡方案:只估计 1~2 位相位的短深度变体、比特更省的迭代式 IPEA、零噪声外推与概率误差抵消等误差缓解手段、用 VQE 估计基态能量的变分替代,以及「少量逻辑比特 + 纠错」的早期容错路线。现实路径是「先做小规模 QPE 演示,再逐步扩展」。
心智:QPE 是「容错量子计算的原生算法」——它的深度与比特需求与 NISQ 硬件存在数量级鸿沟,因此短期只能做原理演示。含噪 QPE 的分布展宽是可用误差缓解部分补偿的,但根本出路仍是纠错。
9. Qiskit 实现与模拟
手写 QFT 与逆 QFT:
from qiskit import QuantumCircuit
import numpy as np
def qft(n, inverse=False):
"""构造 n 比特 QFT(inverse=True 时构造逆 QFT)"""
qc = QuantumCircuit(n, name="IQFT" if inverse else "QFT")
for j in range(n):
qc.h(j)
for k in range(j + 1, n):
angle = np.pi / (2 ** (k - j))
if inverse:
angle = -angle
qc.cp(angle, k, j)
if not inverse: # 正 QFT 末尾做比特反序
for j in range(n // 2):
qc.swap(j, n - 1 - j)
return qc
手写 QPE 并模拟:
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
import numpy as np
def qpe_circuit(phi, n_count=4):
"""用 n_count 个计数比特估计单比特相位 phi"""
qc = QuantumCircuit(n_count + 1, n_count)
qc.x(n_count) # 特征态 |1⟩
for q in range(n_count):
qc.h(q) # 计数寄存器均匀叠加
# 受控 U^(2^j):U = p(2*pi*phi),U^(2^j) = p(2*pi*phi*2^j)
for q in range(n_count):
qc.cp(2 * np.pi * phi * (2 ** q), q, n_count)
qc.append(qft(n_count, inverse=True), range(n_count))
qc.measure(range(n_count), range(n_count))
return qc
qc = qpe_circuit(0.25, n_count=4)
sim = AerSimulator()
result = sim.run(transpile(qc, sim), shots=4096).result()
counts = result.get_counts()
print(counts) # 预期集中在 |0100⟩(0.25 = 二进制 0.0100)
心智:Qiskit 让 QPE 从公式变成可跑的线路——
PhaseEstimation是内置封装,手写 QFT + 受控相位门则是理解原理的最佳方式。把 φ 设成 0.25 这样「二进制有限小数」时,测量结果会干净地集中在|0100⟩,这是验证 QPE 是否正确的标准测试。
速查表
| 主题 | 结论 |
|---|---|
| QFT 定义 | 相位逐位展开:QFT|j⟩ = N^(-1/2) Σ_k exp(2πijk/N)|k⟩ |
| QFT 线路 | n 个 H + n(n-1)/2 个受控相位门,O(n^2) |
| QFT 加速 | 作为子程序的加速,读不出全部系数 |
| QPE 输入 | 酉 U 与特征态 |u⟩,U|u⟩ = exp(2πiφ)|u⟩ |
| QPE 步骤 | H 层 + 受控 U^(2^j) + 逆 QFT + 测量 |
| 受控幂实现 | 反复平方得 U^(2^j),共 O(n) 次受控 U |
| QPE 精度 | ε = 2^(-n),n 为计数比特数 |
| QPE 成功概率 | 加 t 比特后 ≥ 1 - 2^(-t-1) |
| IPEA | 逐位串行,只用 1 个计数比特 |
| Kitaev | 逐位测相位,经典后处理重建 |
| 公共内核 | Shor / HHL / 量子化学 / 振幅估计 |
| 资源瓶颈 | n · D_U(U 的深度)而非逆 QFT |
| NISQ 现实 | 深度与比特差数量级,只能原理演示 |
一句话记忆:量子傅里叶变换把基态 |j⟩ 的相位逐位展开,用 O(n^2) 个门造出傅里叶变换后的量子态——它的「指数加速」是作为子程序的加速,读不出全部系数;量子相位估计以「H 层 + 受控 U^(2^j) + 逆 QFT」为骨架,把未知特征相位翻译成可测量的二进制数,用「反复平方」把受控幂的代价从指数降到 O(n);精度由计数比特数决定(ε = 2^(-n)),成功概率靠额外比特补足(1 - 2^(-t-1));迭代式 IPEA 与 Kitaev 方法用串行换比特,适合早期硬件;QPE 是 Shor、HHL、量子化学、振幅估计的公共内核,其资源瓶颈是 n 乘以 U 的线路深度而非逆 QFT;由于深度与比特需求比 NISQ 硬件高出数量级,QPE 是「容错量子计算的原生算法」,短期只能做原理演示。(延伸见 量子算法进阶 、HHL 与线性方程组 。)
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。