量子傅里叶变换¶
量子傅里叶变换(QFT)实质上是经典的逆离散傅里叶变换(IDFT)的量子版本。
量子傅里叶变换可以将存在于基向量中的数据与振幅中的数据在一定条件下相互转换。
基本定义¶
如图所示,QFT可以简单地通过对IDFT进行替换得到,QFT和DFT本质上都是同一个向量在两个等价空间中的不同表示形式,即基向量的更换。

由定义可知,空间 \(span\{\left|x\right\rangle\}\) 中的某个向量 \(\Sigma_x\alpha_x\left|x\right\rangle\) 通过傅里叶变换可以表示为另一个等价空间 \(span\{\left|k\right\rangle\}\) 中基向量的线性组合\(\Sigma_k\beta_k\left|k\right\rangle\), 且线性组合的系数 \(\beta_k\) 由\(\left|x\right\rangle\) 和 \(\alpha_x\) 决定。
备注
量子傅里叶变换/逆变换,实质上可以视为一种振幅和基向量的相互转化。
量子线路构造¶
对QFT的量子线路实现需要对其表达式进行变形,得到可以用现有普适量子门组合实现的变换过程。
QFT的求和形式与张量积形式¶
对任给整数 \(x\) ,由二进制展开 \(k=\Sigma_{i=1}^nk_i2^{n-i}\),对\(\left|x\right\rangle\) 进行量子傅里叶变换的结果可表示为
由上式可知,QFT可以将特定量子态 \(\left|x\right\rangle\) 表示为另一组基的线性组合,而这个线性组合还能表示为多个单比特量子态\(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{-l}}\left|1\right\rangle)\) 的张量积。
因此对任给整数 \(x\),如果可以由二进制展开位 \(\left|x_{n+1-l}\right\rangle\) 快速构造量子态 \(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{-l}}\left|1\right\rangle)\),那么就可以通过张量积形式的QFT表达式完成相应QFT量子线路的构造。
二进制展开与量子态制备¶
任给整数 \(x\) 进行二进制展开近似:
而
于是制备 \(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{-l}}\left|1\right\rangle)\) 转化为制备 \(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi i [0.x_{n-l}\cdots x_n]}\left|1\right\rangle)\) 。
注意到 \(H\left|0\right\rangle = \frac{1}{\sqrt{2}}(\left|0\right\rangle + \left|1\right\rangle) = \ \frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi i [0.x_n]}\left|1\right\rangle)\) ,而
定义受控旋转量子门 \((C-R)_{j-k+1}\) 满足
于是利用量子门 \(H\) 和 \((C-R)_{j-k+1}\) 就可以完成对量子态\(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{-l}}\left|1\right\rangle)\)的制备,进而完成QFT的量子线路。
QFT的量子线路图如下所示

特别地,注意到上图中初始量子态为 \(\left|x_i\right\rangle\) 的量子比特对应的结果量子态为\(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{n+1-l}}\left|1\right\rangle)\)而非 \(\frac{1}{\sqrt{2}}(\left|0\right\rangle + e^{2\pi ix2^{-l}}\left|1\right\rangle)\) ,因此实际使用时还需要追加相应的多组 \(SWAP\) 门。
代码实现¶
QFT在一维情况就是Hadamard量子门。 基于QPanda-2.0的QFT接口函数如下:
QFT(qlist)
选取 \(\left|x\right\rangle=\left|000\right\rangle\) 验证QFT的代码实例如下
#!/usr/bin/env python
import pyqpanda as pq
from numpy import pi
if __name__ == "__main__":
machine = pq.init_quantum_machine(pq.QMachineType.CPU)
qvec = machine.qAlloc_many(3)
prog = pq.create_empty_qprog()
# 构建量子程序
prog.insert(pq.QFT(qvec))
# 对量子程序进行概率测量
result = pq.prob_run_dict(prog, qvec, -1)
pq.destroy_quantum_machine(machine)
# 打印测量结果
for key in result:
print(key+":"+str(result[key]))
由前文中QFT的定义及 \(\left|x\right\rangle=\left|000\right\rangle\) 可知输出结果应当以均匀概率 \(\frac{1}{8}\) 得到所有量子态,即
000:0.125
001:0.125
010:0.125
011:0.125
100:0.125
101:0.125
110:0.125
111:0.125