紧接着Grover 算法的热度,第二个在量子机器学习领域至关重要的算法 —— shor算法将成为本期博客所要传阐述的主要内容!

Shor’s algorithm

  • 一. 背景介绍与功能分析
  • 二. 算法流程
  • 三. 周期查找
  • 四. 大结局
  • 五.实验进展与面临困难

一. 背景介绍与功能分析

尽管我们都知道一个数,无论大小,都可以被分解成素数的乘积,也就是著名的质因数分解,但是对于较大位数的数字来说,能明确的找到质数因子却是一个非常困难的问题!在许多领域上面,大数的质因数分解被应用在密码保护等技术领域(大数的质因数分解主要原理为:通常证明两个更小的数为质数更容易,而要分解这两个质数的乘积,难度呈指数增长。加密算法生成两个质数并保密,使用其乘积来参与加解密;破解时需要分解乘积得到两个原质数,难度比生成密钥和加解密时要难得多得多,代表性的算法为RSA)。但是Shor’s algorithm可以在多项式时间内完成大整数质因数分解。所以Shor’s algorithm从诞生之时,就和以RSA算法为根基的加密技术形成了不可调和的矛盾!
随着横坐标上大数 位数的持续增加,普通的质因数分解算法显然也随之逐步升高,但是Shor’s algorithm 在这里表现的异常优秀!

下面,我们直入主干,看看Shor′sShor'sShor′s算法的具体内涵!

二. 算法流程

完整的Shor算法是需要经典计算机和量子计算机协作完成的。其中量子计算机实现一个周期查找的函数,经典计算机负责整个算法流程的控制,以及调用量子算法。我们可以简单的将 Shor′sShor'sShor′s算法分成两个部分:

  • 第一部分是将因子分解问题转化成周期问题,这部分可以用传统方式实现。

  • 第二部分则是使用量子手段来搜寻这个周期,这一部分是舒尔算法中体现量子加速的主要部分!

其中这个第一部分又可以分为5个小步骤,一起来看看吧:

首先确定问题描述:给定一个合成数NNN,找到整数 PPP 在和 NNN 之间且不包含1和 NNN ,并且 NNN 整除于ppp :

第一步:随机选取一个小于NNN的自然数 aaa。

第二步:计算aaa 与NNN 的最小公约数,即gcd(a,N)gcd(a,N)gcd(a,N) ,使用辗转相除法求解即可!

第三步:若gcd(a,N)>1gcd(a,N)>1gcd(a,N)>1,直接得到因子;否则当gcd(a,N)=1gcd(a,N)= 1gcd(a,N)=1 时,计算函数:
f(x)=axmodNf(x)=a^{x} \bmod N f(x)=axmodN

模运算大家应该都是学习过的!其实这是一个周期函数,我们要做的就是找到它的最小正周期 rrr ,使得f(x+r)=f(r)f(x+r)=f(r)f(x+r)=f(r)

第四步:如果最小正周期是奇数,回到第一步,从头再来。

第五步:如果ar/2≡−1(modN)a^{r / 2} \equiv-1(\bmod N)ar/2≡−1(modN),依然返回第一步;反之,再继续计算gcd(ar/2+1,N)g c d\left(a^{r / 2}+1, N\right)gcd(ar/2+1,N) 和 gcd(ar/2−1,N)g c d\left(a^{r / 2}-1, N\right)gcd(ar/2−1,N),并验证二者结果是不是与NNN 互质的,是,则分解完成!

我们来整体的梳理一下过程:第一个步骤就是遍历小于NNN的整数;第二步其实就是碰碰运气,如果aaa和NNN的最大公约数不是1,那就是运气好,算法直接结束了;如果最大公约数是1,则调用周期查找子程序计算f(x)=axmodNf(x)=a^{x}modNf(x)=axmodN这个函数的阶数 rrr。

接下来:
f(0)=f(0+r)=armodN=1modNf(0)=f(0+r)=a^{r} \bmod N=1 \bmod N f(0)=f(0+r)=armodN=1modN
所以可得:ar−1=0modNa^{r}-1=0 \bmod N ar−1=0modN
若 rrr 为维数,而且ar/2a^{r/2}ar/2 不等于-1,得:
(ar/2+1)(ar/2−1)=0modN\left(a^{r / 2}+1\right)\left(a^{r / 2}-1\right)=0 \bmod N (ar/2+1)(ar/2−1)=0modN
根据前面的推导我们知道(ar/2+1)(ar/2−1)\left(a^{r/2}+1\right)\left(a^{r / 2}-1\right)(ar/2+1)(ar/2−1)和NNN 之间存在不是 111的最大公约数,也就是(ar/2+1)\left(a^{r / 2}+1\right)(ar/2+1) 和 (ar/2−1)\left(a^{r / 2}-1\right)(ar/2−1) 之间分别存在非1的最大公约数,再分别把他们求出来验证一下即可!

以N=15N=15N=15 为例,不妨取 gcd(7,15)=1gcd(7,15)=1gcd(7,15)=1,因此,构造函数为 f(x)=7xmode15f(x)=7^{x}mode 15f(x)=7xmode15 有:

