翻译自页面:https://learn.qiskit.org/course/ch-algorithms/quantum-fourier-transform
量子傅里叶变换(Quantum Fourier Transform, QFT)
在这部分教程中,我们会介绍量子傅里叶变换(QFT),相关电路的推导以及电路的Qiskit实现。我们会展示如何在模拟器和五量子比特设备上运行QFT。
1.介绍
傅里叶变换在经典计算中有很多版本,应用领域遍及从信号处理到数据压缩再到复杂度理论。量子傅里叶变换则是离散傅里叶变换的量子实现,它基于对波函数振幅的变换。它参与构成了很多量子算法,其中最著名的有Shor分解因子算法和量子相位估计。
该离散傅里叶变换作用于向量 ( x 0 , . . . , x N − 1 ) (x_0,...,x_{N-1}) (x0,...,xN−1)并且根据如下公式将其映射成另一向量 ( y 0 , . . . , y N − 1 ) (y_0,...,y_{N-1}) (y0,...,yN−1):
y k = 1 N ∑ j = 0 N − 1 x j ω N j ⋅ k , ω N j ⋅ k = e 2 π i j ⋅ k N y_k=\frac{1}{\sqrt{N}}\sum_{j=0}^{N-1}x_j\omega^{j\cdot k}_N,\omega^{j\cdot k}_N=e^{2\pi i\frac{j\cdot k}{N}} yk=N1j=0∑N−1xjωNj⋅k,ωNj⋅k=e2πiNj⋅k
相似地,量子傅里叶变换作用于量子态 ∣ X > = ∑ j = 0 N − 1 x j ∣ j > \left|X\right>=\sum_{j=0}^{N-1}x_j\left|j\right> ∣X⟩=∑j=0N−1xj∣j⟩并根据如下公式映射为量子态 ∣ Y > = ∑ k = 0 N − 1 y k ∣ k > \left|Y\right>=\sum_{k=0}^{N-1}y_k\left|k\right> ∣Y⟩=∑k=0N−1yk∣k⟩:
y k = 1 N ∑ j = 0 N − 1 x j ω N j ⋅ k , ω N j ⋅ k = e 2 π i j ⋅ k N y_k=\frac{1}{\sqrt{N}}\sum_{j=0}^{N-1}x_j\omega^{j\cdot k}_N,\omega^{j\cdot k}_N=e^{2\pi i\frac{j\cdot k}{N}} yk=N1j=0∑N−1xjωNj⋅k,ωNj⋅k=e2πiNj⋅k
注意,只有态的振幅被变换影响。这一点还可以被表述为如下映射:
∣ j > → 1 N ∑ k = 0 N − 1 ω N j k ∣ k > \left|j\right>\rightarrow\frac{1}{\sqrt{N}}\sum_{k=0}^{N-1}\omega^{jk}_N\left|k\right> ∣j⟩→N1k=0∑N−1ωNjk∣k⟩
或者是幺正矩阵:
U Q F T = 1 N ∑ k = 0 N − 1 ω N j k ∣ k > < j ∣ U_{QFT}=\frac{1}{\sqrt{N}}\sum_{k=0}^{N-1}\omega^{jk}_N\left|k\right>\left<j\right| UQFT=N1k=0∑N−1ωNjk∣k⟩⟨j∣
2.直观理解
量子傅里叶变换(QFT)在两组基矢间进行变换,分别是涉及计算的基矢组(Z)和傅里叶基矢组。哈达玛门就是单量子比特的QFT,它从Z基的 ∣ 0 > \left|0\right> ∣0⟩和 ∣ 1 > \left|1\right> ∣1⟩变换到X基的 ∣ + > \left|+\right> ∣+⟩和 ∣ − > \left|-\right> ∣−⟩。依照相同的方式,所有在计算基(computational basis)中的多量子比特态都有对应的傅里叶基。而QFT仅仅是在任意两组间变换的函数。
∣ 计 算 基 下 的 态 > ⟶ Q F T ∣ 傅 里 叶 基 下 的 态 > \left|计算基下的态\right>\stackrel{QFT}{\longrightarrow}\left|傅里叶基下的态\right> ∣计算基下的态⟩⟶QFT∣傅里叶基下的态⟩
Q F T ∣ x > = ∣ x ~ > QFT\left|x\right>=\left|\tilde{x}\right> QFT∣x⟩=∣x~⟩(我们通常使用波浪(~)记号来表示傅里叶基)
2.1 在傅里叶基中计数
在计算基中,我们通过 ∣ 0 > \left|0\right> ∣0⟩和 ∣ 1 > \left|1\right> ∣1⟩态来存储二进制数值:
(译注:本例中最大到15,对应的二进制即1111,故最多用四个量子比特储存)
注意不同量子比特改变的频率:最左边的量子比特会随着每个数字增量翻转一次,靠右一个则是每两个增量翻转一次,第三个是每四个增量翻转一次,第四个则是每八次翻转一次。在傅里叶基中我们使用绕Z轴的不同旋转来储存数字:
我们想要储存的数值决定了每个量子比特绕Z轴旋转的角度。在 ∣ 0 ~ > \left|\tilde{0}\right> ∣∣0~⟩态时,每一个量子比特都处于 ∣ + > \left|+\right> ∣+⟩的状态。由上例可知,为了在四个量子比特上解码 ∣ 5 > \left|5\right> ∣5⟩态,我们将最左边的量子比特旋转 5 2 n = 5 16 \frac{5}{2^n}=\frac{5}{16} 2n5=165周( 5 16 × 2 π \frac{5}{16}\times 2\pi 165×2π弧度)。而下一个量子比特则会将上一量子比特旋转的角度加倍( 10 16 × 2 π \frac{10}{16}\times 2\pi 1610×2π弧度),依此类推。
再次强调,留意每个量子比特变化的频率。最左边的量子比特(qubit 0)在本例中频率最低,而最右侧的频率最高。
3.例1:单量子比特的量子傅里叶变换(1-qubit QFT)
考虑如下定义的QFT算符是如何作用于一个量子比特态 ∣ ψ > = α ∣ 0 > + β ∣ 1 > \left|\psi\right>=\alpha\left|0\right>+\beta\left|1\right> ∣ψ⟩=α∣0⟩+β∣1⟩上的。在这种情况下, x 0 = α , x 1 = β x_0=\alpha,x_1=\beta x0=α,x1=β 而 N = 2 N=2 N=2。于是有:
y 0 = 1 2 ( α e x p ( 2 π i 0 × 0 2 ) + β e x p ( 2 π i 1 × 0 2 ) ) = 1 2 ( α + β ) , y_0=\frac{1}{\sqrt 2}\left(\alpha exp\left(2\pi i \frac{0\times0}{2}\right)+\beta exp\left(2\pi i\frac{1\times 0}{2}\right)\right)=\frac{1}{\sqrt 2}(\alpha+\beta), y0=21(αexp(2πi20×0)+βexp(2πi21×0))=21(α+β),
y 1 = 1 2 ( α e x p ( 2 π i 0 × 1 2 ) + β e x p ( 2 π i 1 × 1 2 ) ) = 1 2 ( α − β ) y_1=\frac{1}{\sqrt 2}\left(\alpha exp\left(2\pi i \frac{0\times1}{2}\right)+\beta exp\left(2\pi i\frac{1\times 1}{2}\right)\right)=\frac{1}{\sqrt 2}(\alpha-\beta) y1=21(αexp(2πi20×1)+βexp(2πi21×1))=21(α−β)
于是我们得到的最终结果是如下量子态:
U Q F T ∣ ψ > = 1 2 ( α + β ) ∣ 0 > + 1 2 ( α − β ) ∣ 1 > U_{QFT}\left|\psi\right>=\frac{1}{\sqrt 2}(\alpha+\beta)\left|0\right>+\frac{1}{\sqrt 2}(\alpha-\beta)\left|1\right> UQFT∣ψ⟩=21(α+β)∣0⟩+21(α−β)∣1⟩
这一操作实际上正等价于对量子比特施加哈达玛门:
H = 1 2 ( 1 1 1 − 1 ) H=\frac{1}{\sqrt 2}\begin{pmatrix}1 & 1\\ 1 & -1\end{pmatrix} H=21(111−1)
如果我们在量子态 ∣ ψ > = α ∣ 0 > + β ∣ 1 > \left|\psi\right>=\alpha\left|0\right>+\beta\left|1\right> ∣ψ⟩=α∣0⟩+β∣1⟩上作用哈达玛门,我们会获得新的量子态:
1 2 ( α + β ) ∣ 0 > + 1 2 ( α − β ) ∣ 1 > ≡ α ~ ∣ 0 > + β ~ ∣ 1 > \frac{1}{\sqrt 2}(\alpha+\beta)\left|0\right>+\frac{1}{\sqrt 2}(\alpha-\beta)\left|1\right>≡\widetilde{\alpha}\left|0\right>+\widetilde{\beta}\left|1\right> 21(α+β)∣0⟩+21(α−β)∣1⟩≡α ∣0⟩+β ∣1⟩
注意哈达玛门在 N = 2 N=2 N=2时是如何对量子态的振幅进行离散傅里叶变换的。
4.量子傅里叶变换
所以对更大的 N N N来说量子傅里叶变换是什么样子的呢?让我们在 N = 2 n N=2^n N=2n的情况下推导出一个变换,令 Q F T N QFT_N QFTN作用于量子态 ∣ x > = ∣ x 1 . . . x n > \left|x\right>=\left|x_1...x_n\right> ∣x⟩=∣x1...xn⟩,其中 x 1 x_1 x1是最左侧的比特。此处数学是为那些需要有用信息以进一步理解的人的,如果你觉得读起来很吃力,无须担心。只要你理解了第二节的直观内容,你就可以直接继续读下一节的内容。
Q F T N ∣ x > = 1 N ∑ y = 0 N − 1 ω N x ⋅ y ∣ y > = 1 N ∑ y = 0 N − 1 e 2 π i x ⋅ y 2 n ∣ y > 因 为 ω N x ⋅ y = e 2 π i x ⋅ y N 且 N = 2 n = 1 N ∑ y = 0 N − 1 e 2 π i x ⋅ ( ∑ k = 1 n y k / 2 k ) ∣ y 1 . . . y n > 重 写 成 小 数 二 进 制 记 号 y = y 1 . . . y n , y / 2 n = ∑ k = 1 n 2 / 2 k = 1 N ∑ y = 0 N − 1 ∏ k = 1 n e 2 π i x ⋅ y k / 2 k ∣ y 1 . . . y n > 在 将 指 数 上 的 加 和 变 为 若 干 指 数 相 乘 的 形 式 之 后 = 1 N ⨂ k = 1 n ( e 2 π i x ⋅ 0 / 2 k ∣ 0 > + e 2 π i x ⋅ 1 / 2 k ∣ 1 > ) 在 将 加 和 与 乘 积 重 排 并 展 开 ∑ y = 0 N − 1 = ∑ y 1 = 0 1 ∑ y 2 = 0 1 . . . ∑ y n = 0 1 之 后 \begin{aligned} QFT_N\left|x\right>&=\frac{1}{\sqrt N}\sum_{y=0}^{N-1}\omega^{x\cdot y}_N\left|y\right>\\ &=\frac{1}{\sqrt N}\sum_{y=0}^{N-1}e^{2\pi i \frac{x\cdot y}{2^n}}\left|y\right>因为\omega^{x\cdot y}_N=e^{2\pi i\frac{x\cdot y}{N}}且N=2^n\\ &=\frac{1}{\sqrt N}\sum_{y=0}^{N-1}e^{2\pi i x\cdot \left(\sum^n_{k=1}y_k/2^k\right)}\left|y_1...y_n\right>重写成小数二进制记号y=y_1...y_n,y/2^n=\sum^n_{k=1}2/2^k\\ &=\frac{1}{\sqrt N}\sum_{y=0}^{N-1}\prod^n_{k=1}e^{2\pi i x\cdot y_k/2^k}\left|y_1...y_n\right>在将指数上的加和变为若干指数相乘的形式之后\\ &=\frac{1}{\sqrt N}\bigotimes_{k=1}^{n}\left(e^{2\pi i x\cdot 0/2^k}\left|0\right>+e^{2\pi i x\cdot 1/2^k}\left|1\right>\right)在将加和与乘积重排并展开\sum^{N-1}_{y=0}=\sum^{1}_{y1=0}\sum^{1}_{y2=0}...\sum^{1}_{yn=0}之后 \end{aligned} QFTN∣x⟩=N1y=0∑N−1ωNx⋅y∣y⟩=N1y=0∑N−1e2πi2nx⋅y∣y⟩因为ωNx⋅y=e2πiNx⋅y且N=2n=N1y=0∑N−1e2πix⋅(∑k=1nyk/2k)∣y1...yn⟩重写成小数二进制记号y=y1...yn,y/2n=k=1∑n2/2k=N1y=0∑N−1k=1∏ne2πix⋅yk/2k∣y1...yn⟩在将指数上的加和变为若干指数相乘的形式之后=N1k=1⨂n(e2πix⋅0/2k∣0⟩+e2πix⋅1/2k∣1⟩)在将加和与乘积重排并展开y=0∑N−1=y1=0∑1y2=0∑1...yn=0∑1之后
这是我们在直观理解一节看到过的数学描述动画:
5.QFT的实现电路
QFT的实现电路会用到两种门。第一个门是你已经知道的单比特哈达玛门。从上面例一中的讨论,你已经知道了哈达玛门在单量子比特态 ∣ x k > \left|x_k\right> ∣xk⟩的作用效果是
H ∣ x k > = 1 2 ( ∣ 0 > + e x p ( 2 π i 2 x k ) ∣ 1 > ) H\left|x_k\right>=\frac{1}{\sqrt 2}\left(\left|0\right>+exp\left(\frac{2\pi i}{2}x_k\right)\left|1\right>\right) H∣xk⟩=21(∣0⟩+exp(22πixk)∣1⟩)
第二个门是一个双量子比特受控旋转门 C R O T k CROT_k CROTk,给定如下块对角形式:
C R O T k = ( I 0 0 U R O T k ) CROT_k=\begin{pmatrix}I & 0\\0 & UROT_k\end{pmatrix} CROTk=(I00UROTk)
其中,
U R O T k = ( 1 0 0 e x p ( 2 π i 2 k ) ) UROT_k=\begin{pmatrix}1&0\\0&exp(\frac{2\pi i}{2^k})\end{pmatrix} UROTk=(100exp(2k2πi))
C R O T k CROT_k CROTk在前为控制位,后为目标位的双量子比特 ∣ x l x j > \left|x_lx_j\right> ∣xlxj⟩上的作用由下给出:
C R O T k ∣ 0 x j > = ∣ 0 x j > 以 及 C R O T k ∣ 1 x j > = e x p ( 2 π i 2 k ) ∣ 1 x j > CROT_k\left|0x_j\right>=\left|0x_j\right>以及CROT_k\left|1x_j\right>=exp(\frac{2\pi i}{2^k})\left|1x_j\right> CROTk∣0xj⟩=∣0xj⟩以及CROTk∣1xj⟩=exp(2k2πi)∣1xj⟩
给定这两种门,实现n元量子傅里叶变换的电路如下所示:
该电路通过下述的方式进行。我们从n元量子比特态 ∣ x 1 x 2 . . . x n > \left|x_1x_2...x_n\right> ∣x1x2...xn⟩的输入开始。
1.将哈达玛门施加于第一个量子比特后,量子态从输入态变换到
H ∣ x 1 x 2 . . . x n > = 1 2 [ ∣ 0 > + e x p ( 2 π i 2 x 1 ) ∣ 1 > ] ⊗ ∣ x 2 x 3 . . . x n > H\left|x_1x_2...x_n\right>=\frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2}x_1)\left| 1\right>\right]\otimes\left|x_2x_3...x_n\right> H∣x1x2...xn⟩=21[∣0⟩+exp(22πix1)∣1⟩]⊗∣x2x3...xn⟩
2.将 U R O T 2 UROT_2 UROT2门以第二个量子比特为控制位并施加于第一个量子比特后,量子态被变换为
1 2 [ ∣ 0 > + e x p ( 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 > ] ⊗ ∣ x 2 x 3 . . . x n > \frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\left| 1\right>\right]\otimes\left|x_2x_3...x_n\right> 21[∣0⟩+exp(222πix2+22πix1)∣1⟩]⊗∣x2x3...xn⟩
3.在以第n个量子比特为控制位将最后一个 U R O T n UROT_n UROTn门施加于第一个量子比特后,量子态就变成了
1 2 [ ∣ 0 > + e x p ( 2 π i 2 n x n + 2 π i 2 n − 1 x n − 1 + . . . + 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 > ] ⊗ ∣ x 2 x 3 . . . x n > \frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^n}x_n+\frac{2\pi i}{2^{n-1}}x_{n-1}+...+\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\left| 1\right>\right]\otimes\left|x_2x_3...x_n\right> 21[∣0⟩+exp(2n2πixn+2n−12πixn−1+...+222πix2+22πix1)∣1⟩]⊗∣x2x3...xn⟩
注意到 x = 2 n − 1 x 1 + 2 n − 2 x 2 + . . . + 2 1 x n − 1 + 2 0 x n x=2^{n-1}x_1 + 2^{n-2}x_2+...+2^1x_{n-1}+2^0x_n x=2n−1x1+2n−2x2+...+21xn−1+20xn,我们可以将上述量子态写为
1 2 [ ∣ 0 > + e x p ( 2 π i 2 n x ) ∣ 1 > ] ⊗ ∣ x 2 x 3 . . . x n > \frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^n}x)\left| 1\right>\right]\otimes\left|x_2x_3...x_n\right> 21[∣0⟩+exp(2n2πix)∣1⟩]⊗∣x2x3...xn⟩
4.在对第二到第n个量子比特施加相似门序列后,我们发现最终量子态是:
1 2 [ ∣ 0 > + e x p ( 2 π i 2 n x ) ∣ 1 > ] ⊗ 1 2 [ ∣ 0 > + e x p ( 2 π i 2 n − 1 x ) ∣ 1 > ] ⊗ … ⊗ 1 2 [ ∣ 0 > + e x p ( 2 π i 2 1 x ) ∣ 1 > ] \frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^n}x)\left| 1\right>\right]\otimes\frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^{n-1}}x)\left| 1\right>\right]\otimes\ldots\otimes\frac{1}{\sqrt 2}\left[\left| 0\right>+exp(\frac{2\pi i}{2^1}x)\left| 1\right>\right] 21[∣0⟩+exp(2n2πix)∣1⟩]⊗21[∣0⟩+exp(2n−12πix)∣1⟩]⊗…⊗21[∣0⟩+exp(212πix)∣1⟩]
这正是我们推导出的将输入态进行量子傅里叶变换后的量子态,值得注意的是量子比特的顺序在输出态中被反转了。
6.例二:三元量子傅里叶变换
创建实现 ∣ y 3 y 2 y 1 > = Q F T 8 ∣ x 3 x 2 x 1 > \left|y_3y_2y_1\right>=QFT_8\left|x_3x_2x_1\right> ∣y3y2y1⟩=QFT8∣x3x2x1⟩的步骤如下:
1.对 ∣ x 1 ⟩ \vert x_1\rangle ∣x1⟩施加哈达玛门:
∣ ψ 1 ⟩ = ∣ x 3 ⟩ ⊗ ∣ x 2 ⟩ ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_1\rangle=\vert x_3\rangle\otimes\vert x_2\rangle\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ1⟩=∣x3⟩⊗∣x2⟩⊗21[∣0⟩+exp(22πix1)∣1⟩]
2.根据 ∣ x 2 ⟩ \vert x_2 \rangle ∣x2⟩在 ∣ x 1 ⟩ \vert x_1 \rangle ∣x1⟩上施加一个 U R O T 2 UROT_2 UROT2门
∣ ψ 2 ⟩ = ∣ x 3 ⟩ ⊗ ∣ x 2 ⟩ ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_2\rangle=\vert x_3\rangle\otimes\vert x_2\rangle\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ2⟩=∣x3⟩⊗∣x2⟩⊗21[∣0⟩+exp(222πix2+22πix1)∣1⟩]
3.根据 ∣ x 3 ⟩ \vert x_3 \rangle ∣x3⟩在 ∣ x 1 ⟩ \vert x_1 \rangle ∣x1⟩上施加一个 U R O T 3 UROT_3 UROT3门
∣ ψ 3 ⟩ = ∣ x 3 ⟩ ⊗ ∣ x 2 ⟩ ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 3 x 3 + 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_3\rangle=\vert x_3\rangle\otimes\vert x_2\rangle\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^3}x_3+\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ3⟩=∣x3⟩⊗∣x2⟩⊗21[∣0⟩+exp(232πix3+222πix2+22πix1)∣1⟩]
4.对 ∣ x 2 ⟩ \vert x_2 \rangle ∣x2⟩施加一个哈达玛门
∣ ψ 4 ⟩ = ∣ x 3 ⟩ ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 x 2 ) ∣ 1 ⟩ ] ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 3 x 3 + 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_4\rangle=\vert x_3\rangle\otimes \frac{1}{\sqrt 2}\left[\vert 0 \rangle+exp(\frac{2\pi i}{2}x_2)\vert 1\rangle\right]\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^3}x_3+\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ4⟩=∣x3⟩⊗21[∣0⟩+exp(22πix2)∣1⟩]⊗21[∣0⟩+exp(232πix3+222πix2+22πix1)∣1⟩]
5.根据 ∣ x 3 ⟩ \vert x_3 \rangle ∣x3⟩在 ∣ x 2 ⟩ \vert x_2 \rangle ∣x2⟩上施加一个 U R O T 2 UROT_2 UROT2门
∣ ψ 5 ⟩ = ∣ x 3 ⟩ ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 2 x 3 + 2 π i 2 x 2 ) ∣ 1 ⟩ ] ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 3 x 3 + 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_5\rangle=\vert x_3\rangle\otimes \frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^2}x_3+\frac{2\pi i}{2}x_2)\vert 1\rangle\right]\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^3}x_3+\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ5⟩=∣x3⟩⊗21[∣0⟩+exp(222πix3+22πix2)∣1⟩]⊗21[∣0⟩+exp(232πix3+222πix2+22πix1)∣1⟩]
6.对 ∣ 3 ⟩ \vert 3 \rangle ∣3⟩施加哈达玛门
∣ ψ 6 ⟩ = 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 x 3 ) ∣ 1 ⟩ ] ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 2 x 3 + 2 π i 2 x 2 ) ∣ 1 ⟩ ] ⊗ 1 2 [ ∣ 0 ⟩ + e x p ( 2 π i 2 3 x 3 + 2 π i 2 2 x 2 + 2 π i 2 x 1 ) ∣ 1 ⟩ ] \vert \psi_6\rangle=\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2}x_3)\vert 1\rangle\right]\otimes \frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^2}x_3+\frac{2\pi i}{2}x_2)\vert 1\rangle\right]\otimes\frac{1}{\sqrt 2}\left[\vert 0 \rangle + exp(\frac{2\pi i}{2^3}x_3+\frac{2\pi i}{2^2}x_2+\frac{2\pi i}{2}x_1)\vert 1 \rangle\right] ∣ψ6⟩=21[∣0⟩+exp(22πix3)∣1⟩]⊗21[∣0⟩+exp(222πix3+22πix2)∣1⟩]⊗21[∣0⟩+exp(232πix3+222πix2+22πix1)∣1⟩]
7.务必记住输出态的顺序反转才符合QFT的期望。因此,我们必须反转量子比特的顺序(本例中交换 y 1 y_1 y1和 y 3 y_3 y3)。
7.关于QFT电路的形式的一些注意事项
上面的示例演示了一个非常有用的 QFT 形式,用于 N = 2 n N=2^n N=2n。请注意,只有最后一个量子比特依赖于所有其他输入量子比特的值,而每下一个的量子比特所依赖的输入量子比特越来越少。这在QFT的物理实现中变得很重要,其中最近邻耦合比量子比特之间的远距离耦合更容易实现。
此外,随着QFT电路变大,越来越多的时间花在进行越来越轻微的旋转上。事实证明,我们可以忽略低于某个阈值的旋转,仍然可以获得不错的结果,这被称为近似QFT。这在物理实现中也很重要,因为减少操作次数可以大大减少退相干和潜在的门错误。
8.Qiskit实现
在Qiskit中,上述 C R O T CROT CROT门的实现是一个受控相位旋转门。该门在OpenQASM中被定义为
C P ( θ ) = ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 e i θ ) CP(\theta)=\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&e^{i\theta}\end{pmatrix} CP(θ)=⎝⎜⎜⎛100001000010000eiθ⎠⎟⎟⎞
故而,从上述 C R O T k CROT_k CROTk门到 C P CP CP门的映射关系可由下面等式给出
θ = 2 π / 2 k = π / 2 k − 1 \theta=2\pi/2^k=\pi/2^{k-1} θ=2π/2k=π/2k−1
8.1 三量子比特的例子
%matplotlib inline
import numpy as np
from numpy import pi
# importing Qiskit
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.providers.ibmq import least_busy
from qiskit.tools.monitor import job_monitor
from qiskit.visualization import plot_histogram, plot_bloch_multivector
在推广至n量子比特之前,研究三量子比特效果代码是非常有用的。首先,我们必须定义我们的量子电路:
qc = QuantumCircuit(3)
注意:记住Qiskit中最右侧的比特有最小的索引(0),所以电路会根据对称轴被反射成和第五节的图像近似的电路。首先,我们对第三个量子比特(qubit 2)施加哈达玛门:
qc.h(2)
qc.draw()
接着,如果第二个量子比特(qubit 1)在状态 ∣ 1 > \left|1\right> ∣1⟩时,我们想再转额外的四分之一周:
qc.cp(pi/2, 1, 2) # 从qubit 1到 qubit 2的CROT
qc.draw()
然后是八分之一周如果最小索引的量子比特(qubit 0)在状态 ∣ 1 ⟩ \vert 1 \rangle ∣1⟩:
qc.cp(pi/4, 0, 2) # 从qubit 2到qubit 0的CROT
qc.draw()
在处理好该量子比特后,我们可以忽略它并重复这一过程,对qubit 0和qubit 1施加同样的逻辑:
qc.h(1)
qc.cp(pi/2, 0, 1) # CROT from qubit 0 to qubit 1
qc.h(0)
qc.draw()
最后我们必须交换qubit 0和qubit 2来完成QFT:
qc.swap(0,2)
qc.draw()
8.2 普适QFT函数
现在,我们将在Qiskit中为QFT创建一个通用电路。创建像这样的大型通用电路是Qiskit真正的亮点。
构建一个实现量子傅里叶变换的电路,将量子比特倒过来,然后交换它们更容易;我们将从创建正确旋转量子比特的函数开始。让我们像3个量子比特的例子一样开始,通过正确旋转最有效的量子比特(具有最高索引的量子比特):
def qft_rotations(circuit, n):
if n == 0: # 如果电路为空则退出
return circuit
n -= 1 # 索引从0开始
circuit.h(n) # 对最高索引的量子比特施加哈达玛门
for qubit in range(n):
# 对每个较小索引的量子比特,我们需要
# 进行一个小角度的旋转:
circuit.cp(pi/2**(n-qubit), qubit, n)
让我们看看它长什么样子:
qc = QuantumCircuit(4)
qft_rotations(qc,4)
qc.draw()
我们可以使用下面的控件来观察这个电路是如何在我们的电路中根据量子比特数目而增长的:
from qiskit_textbook.widgets import scalable_circuit
scalable_circuit(qft_rotations)
太棒了!这是我们QFT的第一部分。现在我们已经正确旋转了最高索引的量子比特,我们需要正确旋转第二个最高索引的量子比特。然后我们必须处理第三个最高索引的,以此类推。但是为什么要写更多的代码呢?当我们到达qft_rotations()函数的末尾时,我们可以使用相同的代码对下一个n-1个量子比特重复上述过程:
def qft_rotations(circuit, n):
"""在前n个量子比特中实现量子傅里叶变换 (没有交换)"""
if n == 0:
return circuit
n -= 1
circuit.h(n)
for qubit in range(n):
circuit.cp(pi/2**(n-qubit), qubit, n)
# 在我们函数的最后,我们再次针对接下来的量子比特调用同样的函数
# (在前面的过程中我们已经减小了n的数值)
qft_rotations(circuit, n)
# 让我们看看它长什么样子:
qc = QuantumCircuit(4)
qft_rotations(qc,4)
qc.draw()
这很容易!函数直接或间接调用自身的过程称为递归。它可以极大地简化代码。使用下面的小控件,我们可以再次看到它是如何缩放的:
scalable_circuit(qft_rotations)
最后,我们需要在QFT函数的末尾添加交换,以匹配QFT的定义。我们将把它合并到最终的函数qft()中:
def swap_registers(circuit, n):
for qubit in range(n//2):
circuit.swap(qubit, n-qubit-1)
return circuit
def qft(circuit, n):
"""对电路中前n个量子比特施加QFT"""
qft_rotations(circuit, n)
swap_registers(circuit, n)
return circuit
# 让我们看看它长什么样子:
qc = QuantumCircuit(4)
qft(qc,4)
qc.draw()
这是量子傅里叶变换的广义电路。使用下面的小控件,我们可以再次看到它是如何缩放的:
scalable_circuit(qft)
我们现在要演示这个电路的正确工作。要做到这一点,我们必须首先在计算基中编码一个数字。我们可以看到二进制数字5是101:
bin(5)
(0b提醒我们这是个二进制数)让我们将其编码到量子比特中:
# 创建电路
qc = QuantumCircuit(3)
# 加密量子态 5
qc.x(0)
qc.x(2)
qc.draw()
让我们用aer模拟器来检查量子比特的状态:
sim = Aer.get_backend("aer_simulator")
qc_init = qc.copy()
qc_init.save_statevector()
statevector = sim.run(qc_init).result().get_statevector()
plot_bloch_multivector(statevector)
最后,让我们使用我们的QFT函数并查看我们的量子比特的最终状态:
qft(qc,3)
qc.draw()
qc.save_statevector()
statevector = sim.run(qc).result().get_statevector()
plot_bloch_multivector(statevector)
我们可以看出QFT函数很好的工作了。比起量子态 ∣ 0 ~ ⟩ = ∣ + + + ⟩ \vert \tilde{0}\rangle =\vert +++\rangle ∣0~⟩=∣+++⟩,Qubit 0被旋转了 5 8 \frac{5}{8} 85周,qubit 1则是 10 8 \frac{10}{8} 810周,qubit 2则是 20 8 \frac{20}{8} 820周
8.3 在真机上运行QFT
如果我们尝试在一个真实的设备上运行8.2节末尾的电路,结果将是完全随机的,因为所有量子比特都是 ∣ 0 ⟩ \vert 0 \rangle ∣0⟩和 ∣ 1 ⟩ \vert 1 \rangle ∣1⟩的相等叠加。如果我们想要演示和研究QFT在真实硬件上的工作,我们可以创建状态 ∣ 5 ~ ⟩ \vert \tilde{5} \rangle ∣5~⟩。参见8.2节的末尾,反向运行QFT,并验证输出是预期的状态 ∣ 5 ⟩ \vert 5 \rangle ∣5⟩。
首先,让我们使用Qiskit轻松反转我们的QFT操作:
def inverse_qft(circuit, n):
"""Does the inverse QFT on the first n qubits in circuit"""
# First we create a QFT circuit of the correct size:
qft_circ = qft(QuantumCircuit(n), n)
# Then we take the inverse of this circuit
invqft_circ = qft_circ.inverse()
# And add it to the first n qubits in our existing circuit
circuit.append(invqft_circ, circuit.qubits[:n])
return circuit.decompose() # .decompose() allows us to see the individual gates
现在让我们把我们的量子比特输入成 ∣ 5 ~ ⟩ \vert \tilde{5} \rangle ∣5~⟩:
nqubits = 3
number = 5
qc = QuantumCircuit(nqubits)
for qubit in range(nqubits):
qc.h(qubit)
qc.p(number*pi/4,0)
qc.p(number*pi/2,1)
qc.p(number*pi,2)
qc.draw()
然后我们可以看出这确实是傅里叶态 ∣ 5 ~ ⟩ \vert \tilde{5} \rangle ∣5~⟩中的结果:
qc_init = qc.copy()
qc_init.save_statevector()
sim = Aer.get_backend("aer_simulator")
statevector = sim.run(qc_init).result().get_statevector()
plot_bloch_multivector(statevector)
最后,让我们施加我们的逆QFT运算:
qc = inverse_qft(qc, nqubits)
qc.measure_all()
qc.draw()
# 导入我们已保存的IBMQ账号并获得最空闲的后端设备,其应具有少于或等于n的量子比特数
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q')
backend = least_busy(provider.backends(filters=lambda x: x.configuration().n_qubits >= nqubits
and not x.configuration().simulator
and x.status().operational==True))
print("least busy backend: ", backend)
shots = 2048
transpiled_qc = transpile(qc, backend, optimization_level=3)
job = backend.run(transpiled_qc, shots=shots)
job_monitor(job)
counts = job.result().get_counts()
plot_histogram(counts)
我们(抱有希望地)看到最可能的结果是101.
欢迎加入Qiskit交流群:1064371332