紧接着Grover 算法的热度,第二个在量子机器学习领域至关重要的算法 —— shor算法将成为本期博客所要传阐述的主要内容!
尽管我们都知道一个数,无论大小,都可以被分解成素数的乘积,也就是著名的质因数分解,但是对于较大位数的数字来说,能明确的找到质数因子却是一个非常困难的问题!在许多领域上面,大数的质因数分解被应用在密码保护等技术领域(大数的质因数分解主要原理为:通常证明两个更小的数为质数更容易,而要分解这两个质数的乘积,难度呈指数增长。加密算法生成两个质数并保密,使用其乘积来参与加解密;破解时需要分解乘积得到两个原质数,难度比生成密钥和加解密时要难得多得多,代表性的算法为RSA)。但是Shor’s algorithm可以在多项式时间内完成大整数质因数分解。所以Shor’s algorithm从诞生之时,就和以RSA算法为根基的加密技术形成了不可调和的矛盾!
随着横坐标上大数 位数的持续增加,普通的质因数分解算法显然也随之逐步升高,但是Shor’s algorithm 在这里表现的异常优秀!
下面,我们直入主干,看看 S h o r ′ s Shor's Shor′s算法的具体内涵!
完整的Shor算法是需要经典计算机和量子计算机协作完成的。其中量子计算机实现一个周期查找的函数,经典计算机负责整个算法流程的控制,以及调用量子算法。我们可以简单的将 S h o r ′ s Shor's Shor′s算法分成两个部分:
第一部分是将因子分解问题转化成周期问题,这部分可以用传统方式实现。
第二部分则是使用量子手段来搜寻这个周期,这一部分是舒尔算法中体现量子加速的主要部分!
其中这个第一部分又可以分为5个小步骤,一起来看看吧:
首先确定问题描述:给定一个合成数 N N N,找到整数 P P P 在和 N N N 之间且不包含1和 N N N ,并且 N N N 整除于 p p p :
第一步:随机选取一个小于 N N N的自然数 a a a。
第二步:计算 a a a 与 N N N 的最小公约数,即 g c d ( a , N ) gcd(a,N) gcd(a,N) ,使用辗转相除法求解即可!
第三步:若 g c d ( a , N ) > 1 gcd(a,N)>1 gcd(a,N)>1,直接得到因子;否则当 g c d ( a , N ) = 1 gcd(a,N)= 1 gcd(a,N)=1 时,计算函数:
f ( x ) = a x m o d N f(x)=a^{x} \bmod N f(x)=axmodN
模运算大家应该都是学习过的!其实这是一个周期函数,我们要做的就是找到它的最小正周期 r r r ,使得 f ( x + r ) = f ( r ) f(x+r)=f(r) f(x+r)=f(r)
第四步:如果最小正周期是奇数,回到第一步,从头再来。
第五步:如果 a r / 2 ≡ − 1 ( m o d N ) a^{r / 2} \equiv-1(\bmod N) ar/2≡−1(modN),依然返回第一步;反之,再继续计算 g c d ( a r / 2 + 1 , N ) g c d\left(a^{r / 2}+1, N\right) gcd(ar/2+1,N) 和 g c d ( a r / 2 − 1 , N ) g c d\left(a^{r / 2}-1, N\right) gcd(ar/2−1,N),并验证二者结果是不是与 N N N 互质的,是,则分解完成!
我们来整体的梳理一下过程:第一个步骤就是遍历小于 N N N的整数;第二步其实就是碰碰运气,如果 a a a和 N N N的最大公约数不是1,那就是运气好,算法直接结束了;如果最大公约数是1,则调用周期查找子程序计算 f ( x ) = a x m o d N f(x)=a^{x}modN f(x)=axmodN这个函数的阶数 r r r。
接下来:
f ( 0 ) = f ( 0 + r ) = a r m o d N = 1 m o d N f(0)=f(0+r)=a^{r} \bmod N=1 \bmod N f(0)=f(0+r)=armodN=1modN
所以可得: a r − 1 = 0 m o d N a^{r}-1=0 \bmod N ar−1=0modN
若 r r r 为维数,而且 a r / 2 a^{r/2} ar/2 不等于-1,得:
( a r / 2 + 1 ) ( a r / 2 − 1 ) = 0 m o d N \left(a^{r / 2}+1\right)\left(a^{r / 2}-1\right)=0 \bmod N (ar/2+1)(ar/2−1)=0modN
根据前面的推导我们知道 ( a r / 2 + 1 ) ( a r / 2 − 1 ) \left(a^{r/2}+1\right)\left(a^{r / 2}-1\right) (ar/2+1)(ar/2−1)和 N N N 之间存在不是 1 1 1的最大公约数,也就是 ( a r / 2 + 1 ) \left(a^{r / 2}+1\right) (ar/2+1) 和 ( a r / 2 − 1 ) \left(a^{r / 2}-1\right) (ar/2−1) 之间分别存在非1的最大公约数,再分别把他们求出来验证一下即可!
以 N = 15 N=15 N=15 为例,不妨取 g c d ( 7 , 15 ) = 1 gcd(7,15)=1 gcd(7,15)=1,因此,构造函数为 f ( x ) = 7 x m o d e 15 f(x)=7^{x}mode 15 f(x)=7xmode15 有:
f ( 0 ) = 7 0 m o d 15 = 1 , f ( 1 ) = 7 1 m o d 15 = 7 , f ( 2 ) = 7 2 m o d 15 = 4 , f ( 3 ) = 7 3 m o d 15 = 13 f ( 4 ) = 7 4 m o d 15 = 1 , f ( 5 ) = 7 5 m o d 15 = 7 , f ( 6 ) = 7 6 m o d 15 = 4 , f ( 7 ) = 7 7 m o d 15 = 13 f ( 8 ) = 7 8 m o d 15 = 1 , f ( 9 ) = 7 9 m o d 15 = 7 , f ( 10 ) = 7 10 m o d 15 = 4 , f ( 11 ) = 7 11 m o d 15 = 13 f ( 12 ) = 7 12 m o d 15 = 1 , f ( 13 ) = 7 13 m o d 15 = 7 , f ( 14 ) = 7 14 m o d 15 = 4 , f ( 15 ) = 7 15 m o d 15 = 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 = 4 r=4 r=4,且 a r 2 m o d N = 7 4 2 m o d 15 = 4 ≠ 1 a^{\frac{r}{2}} \bmod N=7^{\frac{4}{2}} \bmod 15=4 \neq 1 a2rmodN=724mod15=4=1 ,于是我们得到的两个质数因子为:
p = gcd ( 50 , 15 ) = 5 , q = gcd ( 48 , 15 ) = 3 p=\operatorname{gcd}(50,15)=5, \quad q=\operatorname{gcd}(48,15)=3 p=gcd(50,15)=5,q=gcd(48,15)=3
结合例题数据后看上面的理论介绍,就会非常的简单!
像 N = 15 N=15 N=15 这种情况,我们可以简单的口算出周期,但是当数字的位数非常多的时候,显然是非常麻烦的,这里的周期查找算法为我们很好的解决了这一问题!
接下来的部分可以说是 S h o r Shor Shor 算法最核心的部分了:因为舒尔算法的基本思想是利用量子存储以及量子并行性,同时得到所有可能状态模数运算后的函数值,对函数值进行测量后利用量子纠缠得到函数值所对应的所有原像的叠加态。最后利用量子傅里叶变换得到周期!
主要分为以下四个步骤:
1. 利用Hadamard门得到所有可能态的叠加态;
2. 利用量子并行性,执行量子模数运算;
3. 执行对计算结果的测量,利用量子纠缠性,得到原像集的叠加态;
4. 执行量子傅立叶变换,得到周期。
在推导周期查找算法之前,我们先回顾一下什么叫量子寄存器,顺便简单了解啥叫量子傅里叶变换!
量子寄存器:通常情况下,仅以单个量子位是无法完成既定计算目标,像传统计算机一样采用具有多量子位的量子寄存器不失为一种方法,通俗来说量子寄存器就是量子比特的集合,它是位串,其长度决定了它可以存储的信息量。在叠加时,寄存器中的每个量子位是 和 的叠加,因此,长度为n个量子位的寄存器是所有2n个可能的用n位表示的长度量子位串的叠加,换句话说,长度为n的量子寄存器的状态空间是n位基向量的线性组合,每个长度为2n,故我们可以得到:
∣ ψ n ⟩ = ∑ i = 0 2 n − 1 a i ∣ i ⟩ \left|\psi_{n}\right\rangle=\sum_{i=0}^{2^{n}-1} a_{i}|i\rangle ∣ψn⟩=i=0∑2n−1ai∣i⟩
在了解量子傅里叶之前,先回顾到我们之前学习过的经典傅里叶级数和傅里叶变换中的复习中来,忘记的小盆友可以猛戳这里!
其中,对于给定的一系列复数: x 0 , x 1 , … , x N − 1 x_{0}, x_{1}, \ldots, x_{N-1} x0,x1,…,xN−1,我们定义它的离散傅里叶变换为: y 0 , y 1 , … , y N − 1 y_{0}, y_{1}, \ldots, y_{N-1} y0,y1,…,yN−1,即:
y k = 1 N ∑ j = 0 N − 1 x j ω j k , where ω = e 2 π i / N y_{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=N1j=0∑N−1xjωjk, where ω=e2πi/N
也可以展开一下(不要忘了 e i θ = c o s θ + i s i n θ e^{i\theta } = cos \theta +i sin\theta eiθ=cosθ+isinθ):
y 0 = 1 N ( x 0 + x 1 + x 2 + x 3 + ⋯ ) y 1 = 1 N ( x 0 + x 1 ω + x 2 ω 2 + x 3 ω 3 + ⋯ ) y 2 = 1 N ( x 0 + x 1 ω 2 + x 2 ω 4 + x 3 ω 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=N1(x0+x1+x2+x3+⋯)y1=N1(x0+x1ω+x2ω2+x3ω3+⋯)y2=N1(x0+x1ω2+x2ω4+x3ω6+⋯)…
显然,我们发现从 { x i } \left\{ x_{i}\right \} {xi} 到 { y k } \left\{ y_{k}\right \} {yk} 是一个线性映射,并且是可逆的,所以计算从 { y k } \left\{ y_{k}\right \} {yk} 到 { x i } \left\{ x_{i}\right \} {xi} 的映射也是不难的:
x i = 1 N ∑ k = 0 N − 1 y k ω − j k x_{i}=\frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} y_{k} \omega^{-j k} xi=N1k=0∑N−1ykω−jk
看个例题:假设 N = 100 N=100 N=100, { x i } \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 \ldots 1,0,0,0,0,0,0,1,0,0,0,0,0,0,… ,使得 y 0 , y 1 , … , y 99 y_{0}, y_{1}, \ldots, y_{99} y0,y1,…,y99 是 x 0 , x 1 , … , x 99 x_{0}, x_{1}, \ldots, x_{99} x0,x1,…,x99 的离散傅里叶变换,那么下图展示了在 0 ≤ k ≤ 99 0 \leq k \leq 99 0≤k≤99 时的 ∣ y k ∣ \left | y_{k}\right | ∣yk∣:
我们可以从图中明显的看到有7个较大的峰值,其都落在 100 7 ≈ 14.2857 … \frac{100}{7} \approx 14.2857 \ldots 7100≈14.2857… 的倍数处,正好与 { x i } \left\{ x_{i}\right \} {xi}的周期为7 相对应!而图中波谷与波峰似乎看上去不太完美的原因是 100不能整除7 ,否则,不仅对称,而且波谷都为0 ,波峰值相同!
那我们如何执果索因,找到这个7呢?
在高中数学竞赛中,学习过一种非常有用的无理数表达方式: continued fractions,即对于一个实数 z z z 它的连分式为: z = a 0 + 1 a 1 + 1 a 2 + 1 a 3 + 1 a 4 + ⋯ 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+⋯1111
除了 a 0 a_{0} a0不确定之外,每个 a i a_{i} ai 都是正数;如果 z z z 是有理数,这样一大串的连分式会在某一个 a i a_{i} ai 处终止,但是当 z z z是无理数时,那么它会一直的写下去! 非常的神奇!
57 100 = 0 + 1 1 + 1 1 + 1 3 + 1 14 \frac{57}{100}=0+\frac{1}{1+\frac{1}{1+\frac{1}{3+\frac{1}{14}}}} 10057=0+1+1+3+141111
上面是一个典型的例子,在这里我们不追究到底如何完美的写出或是求出这样的连分式,我们只需要利用它的某些特殊性质!
再回忆一下大一上学习的级数收敛的相关知识点,结合我们这里的连分式,可以自然而然的联想到:将连分式在某一个 a i a_{i} ai出截断,舍弃掉一部分无关紧要的小数,那么我们便可以得到该数的一个 “收敛” !即:
a 0 , a 0 + 1 a 1 , a 0 + 1 a 1 + 1 a 2 , a 0 + 1 a 1 + 1 a 2 + 1 a 3 , ⋯ 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+a11,a0+a1+a211,a0+a1+a2+a3111,⋯
毫无疑问的是,随这 a i a_{i} ai 的增加,被舍弃的部分越来越不重要,整个式子最后就无限逼近 z z z ,还是可以用例题来理解:
57 100 \frac{57}{100} 10057 的收敛连分式为:
0 , 0 + 1 1 = 1 , 0 + 1 1 + 1 1 = 1 2 , 0 + 1 1 + 1 1 + 1 3 = 4 7 0, \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+111=21,0+1+1+3111=74
其实到 a 3 a_{3} a3 时,已经非常接近了:
∣ 57 100 − 4 7 ∣ = 1 700 \left|\frac{57}{100}-\frac{4}{7}\right|=\frac{1}{700} ∣∣∣∣10057−74∣∣∣∣=7001
将这个通过连分式实现收敛的过程应用到一个序列的离散傅里叶变换中一个波峰的位置,给我们猜测原始序列一个周期的长度的好方法!
好,现在我们已经具备了描述量子 S h o r Shor Shor 算法的所有完备知识点,接下来,正式进入量子傅里叶变换!
我们用经典的方式去计算长度为 2 n 2^{n} 2n 的傅里叶变换时所需要的时间复杂度为 O ( n 2 n ) O(n2^{n}) O(n2n),显然这很复杂,还不够快,唉!这时候,量子傅里叶就闪亮登场了,我们可以构造在量子计算机中构造一种新的结构去对应离散的傅里叶变换,使其时间复杂度在 O ( n 2 ) O(n^{2}) O(n2)!
我们都知道, n n n 个量子比特有 N = 2 n N=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 ⟩ , … , ∣ 2 n − 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⟩
这是后面一切步骤的前提,请牢记!
D d f i n i t i o n Ddfinition Ddfinition Q T F : QTF: QTF:
假设 N = 2 t N=2^{t} N=2t,量子傅里叶变换就是作用在 ∣ 0 ⟩ , ∣ 1 ⟩ , … , ∣ N − 1 ⟩ |0\rangle,|1\rangle, \ldots,|N-1\rangle ∣0⟩,∣1⟩,…,∣N−1⟩ 基态上的线性变换,即:
∣ j ⟩ ↦ 1 N ∑ k = 0 N − 1 e 2 π i j k / N ∣ k ⟩ |j\rangle \mapsto \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} e^{2 \pi i j k / N}|k\rangle ∣j⟩↦N1k=0∑N−1e2πijk/N∣k⟩
也可以简写为:
∑ j = 0 N − 1 x j ∣ j ⟩ ↦ ∑ k = 0 N − 1 y k ∣ k ⟩ \sum_{j=0}^{N-1} x_{j}|j\rangle \mapsto \sum_{k=0}^{N-1} y_{k}|k\rangle j=0∑N−1xj∣j⟩↦k=0∑N−1yk∣k⟩
其中 { y k } k = 0 N − 1 \left\{y_{k}\right\}_{k=0}^{N-1} {yk}k=0N−1 是 { x j } j = 0 N − 1 \left\{x_{j}\right\}_{j=0}^{N-1} {xj}j=0N−1 的离散傅里叶变换!
还是看一个例题:比如,当 n = 2 n=2 n=2 的时候, Q T F QTF QTF 为:
∣ 0 ⟩ ↦ 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ + ∣ 2 ⟩ + ∣ 3 ⟩ ) ∣ 1 ⟩ ↦ 1 2 ( ∣ 0 ⟩ + i ∣ 1 ⟩ − ∣ 2 ⟩ − i ∣ 3 ⟩ ) ∣ 2 ⟩ ↦ 1 2 ( ∣ 0 ⟩ − ∣ 1 ⟩ + ∣ 2 ⟩ − ∣ 3 ⟩ ) ∣ 3 ⟩ ↦ 1 2 ( ∣ 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 ⟩ ↦ 1 2 ( ∣ 00 ⟩ + ∣ 01 ⟩ + ∣ 10 ⟩ + ∣ 11 ⟩ = 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ∣ 01 ⟩ ↦ 1 2 ( ∣ 00 ⟩ + i ∣ 01 ⟩ − ∣ 10 ⟩ − i ∣ 11 ⟩ ) = 1 2 ( ∣ 0 ⟩ − ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ + i ∣ 1 ⟩ ) ∣ 10 ⟩ ↦ 1 2 ( ∣ 00 ⟩ − ∣ 01 ⟩ + ∣ 10 ⟩ − ∣ 11 ⟩ ) = 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ − ∣ 1 ⟩ ) ∣ 11 ⟩ ↦ 1 2 ( ∣ 00 ⟩ − i ∣ 01 ⟩ − ∣ 10 ⟩ + i ∣ 11 ⟩ ) = 1 2 ( ∣ 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⟩)
这就使得我们可以轻易的构造一个量子比特门来计算 Q T F QTF QTF ,构造的 R 2 R_{2} R2 如下:
R 2 = [ 1 0 0 i ] R_{2}=\left[\begin{array}{ll} 1 & 0 \\ 0 & i \end{array}\right] R2=[100i]
量子比特的电路图也就非常好画了:
最后面是一个交换门,调换一下两个量子比特的顺序!我们还是以一个例子来测试一下这个小小的电路:
将 H H H 门作用在 ∣ 0 ⟩ |0\rangle ∣0⟩ 上得到: ∣ 0 ⟩ ↦ 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) |0\rangle\mapsto \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) ∣0⟩↦21(∣0⟩+∣1⟩)
再将刚才的受控 R 2 R_{2} R2门作用在叠加态的第一个量子比特上得到: 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ↦ 1 2 ( ∣ 0 ⟩ + i ∣ 1 ⟩ ) \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) \mapsto \frac{1}{\sqrt{2}}(|0\rangle+i|1\rangle) 21(∣0⟩+∣1⟩)↦21(∣0⟩+i∣1⟩)
紧接着,再将 H H H门作用在已有叠加态的第二个量子比特上得到: 1 2 ( ∣ 0 ⟩ − ∣ 1 ⟩ ) \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle) 21(∣0⟩−∣1⟩),此时,我们会得到一个组合态:
1 2 ( ∣ 0 ⟩ + i ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ − ∣ 1 ⟩ ) \frac{1}{2}(|0\rangle+i|1\rangle) \otimes(|0\rangle-|1\rangle) 21(∣0⟩+i∣1⟩)⊗(∣0⟩−∣1⟩)
最后,得到的结果为: 1 2 ( ∣ 0 ⟩ − ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ + i ∣ 1 ⟩ ) = 1 2 ( ∣ 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⟩)
除此之外,当 n n n 增加时, Q T F QTF QTF 也可以完美的应用,比如,当 n = 4 n=4 n=4 的时候,量子线路图为:
对于更一般的情况,即 n n n 为任何值时: R k = [ 1 0 0 e 2 π i / 2 k ] R_{k}=\left[\begin{array}{cc}1 & 0 \\ 0 & e^{2 \pi i / 2^{k}}\end{array}\right] Rk=[100e2πi/2k]
说了那么多,我们最终的目标是什么? 求周期 r r r !!!
还记得我们最原始的函数吗?
f ( x ) = a x m o d N f(x)=a^{x} \bmod N f(x)=axmodN
我们回到这个函数本身,只要寻找到它的周期,所有的谜底都将解开, S h o r Shor Shor 算法也就大功完成了!
且看下图:
我们需要初始化两个量子寄存器,第二个量子寄存器用来储存函数 a j m o d N a^{j} \bmod N ajmodN结果的量子态,其实 n = ⌈ log 2 N ⌉ n=\left\lceil\log _{2} N\right\rceil n=⌈log2N⌉,也就是 N N N 转化为二进制叠加态里面一串0与1的位数!
显然,既然第二个量子寄存器是储存结果的,那第一个量子寄存器就是存放我们输入的 t t t 个量子比特,也就是函数中 a a a 的指数,即输入值!同时,在函数最后的测量结果中, y 2 t \frac{y}{2^{t}} 2ty ( 0 ⩽ y ⩽ N 0\leqslant y\leqslant N 0⩽y⩽N) 会逼近某个有理数 s r \frac{s}{r} rs (这个的 r r r就是我们要求的周期!),随着量子比特 t t t 的增加,结果也将越来越准确!
接下来的步骤就是用上述线路图中 U x U_{x} Ux 门来计算 x ( m o d N ) x(mod\; N) x(modN),话句话说就是: U x ∣ y ⟩ = ∣ x y m o d N ⟩ U_{x}|y\rangle=|x y \bmod N\rangle Ux∣y⟩=∣xymodN⟩ for 0 ≤ y < N 0 \leq y
然后用到了量子傅里叶变换了:起始的时候,前面也说过,我们用 H H H门 作用在输入的每个量子比特上,结果必然是前 t t t 个量子比特都变成了 1 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) 21(∣0⟩+∣1⟩) ,将他们纠缠化之后便是:
1 2 t / 2 ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ⊗ ( ∣ 0 ⟩ + ∣ 1 ⟩ ) ⊗ ⋯ ⊗ ( ∣ 0 ⟩ + ∣ 1 ⟩ ) = 1 2 t / 2 ( ∣ 0 … 00 ⟩ + ∣ 0 … 01 ⟩ + ⋯ + ∣ 1 … 11 ⟩ ) = 1 2 t / 2 ∑ j = 0 2 t − 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/21j=0∑2t−1∣j⟩
下一步,线路中有许多受控 U x U_{x} Ux门,这些门可以通过平方来计算 a a a 的幂,根据第四步,初始化且纠缠过的第一个寄存器里面的值为 ∣ j ⟩ = ∣ j t − 1 ⋯ j 2 j 1 j 0 ⟩ |j\rangle=\left|j_{t-1} \cdots j_{2} j_{1} j_{0}\right\rangle ∣j⟩=∣jt−1⋯j2j1j0⟩,此时,如果 j 0 = 1 j_{0}=1 j0=1,那么受控 U x U_{x} Ux门就用 a a a去乘以第二个寄存器,如果 j 1 = 1 j_{1}=1 j1=1, U x U_{x} Ux门就用 a 2 a^{2} a2去乘以第二个寄存器,以此类推,最后第二个寄存器得到的结果为: a ∑ j k 2 k = a j a^{\sum j_{k} 2^{k}}=a^{j} a∑jk2k=aj 。
最后,系统的总状态为:
1 2 t / 2 ∑ j = 0 2 t − 1 ∣ j ⟩ ∣ a j m o d N ⟩ \frac{1}{2^{t / 2}} \sum_{j=0}^{2^{t}-1}|j\rangle\left|a^{j} \bmod N\right\rangle 2t/21j=0∑2t−1∣j⟩∣∣ajmodN⟩
简写一下就是:
1 2 t / 2 ∑ j , b x j ( b ) ∣ j ⟩ ∣ b ⟩ \frac{1}{2^{t / 2}} \sum_{j, b} x_{j}^{(b)}|j\rangle|b\rangle 2t/21j,b∑xj(b)∣j⟩∣b⟩
其中, x j ( b ) = 1 x_{j}^{(b)}=1 xj(b)=1 当 b = a j ( m o d N ) , b=a^{j}(\bmod N), b=aj(modN), 否则 x j ( b ) = 0 x_{j}^{(b)}=0 xj(b)=0 ,因此 { x j ( b ) } j = 0 2 t − 1 \left\{x_{j}^{(b)}\right\}_{j=0}^{2^{t}-1} {xj(b)}j=02t−1 中一系列值的就和我们心心恋恋的周期 r r r 扯上关系了!
然后,我们将第一个寄存器用 Q T F QTF QTF 变换一下就得到了:
1 2 t / 2 ∑ k , b y k ( b ) ∣ k ⟩ ∣ b ⟩ \frac{1}{2^{t / 2}} \sum_{k, b} y_{k}^{(b)}|k\rangle|b\rangle 2t/21k,b∑yk(b)∣k⟩∣b⟩
显然,对于任何一个已经固定的 b b b , { y k ( b ) } \left\{y_{k}^{(b)}\right\} {yk(b)} 都是 { x j ( b ) } \left\{x_{j}^{(b)}\right\} {xj(b)} 的傅里叶变换, { x j ( b ) } \left\{x_{j}^{(b)}\right\} {xj(b)} 是以 r r r 为周期的周期函数,并且当 y k y_{k} yk 是 2 t r \frac{2^{t}}{r} r2t 的整数倍的时候, ∣ y k ( b ) ∣ \left|y_{k}^{(b)}\right| ∣∣∣yk(b)∣∣∣ 是波峰 ,非常的大!
最后,我们需要测量第一个寄存器,将会有很高的概率得到一个是 2 t r \frac{2^{t}}{r} r2t倍数的 k k k 值,也就是说 k 2 t \frac{k}{2^{t}} 2tk 非常接近一个分母是 r r r 的有理数!
这个时候,我们前面花了较长篇幅介绍的连分式 在这里就大显神通了,一旦我们通过上面一系列步骤求得这个至关重要的 k k k 之后,就可以计算 k 2 t \frac{k}{2^{t}} 2tk 的连分式展开式,也就能近似收敛到 r r r了!最后再用 a r ≡ 1 ( m o d N ) a^{r} \equiv 1(\bmod N) ar≡1(modN) 来检测一下就行了。
看例题:
假设 N = 91 N =91 N=91,在选取一个随机整数 a = 2 a=2 a=2,然后为两个寄存器选择合适的大小:因为 N < 2 7 N<2^{7} N<27,所以 n = 7 n=7 n=7, t = 2 n + 1 = 15 t=2n+1 = 15 t=2n+1=15.
两个寄存器的初始状态为: ∣ 0 ⟩ ⊗ ∣ 1 ⟩ |0\rangle\otimes|1\rangle ∣0⟩⊗∣1⟩ ,现在将第一个寄存器中放入经过 H H H 门作用过的 输入数据( 2 15 − 1 = 32767 2^{15}-1=32767 215−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⟩,用受控 U U U计算 a j m o d N a^{j}mod\;N ajmodN ,得到:
∣ 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⟩+⋯
然后我们将 Q T F QTF QTF 作用在第一个寄存器中,,会发现有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⟩ ,然后用连分式展开 13653 2 15 = 13653 32768 \frac{13653}{2^{15}}=\frac{13653}{32768} 21513653=3276813653:
13653 32768 = 1 2 + 1 2 + 1 2 + 1 682 + 1 4 \frac{13653}{32768}=\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{682+\frac{1}{4}}}}} 3276813653=2+2+2+682+411111
列出收敛的数为: 1 2 , 2 5 , 5 12 ⋯ \frac{1}{2}, \frac{2}{5}, \frac{5}{12}\cdots 21,52,125⋯,其实这里可以随机检验一下,必然代入 5 12 \frac{5}{12} 125 ,那么这里周期就是 12 12 12了,检验一下:
a r / 2 a^{r/2} ar/2 就是 2 6 2^{6} 26, x = 2 6 = 64 ( m o d 91 ) x=2^{6}=64(\bmod 91) x=26=64(mod91),那么 g c d ( 63 , 91 ) = 7 gcd(63,91)=7 gcd(63,91)=7,显然成立!
大功告成!
自从1994年舒尔算法被提出以来,有许多物理实验用来验证舒尔算法的正确性。
2001年,量子计算领域的开拓者之一,Chuang,设计了一个基于分子NMR(核磁共振)的实验分解整数15。该实验结果发表在了《自然》杂志上。这是第一次以实验的方式实现Shor算法的主要原理验证
然而目前为止,实验上,利用 S h o r Shor Shor算法可以分解的最大整数仅为21。换句话说,该实验的可拓展性非常具有挑战性,这也是量子计算机研制目前所面临的一个主要难题!