f(0)=70mod15=1,f(1)=71mod15=7,f(2)=72mod15=4,f(3)=73mod15=13f(4)=74mod15=1,f(5)=75mod15=7,f(6)=76mod15=4,f(7)=77mod15=13f(8)=78mod15=1,f(9)=79mod15=7,f(10)=710mod15=4,f(11)=711mod15=13f(12)=712mod15=1,f(13)=713mod15=7,f(14)=714mod15=4,f(15)=715mod15=13\begin{aligned} &f(0)=7^{0} \bmod 15=1, f(1)=7^{1} \bmod 15=7, f(2)=7^{2} \bmod 15=4, f(3)=7^{3} \bmod 15=13\\ &f(4)=7^{4} \bmod 15=1, f(5)=7^{5} \bmod 15=7, f(6)=7^{6} \bmod 15=4, f(7)=7^{7} \bmod 15=13\\ &f(8)=7^{8} \bmod 15=1, f(9)=7^{9} \bmod 15=7, f(10)=7^{10} \bmod 15=4, f(11)=7^{11} \bmod 15=13\\ &f(12)=7^{12} \bmod 15=1, f(13)=7^{13} \bmod 15=7, f(14)=7^{14} \bmod 15=4, f(15)=7^{15} \bmod 15=13 \end{aligned} ​f(0)=70mod15=1,f(1)=71mod15=7,f(2)=72mod15=4,f(3)=73mod15=13f(4)=74mod15=1,f(5)=75mod15=7,f(6)=76mod15=4,f(7)=77mod15=13f(8)=78mod15=1,f(9)=79mod15=7,f(10)=710mod15=4,f(11)=711mod15=13f(12)=712mod15=1,f(13)=713mod15=7,f(14)=714mod15=4,f(15)=715mod15=13​
显然,周期r=4r=4r=4,且ar2modN=742mod15=4≠1a^{\frac{r}{2}} \bmod N=7^{\frac{4}{2}} \bmod 15=4 \neq 1a2r​modN=724​mod15=4​=1 ,于是我们得到的两个质数因子为:

p=gcd⁡(50,15)=5,q=gcd⁡(48,15)=3p=\operatorname{gcd}(50,15)=5, \quad q=\operatorname{gcd}(48,15)=3 p=gcd(50,15)=5,q=gcd(48,15)=3
结合例题数据后看上面的理论介绍,就会非常的简单!

三. 周期查找

像N=15N=15N=15 这种情况,我们可以简单的口算出周期,但是当数字的位数非常多的时候,显然是非常麻烦的,这里的周期查找算法为我们很好的解决了这一问题!

接下来的部分可以说是ShorShorShor 算法最核心的部分了:因为舒尔算法的基本思想是利用量子存储以及量子并行性,同时得到所有可能状态模数运算后的函数值,对函数值进行测量后利用量子纠缠得到函数值所对应的所有原像的叠加态。最后利用量子傅里叶变换得到周期

主要分为以下四个步骤:

1. 利用Hadamard门得到所有可能态的叠加态;
2. 利用量子并行性,执行量子模数运算;
3. 执行对计算结果的测量,利用量子纠缠性,得到原像集的叠加态;
4. 执行量子傅立叶变换,得到周期。

在推导周期查找算法之前,我们先回顾一下什么叫量子寄存器,顺便简单了解啥叫量子傅里叶变换!

量子寄存器:通常情况下,仅以单个量子位是无法完成既定计算目标,像传统计算机一样采用具有多量子位的量子寄存器不失为一种方法,通俗来说量子寄存器就是量子比特的集合,它是位串,其长度决定了它可以存储的信息量。在叠加时,寄存器中的每个量子位是 和 的叠加,因此,长度为n个量子位的寄存器是所有2n个可能的用n位表示的长度量子位串的叠加,换句话说,长度为n的量子寄存器的状态空间是n位基向量的线性组合,每个长度为2n,故我们可以得到:
∣ψn⟩=∑i=02n−1ai∣i⟩\left|\psi_{n}\right\rangle=\sum_{i=0}^{2^{n}-1} a_{i}|i\rangle∣ψn​⟩=i=0∑2n−1​ai​∣i⟩

在了解量子傅里叶之前,先回顾到我们之前学习过的经典傅里叶级数和傅里叶变换中的复习中来,忘记的小盆友可以猛戳这里!

其中,对于给定的一系列复数:x0,x1,…,xN−1x_{0}, x_{1}, \ldots, x_{N-1}x0​,x1​,…,xN−1​,我们定义它的离散傅里叶变换为:y0,y1,…,yN−1y_{0}, y_{1}, \ldots, y_{N-1}y0​,y1​,…,yN−1​,即:

yk=1N∑j=0N−1xjωjk,where ω=e2πi/Ny_{k}=\frac{1}{\sqrt{N}} \sum_{j=0}^{N-1} x_{j} \omega^{j k}, \quad \text { where } \omega=e^{2 \pi i / N} yk​=N​1​j=0∑N−1​xj​ωjk, where ω=e2πi/N

也可以展开一下(不要忘了eiθ=cosθ+isinθe^{i\theta } = cos \theta +i sin\thetaeiθ=cosθ+isinθ):
y0=1N(x0+x1+x2+x3+⋯)y1=1N(x0+x1ω+x2ω2+x3ω3+⋯)y2=1N(x0+x1ω2+x2ω4+x3ω6+⋯)…\begin{array}{l} y_{0}=\frac{1}{\sqrt{N}}\left(x_{0}+x_{1}+x_{2}+x_{3}+\cdots\right) \\ y_{1}=\frac{1}{\sqrt{N}}\left(x_{0}+x_{1} \omega+x_{2} \omega^{2}+x_{3} \omega^{3}+\cdots\right) \\ y_{2}=\frac{1}{\sqrt{N}}\left(x_{0}+x_{1} \omega^{2}+x_{2} \omega^{4}+x_{3} \omega^{6}+\cdots\right)\\ \dots \end{array} y0​=N​1​(x0​+x1​+x2​+x3​+⋯)y1​=N​1​(x0​+x1​ω+x2​ω2+x3​ω3+⋯)y2​=N​1​(x0​+x1​ω2+x2​ω4+x3​ω6+⋯)…​
显然,我们发现从{xi}\left\{ x_{i}\right \}{xi​} 到 {yk}\left\{ y_{k}\right \}{yk​} 是一个线性映射,并且是可逆的,所以计算从 {yk}\left\{ y_{k}\right \}{yk​} 到 {xi}\left\{ x_{i}\right \}{xi​} 的映射也是不难的:
xi=1N∑k=0N−1ykω−jkx_{i}=\frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} y_{k} \omega^{-j k}xi​=N​1​k=0∑N−1​yk​ω−jk

看个例题:假设N=100N=100N=100, {xi}\left\{ x_{i}\right \}{xi​}是周期为7的数字组:1,0,0,0,0,0,0,1,0,0,0,0,0,0,…1,0,0,0,0,0,0, \quad 1,0,0,0,0,0,0, \quad \ldots1,0,0,0,0,0,0,1,0,0,0,0,0,0,… ,使得y0,y1,…,y99y_{0}, y_{1}, \ldots, y_{99}y0​,y1​,…,y99​ 是x0,x1,…,x99x_{0}, x_{1}, \ldots, x_{99}x0​,x1​,…,x99​ 的离散傅里叶变换,那么下图展示了在0≤k≤990 \leq k \leq 990≤k≤99 时的 ∣yk∣\left | y_{k}\right |∣yk​∣:


我们可以从图中明显的看到有7个较大的峰值,其都落在1007≈14.2857…\frac{100}{7} \approx 14.2857 \ldots7100​≈14.2857… 的倍数处,正好与 {xi}\left\{ x_{i}\right \}{xi​}的周期为7 相对应!而图中波谷与波峰似乎看上去不太完美的原因是 100不能整除7 ,否则,不仅对称,而且波谷都为0 ,波峰值相同!

那我们如何执果索因,找到这个7呢?

在高中数学竞赛中,学习过一种非常有用的无理数表达方式: continued fractions,即对于一个实数 zzz 它的连分式为:z=a0+1a1+1a2+1a3+1a4+⋯z=a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}+\frac{1}{a_{3}+\frac{1}{a_{4}+\cdots}}}} z=a0​+a1​+a2​+a3​+a4​+⋯1​1​1​1​
除了a0a_{0}a0​不确定之外,每个aia_{i}ai​ 都是正数;如果 zzz 是有理数,这样一大串的连分式会在某一个aia_{i}ai​ 处终止,但是当zzz是无理数时,那么它会一直的写下去! 非常的神奇!

57100=0+11+11+13+114\frac{57}{100}=0+\frac{1}{1+\frac{1}{1+\frac{1}{3+\frac{1}{14}}}} 10057​=0+1+1+3+141​1​1​1​
上面是一个典型的例子,在这里我们不追究到底如何完美的写出或是求出这样的连分式,我们只需要利用它的某些特殊性质!

再回忆一下大一上学习的级数收敛的相关知识点,结合我们这里的连分式,可以自然而然的联想到:将连分式在某一个aia_{i}ai​出截断,舍弃掉一部分无关紧要的小数,那么我们便可以得到该数的一个 “收敛” !即:

a0,a0+1a1,a0+1a1+1a2,a0+1a1+1a2+1a3,⋯a_{0}, \quad a_{0}+\frac{1}{a_{1}}, \quad a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}}}, \quad a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}+\frac{1}{a_{3}}}}, \cdots a0​,a0​+a1​1​,a0​+a1​+a2​1​1​,a0​+a1​+a2​+a3​1​1​1​,⋯

毫无疑问的是,随这aia_{i}ai​ 的增加,被舍弃的部分越来越不重要,整个式子最后就无限逼近 zzz ,还是可以用例题来理解:

57100\frac{57}{100}10057​ 的收敛连分式为:

0,0+11=1,0+11+11=12,0+11+11+13=470, \quad 0+\frac{1}{1}=1, \quad 0+\frac{1}{1+\frac{1}{1}}=\frac{1}{2}, \quad 0+\frac{1}{1+\frac{1}{1+\frac{1}{3}}}=\frac{4}{7} 0,0+11​=1,0+1+11​1​=21​,0+1+1+31​1​1​=74​
其实到a3a_{3}a3​ 时,已经非常接近了:
∣57100−47∣=1700\left|\frac{57}{100}-\frac{4}{7}\right|=\frac{1}{700} ∣∣∣∣​10057​−74​∣∣∣∣​=7001​

我们借此定义:

有人就会问了 ,这和傅里叶变化有啥关系呢?

将这个通过连分式实现收敛的过程应用到一个序列的离散傅里叶变换中一个波峰的位置,给我们猜测原始序列一个周期的长度的好方法!

好,现在我们已经具备了描述量子ShorShorShor 算法的所有完备知识点,接下来,正式进入量子傅里叶变换!

我们用经典的方式去计算长度为2n2^{n}2n 的傅里叶变换时所需要的时间复杂度为O(n2n)O(n2^{n})O(n2n),显然这很复杂,还不够快,唉!这时候,量子傅里叶就闪亮登场了,我们可以构造在量子计算机中构造一种新的结构去对应离散的傅里叶变换,使其时间复杂度在O(n2)O(n^{2})O(n2)!

我们都知道,nnn 个量子比特有N=2nN=2^{n}N=2n 个基态:
∣00…00⟩,∣00…01⟩,∣00…10⟩,…,∣11…11⟩|00 \ldots 00\rangle, \quad|00 \ldots 01\rangle, \quad|00 \ldots 10\rangle, \quad \ldots, \quad|11 \ldots 11\rangle ∣00…00⟩,∣00…01⟩,∣00…10⟩,…,∣11…11⟩

此时,前面刚刚复习的量子寄存器 不请自来:将把基态看作二进制数,用相应的十进制数来缩写它们,这样写:
∣0⟩=∣00…00⟩,∣1⟩=∣00…01⟩,∣2⟩=∣00…10⟩,…,∣2n−1⟩=∣11…11⟩|0\rangle=|00 \ldots 00\rangle, \quad|1\rangle=|00 \ldots 01\rangle, \quad|2\rangle=|00 \ldots 10\rangle, \quad \ldots, \quad\left|2^{n}-1\right\rangle=|11 \ldots 11\rangle ∣0⟩=∣00…00⟩,∣1⟩=∣00…01⟩,∣2⟩=∣00…10⟩,…,∣2n−1⟩=∣11…11⟩
这是后面一切步骤的前提,请牢记!

DdfinitionDdfinitionDdfinition QTF:QTF:QTF:

假设N=2tN=2^{t}N=2t,量子傅里叶变换就是作用在∣0⟩,∣1⟩,…,∣N−1⟩|0\rangle,|1\rangle, \ldots,|N-1\rangle∣0⟩,∣1⟩,…,∣N−1⟩ 基态上的线性变换,即:
∣j⟩↦1N∑k=0N−1e2πijk/N∣k⟩|j\rangle \mapsto \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} e^{2 \pi i j k / N}|k\rangle ∣j⟩↦N​1​k=0∑N−1​e2πijk/N∣k⟩
也可以简写为:
∑j=0N−1xj∣j⟩↦∑k=0N−1yk∣k⟩\sum_{j=0}^{N-1} x_{j}|j\rangle \mapsto \sum_{k=0}^{N-1} y_{k}|k\rangle j=0∑N−1​xj​∣j⟩↦k=0∑N−1​yk​∣k⟩
其中{yk}k=0N−1\left\{y_{k}\right\}_{k=0}^{N-1}{yk​}k=0N−1​ 是 {xj}j=0N−1\left\{x_{j}\right\}_{j=0}^{N-1}{xj​}j=0N−1​ 的离散傅里叶变换!

还是看一个例题:比如,当n=2n=2n=2 的时候,QTFQTFQTF 为:

∣0⟩↦12(∣0⟩+∣1⟩+∣2⟩+∣3⟩)∣1⟩↦12(∣0⟩+i∣1⟩−∣2⟩−i∣3⟩)∣2⟩↦12(∣0⟩−∣1⟩+∣2⟩−∣3⟩)∣3⟩↦12(∣0⟩−i∣1⟩−∣2⟩+i∣3⟩)\begin{array}{l} |0\rangle \mapsto \frac{1}{2}(|0\rangle+|1\rangle+|2\rangle+|3\rangle) \\ |1\rangle \mapsto \frac{1}{2}(|0\rangle+i|1\rangle-|2\rangle-i|3\rangle) \\ |2\rangle \mapsto \frac{1}{2}(|0\rangle-|1\rangle+|2\rangle-|3\rangle) \\ |3\rangle \mapsto \frac{1}{2}(|0\rangle-i|1\rangle-|2\rangle+i|3\rangle) \end{array} ∣0⟩↦21​(∣0⟩+∣1⟩+∣2⟩+∣3⟩)∣1⟩↦21​(∣0⟩+i∣1⟩−∣2⟩−i∣3⟩)∣2⟩↦21​(∣0⟩−∣1⟩+∣2⟩−∣3⟩)∣3⟩↦21​(∣0⟩−i∣1⟩−∣2⟩+i∣3⟩)​

我们也可以将上述结果用纠缠态的形式来表达:

∣00⟩↦12(∣00⟩+∣01⟩+∣10⟩+∣11⟩=12(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)∣01⟩↦12(∣00⟩+i∣01⟩−∣10⟩−i∣11⟩)=12(∣0⟩−∣1⟩)⊗(∣0⟩+i∣1⟩)∣10⟩↦12(∣00⟩−∣01⟩+∣10⟩−∣11⟩)=12(∣0⟩+∣1⟩)⊗(∣0⟩−∣1⟩)∣11⟩↦12(∣00⟩−i∣01⟩−∣10⟩+i∣11⟩)=12(∣0⟩−∣1⟩)⊗(∣0⟩−i∣1⟩)\begin{array}{l} |00\rangle \mapsto \frac{1}{2}\left(|00\rangle+|01\rangle+|10\rangle+|11\rangle=\frac{1}{2}(|0\rangle+|1\rangle) \otimes(|0\rangle+|1\rangle)\right. \\ |01\rangle \mapsto \frac{1}{2}(|00\rangle+i|01\rangle-|10\rangle-i|11\rangle)=\frac{1}{2}(|0\rangle-|1\rangle) \otimes(|0\rangle+i|1\rangle) \\ |10\rangle \mapsto \frac{1}{2}(|00\rangle-|01\rangle+|10\rangle-|11\rangle)=\frac{1}{2}(|0\rangle+|1\rangle) \otimes(|0\rangle-|1\rangle) \\ |11\rangle \mapsto \frac{1}{2}(|00\rangle-i|01\rangle-|10\rangle+i|11\rangle)=\frac{1}{2}(|0\rangle-|1\rangle) \otimes(|0\rangle-i|1\rangle) \end{array} ∣00⟩↦21​(∣00⟩+∣01⟩+∣10⟩+∣11⟩=21​(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)∣01⟩↦21​(∣00⟩+i∣01⟩−∣10⟩−i∣11⟩)=21​(∣0⟩−∣1⟩)⊗(∣0⟩+i∣1⟩)∣10⟩↦21​(∣00⟩−∣01⟩+∣10⟩−∣11⟩)=21​(∣0⟩+∣1⟩)⊗(∣0⟩−∣1⟩)∣11⟩↦21​(∣00⟩−i∣01⟩−∣10⟩+i∣11⟩)=21​(∣0⟩−∣1⟩)⊗(∣0⟩−i∣1⟩)​

这就使得我们可以轻易的构造一个量子比特门来计算QTFQTFQTF ,构造的R2R_{2}R2​ 如下:
R2=[100i]R_{2}=\left[\begin{array}{ll} 1 & 0 \\ 0 & i \end{array}\right] R2​=[10​0i​]

量子比特的电路图也就非常好画了:


最后面是一个交换门,调换一下两个量子比特的顺序!我们还是以一个例子来测试一下这个小小的电路:

  1. 将 HHH 门作用在 ∣0⟩|0\rangle∣0⟩ 上得到:∣0⟩↦12(∣0⟩+∣1⟩)|0\rangle\mapsto \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)∣0⟩↦2​1​(∣0⟩+∣1⟩)

  2. 再将刚才的受控R2R_{2}R2​门作用在叠加态的第一个量子比特上得到:12(∣0⟩+∣1⟩)↦12(∣0⟩+i∣1⟩)\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) \mapsto \frac{1}{\sqrt{2}}(|0\rangle+i|1\rangle) 2​1​(∣0⟩+∣1⟩)↦2​1​(∣0⟩+i∣1⟩)

  3. 紧接着,再将HHH门作用在已有叠加态的第二个量子比特上得到:12(∣0⟩−∣1⟩)\frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)2​1​(∣0⟩−∣1⟩),此时,我们会得到一个组合态:
    12(∣0⟩+i∣1⟩)⊗(∣0⟩−∣1⟩)\frac{1}{2}(|0\rangle+i|1\rangle) \otimes(|0\rangle-|1\rangle) 21​(∣0⟩+i∣1⟩)⊗(∣0⟩−∣1⟩)

  4. 最后,得到的结果为:12(∣0⟩−∣1⟩)⊗(∣0⟩+i∣1⟩)=12(∣00⟩+i∣01⟩−∣10⟩−i∣11⟩)\frac{1}{2}(|0\rangle-|1\rangle) \otimes(|0\rangle+i|1\rangle)=\frac{1}{2}(|00\rangle+i|01\rangle-|10\rangle-i|11\rangle)21​(∣0⟩−∣1⟩)⊗(∣0⟩+i∣1⟩)=21​(∣00⟩+i∣01⟩−∣10⟩−i∣11⟩)

除此之外,当nnn 增加时,QTFQTFQTF 也可以完美的应用,比如,当n=4n=4n=4 的时候,量子线路图为:

对于更一般的情况,即 nnn 为任何值时:Rk=[100e2πi/2k]R_{k}=\left[\begin{array}{cc}1 & 0 \\ 0 & e^{2 \pi i / 2^{k}}\end{array}\right]Rk​=[10​0e2πi/2k​]

说了那么多,我们最终的目标是什么? 求周期 rrr !!!

四. 大结局

还记得我们最原始的函数吗?
f(x)=axmodNf(x)=a^{x} \bmod N f(x)=axmodN
我们回到这个函数本身,只要寻找到它的周期,所有的谜底都将解开,ShorShorShor 算法也就大功完成了!

且看下图:

  1. 我们需要初始化两个量子寄存器,第二个量子寄存器用来储存函数ajmodNa^{j} \bmod NajmodN结果的量子态,其实n=⌈log⁡2N⌉n=\left\lceil\log _{2} N\right\rceiln=⌈log2​N⌉,也就是NNN 转化为二进制叠加态里面一串0与1的位数!

  2. 显然,既然第二个量子寄存器是储存结果的,那第一个量子寄存器就是存放我们输入的 ttt 个量子比特,也就是函数中aaa 的指数,即输入值!同时,在函数最后的测量结果中,y2t\frac{y}{2^{t}}2ty​ (0⩽y⩽N0\leqslant y\leqslant N0⩽y⩽N) 会逼近某个有理数sr\frac{s}{r}rs​ (这个的rrr就是我们要求的周期!),随着量子比特 ttt 的增加,结果也将越来越准确!

  3. 接下来的步骤就是用上述线路图中 UxU_{x}Ux​ 门来计算 x(modN)x(mod\; N)x(modN),话句话说就是:Ux∣y⟩=∣xymodN⟩U_{x}|y\rangle=|x y \bmod N\rangleUx​∣y⟩=∣xymodN⟩ for 0≤y<N0 \leq y<N0≤y<N,

  4. 然后用到了量子傅里叶变换了:起始的时候,前面也说过,我们用 HHH门 作用在输入的每个量子比特上,结果必然是前 ttt 个量子比特都变成了 12(∣0⟩+∣1⟩)\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)2​1​(∣0⟩+∣1⟩) ,将他们纠缠化之后便是:
    12t/2(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)⊗⋯⊗(∣0⟩+∣1⟩)=12t/2(∣0…00⟩+∣0…01⟩+⋯+∣1…11⟩)=12t/2∑j=02t−1∣j⟩\begin{aligned} \frac{1}{2^{t / 2}}(|0\rangle+|1\rangle) \otimes(|0\rangle+|1\rangle) \otimes \cdots \otimes(|0\rangle+|1\rangle) &=\frac{1}{2^{t / 2}}(|0 \ldots 00\rangle+|0 \ldots 01\rangle+\cdots+|1 \ldots 11\rangle) \\ &=\frac{1}{2^{t / 2}} \sum_{j=0}^{2^{t}-1}|j\rangle \end{aligned} 2t/21​(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)⊗⋯⊗(∣0⟩+∣1⟩)​=2t/21​(∣0…00⟩+∣0…01⟩+⋯+∣1…11⟩)=2t/21​j=0∑2t−1​∣j⟩​

  5. 下一步,线路中有许多受控UxU_{x}Ux​门,这些门可以通过平方来计算 aaa 的幂,根据第四步,初始化且纠缠过的第一个寄存器里面的值为 ∣j⟩=∣jt−1⋯j2j1j0⟩|j\rangle=\left|j_{t-1} \cdots j_{2} j_{1} j_{0}\right\rangle∣j⟩=∣jt−1​⋯j2​j1​j0​⟩,此时,如果j0=1j_{0}=1j0​=1,那么受控UxU_{x}Ux​门就用 aaa去乘以第二个寄存器,如果j1=1j_{1}=1j1​=1,UxU_{x}Ux​门就用 a2a^{2}a2去乘以第二个寄存器,以此类推,最后第二个寄存器得到的结果为:a∑jk2k=aja^{\sum j_{k} 2^{k}}=a^{j}a∑jk​2k=aj 。
    最后,系统的总状态为:
    12t/2∑j=02t−1∣j⟩∣ajmodN⟩\frac{1}{2^{t / 2}} \sum_{j=0}^{2^{t}-1}|j\rangle\left|a^{j} \bmod N\right\rangle 2t/21​j=0∑2t−1​∣j⟩∣∣​ajmodN⟩
    简写一下就是:
    12t/2∑j,bxj(b)∣j⟩∣b⟩\frac{1}{2^{t / 2}} \sum_{j, b} x_{j}^{(b)}|j\rangle|b\rangle 2t/21​j,b∑​xj(b)​∣j⟩∣b⟩
    其中,xj(b)=1x_{j}^{(b)}=1xj(b)​=1 当 b=aj(modN),b=a^{j}(\bmod N),b=aj(modN), 否则xj(b)=0x_{j}^{(b)}=0xj(b)​=0 ,因此{xj(b)}j=02t−1\left\{x_{j}^{(b)}\right\}_{j=0}^{2^{t}-1}{xj(b)​}j=02t−1​ 中一系列值的就和我们心心恋恋的周期 rrr 扯上关系了!

  6. 然后,我们将第一个寄存器用QTFQTFQTF 变换一下就得到了:
    12t/2∑k,byk(b)∣k⟩∣b⟩\frac{1}{2^{t / 2}} \sum_{k, b} y_{k}^{(b)}|k\rangle|b\rangle 2t/21​k,b∑​yk(b)​∣k⟩∣b⟩
    显然,对于任何一个已经固定的bbb ,{yk(b)}\left\{y_{k}^{(b)}\right\}{yk(b)​} 都是{xj(b)}\left\{x_{j}^{(b)}\right\}{xj(b)​} 的傅里叶变换, {xj(b)}\left\{x_{j}^{(b)}\right\}{xj(b)​} 是以rrr 为周期的周期函数,并且当yky_{k}yk​ 是 2tr\frac{2^{t}}{r}r2t​ 的整数倍的时候,∣yk(b)∣\left|y_{k}^{(b)}\right|∣∣∣​yk(b)​∣∣∣​ 是波峰 ,非常的大!

  7. 最后,我们需要测量第一个寄存器,将会有很高的概率得到一个是2tr\frac{2^{t}}{r}r2t​倍数的kkk 值,也就是说k2t\frac{k}{2^{t}}2tk​ 非常接近一个分母是 rrr 的有理数!

这个时候,我们前面花了较长篇幅介绍的连分式 在这里就大显神通了,一旦我们通过上面一系列步骤求得这个至关重要的 kkk 之后,就可以计算k2t\frac{k}{2^{t}}2tk​ 的连分式展开式,也就能近似收敛到rrr了!最后再用ar≡1(modN)a^{r} \equiv 1(\bmod N)ar≡1(modN) 来检测一下就行了。

看例题:

假设N=91N =91N=91,在选取一个随机整数a=2a=2a=2,然后为两个寄存器选择合适的大小:因为N<27N<2^{7}N<27,所以n=7n=7n=7,t=2n+1=15t=2n+1 = 15t=2n+1=15.

两个寄存器的初始状态为:∣0⟩⊗∣1⟩|0\rangle\otimes|1\rangle∣0⟩⊗∣1⟩ ,现在将第一个寄存器中放入经过HHH 门作用过的 输入数据(215−1=327672^{15}-1=32767215−1=32767):

(∣0⟩+∣1⟩+∣2⟩+⋯+∣32767⟩)⊗∣1⟩(|0\rangle+|1\rangle+|2\rangle+\cdots+|32767\rangle) \otimes|1\rangle (∣0⟩+∣1⟩+∣2⟩+⋯+∣32767⟩)⊗∣1⟩

接下来的工作就是针对第一个寄存器中的∣j⟩|j\rangle∣j⟩,用受控 UUU计算 ajmodNa^{j}mod\;NajmodN ,得到:
∣0⟩∣1⟩+∣1⟩∣2⟩+∣2⟩∣4⟩+∣3⟩∣8⟩+∣4⟩∣16⟩+∣5⟩∣32⟩+∣6⟩∣64⟩+∣7⟩∣37⟩+⋯|0\rangle|1\rangle+|1\rangle|2\rangle+|2\rangle|4\rangle+|3\rangle|8\rangle+|4\rangle|16\rangle+|5\rangle|32\rangle+|6\rangle|64\rangle+|7\rangle|37\rangle+\cdots ∣0⟩∣1⟩+∣1⟩∣2⟩+∣2⟩∣4⟩+∣3⟩∣8⟩+∣4⟩∣16⟩+∣5⟩∣32⟩+∣6⟩∣64⟩+∣7⟩∣37⟩+⋯

然后我们将QTFQTFQTF 作用在第一个寄存器中,,会发现有12个不一样的波峰,分别是:∣0⟩,∣2732⟩,∣5461⟩,∣8193⟩,∣10923⟩,∣13653⟩|0\rangle,|2732\rangle,|5461\rangle,|8193\rangle,|10923\rangle,|13653\rangle ∣0⟩,∣2732⟩,∣5461⟩,∣8193⟩,∣10923⟩,∣13653⟩

从中选取一个∣13653⟩|13653\rangle∣13653⟩ ,然后用连分式展开13653215=1365332768\frac{13653}{2^{15}}=\frac{13653}{32768}21513653​=3276813653​:

1365332768=12+12+12+1682+14\frac{13653}{32768}=\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{682+\frac{1}{4}}}}} 3276813653​=2+2+2+682+41​1​1​1​1​

列出收敛的数为:12,25,512⋯\frac{1}{2}, \frac{2}{5}, \frac{5}{12}\cdots21​,52​,125​⋯,其实这里可以随机检验一下,必然代入512\frac{5}{12}125​ ,那么这里周期就是121212了,检验一下:

ar/2a^{r/2}ar/2 就是262^{6}26, x=26=64(mod91)x=2^{6}=64(\bmod 91)x=26=64(mod91),那么gcd(63,91)=7gcd(63,91)=7gcd(63,91)=7,显然成立!

大功告成!

五.实验进展与面临困难

自从1994年舒尔算法被提出以来,有许多物理实验用来验证舒尔算法的正确性。

2001年,量子计算领域的开拓者之一,Chuang,设计了一个基于分子NMR(核磁共振)的实验分解整数15。该实验结果发表在了《自然》杂志上。这是第一次以实验的方式实现Shor算法的主要原理验证

然而目前为止,实验上,利用ShorShorShor算法可以分解的最大整数仅为21。换句话说,该实验的可拓展性非常具有挑战性,这也是量子计算机研制目前所面临的一个主要难题!

Shor算法 or量子傅里叶变换?相关推荐

  1. 量子计算Shor算法

    Shor算法是一种用于分解大整数的量子算法,它可以在多项式时间内分解大整数,而经典算法的时间复杂度是指数级别的.Shor算法的核心是量子傅里叶变换(QFT),该变换可用于找到一个周期函数的周期. 下面 ...

  2. 量子计算核心突破!Shor算法实现或使密码成摆设

    http://tech.sina.com.cn/d/i/2016-03-05/doc-ifxqafha0387393.shtml 互联网时代绝大多数的加密,都由RSA算法完成.过去我们认为RSA不可破 ...

  3. 《基于张量网络的机器学习入门》学习笔记8(Shor算法)

    <基于张量网络的机器学习入门>学习笔记8 Shor算法 来源 Shor算法的大致流程 因数分解 周期求取与量子傅里叶变换(QFT) Shor算法 来源 1994 1994 1994年,应用 ...

  4. 傅里叶级数、傅里叶变换、量子傅里叶变换(学习笔记)

    量子傅里叶变换 一开始看到这个题目我是这样的: 然后我开始了有关傅里叶变换的学习,我从某站上面截了一张图:顺便附上某站的链接,视觉上很享受. 形象展示傅里叶变换 一.傅里叶级数    在开始这一个部分 ...

  5. fft的c语言和matlab对比_傅里叶级数(FS)、傅里叶变换(FT)快速傅里叶变换(FFT)及量子傅里叶变换(QFT)之间推导关系...

    1 引言 傅里叶级数 (Fourier Series, FS) 是<高等数学>中遇到的一个重要的级数,它可以将任意一个满足狄利克雷条件的函数为一系列三角级数的和.最早由法国数学家傅里叶在研 ...

  6. 量子傅里叶变换(QFT)

    很长时间没有回顾QFT算法,等到用的时候,自己推导的时候忘得一干二净,用这篇博客总结一下推导过程. 目录 1.QFT介绍 1.1 离散傅里叶变换 1.2 量子傅里叶变换 1.3 QFT过程推导 2.Q ...

  7. 快速傅里叶变换(FFT)和量子傅里叶变换(QFT)

    这篇文章主要是为了实现量子傅里叶变换(Quantum Fourier Transform, QFT)的programming做准备,对QFT的算法以及它和在传统计算机上运行的FFT进行比较. 目录 1 ...

  8. 量子计算与量子信息之Grover算法的量子电路实现

    量子计算与量子信息之Grover算法的量子电路实现 文章目录 量子计算与量子信息之Grover算法的量子电路实现 一.简介 二.电路的逻辑示意图 即使你并没有完全掌握量子计算的基本内容,仍然可以看懂这 ...

  9. 致敬Peter Shor:重温量子计算的纠错与容错

    (图片来源:网络) 1994年,数学家Peter Shor还在新泽西州贝尔实验室工作.他发现,理论上,量子计算机在解决某些问题上的速度是可以比经典机器快得多得多的. 问题是:能造出量子计算机来吗? 怀 ...

最新文章

  1. 计算机导论成绩分为几部分,计算机导论复习题(选择部分)汇总.docx
  2. CWDM/DWDM是城域网最好的选择吗?
  3. RocketMQ集群启动报错:java.lang.RuntimeException: Lock failed,MQ already started
  4. 【转】MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)
  5. 枚举枚举和修改“最终静态”字段的方法
  6. Ubuntu 完全卸载 Apache2
  7. UE4 Pak 相关知识总结
  8. C++课设:GUI电话簿程序
  9. 本地通过secureCRT连接虚拟机中CentOS7
  10. 搜索引擎优化(step-by-step)
  11. 使用Struts标签的基本配置
  12. 【收藏】学习资源汇总
  13. linux下进入recovery mode 的单用户模式
  14. 推荐几个矢量图库网站
  15. springmvc考研交流平台 java ssm mysql
  16. 【Java案例】用户登录注册
  17. ifconfig命令用法举例
  18. 谈谈红楼梦(第16-18回)
  19. 孢子起源java_孢子的起源
  20. 如何在winows的PPT里面使用醒目的思源系列字体(思源宋体/黑体)

热门文章

  1. 三子棋(井字棋) 保姆级详解
  2. 微信小程序之支付密码输入
  3. 统一用户认证和单点登录和授权的原理与流程
  4. java开发实战小参考常见问题及处理
  5. 网易云催生云计算更多可能性
  6. eCharts——柱状图中的柱体颜色渐变
  7. 内外部函数和内存模型
  8. 解决pytorch官网下载慢ubuntu16.04+anaconda3(python3.6)+pytorch0.4.1+cuda9.0+cudnn7.1安装指南
  9. html依次显示选中的值,html 快速布局 - osc_pw143nru的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. ZBrush软件中的笔触类型