一些前置知识#
数论知识#
我们说一个数a是素数(prime number),是指它只有1和它本身作为因数(即a只能被1和它本身整除)。举一些例子,比如35,它的因子是:1,5,7,35,所以他不是素数,又比如71,它的因子是:1,71,所以它是素数。
如果我们说两个自然数a和b共素(互质),也就是说,他们的最大公因数为1(记为gcd(a,b)=1)。
最大公因数(the greatest common divisor)#
两个数a和b的最大公因数为gcd(a,b),具体的计算过程如下:
-
写出a的因子
-
写出b的因子
-
最后通过比较找到两者都有的最大因子。
举个例子,比如计算24和88的最大公因数:
1. 24的因子有:1,2,3,4,6,8,12,24
1. 88的因子有:1,2,4,8,11,22,44。
我们说一个整数的模N,即用这个数Q去除以N取余数的操作,那么自然而然这个可能的余数就会组成一个模N意义下的整数集合ZN(即所有可能的余数)是:
ZN={0,1,2,…,N−1}比如,Q=6,N=5,那么Q(modN)=6%5=1
模N的乘法群#
模N群就是有所有与N共素的整数在模N意义下构成的乘法群,这个群记为ZN∗,群中的元素a满足条件:
a∈Z,1≤a<N,gcd(a,N)=1该群的运算是模N下的乘法运算:
a⋅b(modN)该群的性质有:
-
单位元1的存在性:gcd(1,N)=1,符合模N群的定义,即单位元1存在并且a⋅1≡a(modN)。
-
逆元的存在性:∀a∈ZN∗,∃a−1 ,使得 :
a⋅a−1=1(modN)
-
封闭性:如果a,b∈ZN∗,则有gcd(ab,N)=1,即a,b的乘积也在模N群中
-
阶为r,表示与N互质的整数的个数,即这个群的大小
下图就是单位元上的六个单位根,可以将其看成模6群的几何结构(因为两者同构)

抽屉原理#
在数学上,抽屉原理是指当n个物品放入m个抽屉时,若n>m,则至少有一个抽屉里面有多个物品。比如一个数量足够大的人群中,一定有同一天出生的人,但是抽屉原理不会告诉你他们是谁?但是一定存在。
时间复杂度#
在计算机科学中,时间复杂度是一个函数,它定性的描述某一个算法的运行时间随着输入规模增长的速度。比如说一个算法的时间复杂度是O(n),那么当该算法的输入变成两倍,那么运行时间也变成两倍。这么做的意义是:衡量算法的实际表现,因为在实际使用一个算法的时候,往往不会去考虑输入数据的规模,所以一个复杂度小的算法对于输入的数据的适应性就好。下面是常见的时间复杂度的排序(从上到下是由快到慢):
| 时间复杂度 | 名称 |
|---|
| O(1) | 常数时间 |
| O(logn) | 对数时间 |
| O(n) | 线性时间 |
| O(nlogn) | 线性对数时间 |
| O(n2) | 二次时间(平方) |
| O(n3) | 三次时间(立方) |
| O(2n) | 指数时间 |
| O(n!) | 阶乘时间 |
量子相位估计:#

量子相位估计(Quantum Phase Estimation),和他的名字一样是估计相位,这个相位是算符U本征方程U∣ψ⟩=e2πiθ∣ψ⟩中的θ。具体流程如下:
-
首先准备好一个初态∣Ψ0⟩=∣0⟩⊗n∣ψ⟩,其中∣ψ⟩=∑j=02m−1αj∣j⟩是代表m个qubit的状态,其中j代表不同的长度为m的二进制串的值。
-
然后对前面n个qubit做Handmard 门操作H⊗n⊗Im,得到态∣Ψ1⟩,即:
∣Ψ1⟩=(H⊗n⊗Im)(∣Ψ0⟩)=22n1(∣0⟩+∣1⟩)⊗n∣ψ⟩=2n/21j=0∑2n−1∣j⟩∣ψ⟩
- 对态∣Ψ1⟩做受控U门操作,U=∑k=02n−1∣k⟩⟨k∣⊗Uk,由此得到态∣Ψ2⟩:
∣Ψ2⟩=k=0∑2n−1∣k⟩⟨k∣⊗Uk(2n/21j=0∑2n−1∣j⟩⊗∣ψ⟩)=2n/21k=0∑2n−1j=0∑2n−1∣k⟩δjk⊗e2πikθ∣ψ⟩=2n/21j=0∑2n−1e2πijθ∣j⟩⊗∣ψ⟩=∣Φ2⟩⊗∣ψ⟩所以这就由对于纠缠态∣j⟩∣ψ⟩的操作,使得∣ψ⟩中信息(本征值中的相位),传递到了前一部分的叠加态的振幅当中。
- 对态∣Ψ2⟩中的∣Φ2⟩进行大小为N=2n量子傅立叶逆变换(QFT2n−1),得到态∣Φ3⟩。量子傅立叶变换为(上式为变换,下式为逆变换):
QFTN∣x⟩QFTN−1∣k⟩=N−1/2k=0∑N−1eN2πikx∣k⟩=N−1/2x=0∑N−1e−N2πikx∣x⟩那么对于态∣Φ2⟩进行QFT2n−1,得到:
∣Φ3⟩=QFT2n−1(2n/21j=0∑2n−1e2πijθ∣j⟩)=2n/21j=0∑2n−1e2πijθ(2n/21x=0∑2n−1e2n−2πijx∣x⟩)=2n1j=0∑2n−1x=0∑2n−1exp(2πij(θ−2njx))∣x⟩
-
然后对上面的态在计算基{∣x⟩}测量,测得不同x的概率为:∣cx∣2,并且我们定义2nθ=a+2nδ,其中a是最接近2nθ的整数,所以2nδ要满足0≤∣2nδ∣≤1/2(因为,如果a是2.4,那么估计值就是2,误差为0.4,如果a = 2.7,那么估计值为3,误差为0.3,所以2nδ不会超过0.5)。由于这个定义,cx就变成了:
cx=2n1j=0∑2n−1e2n2πij(x−a)e2πiδj
-
测量态∣Φ3⟩,我们可以从式8中发现,测量到x=2nθ的概率最高(因为此时处于干涉相加,所以系数最大),因此对于量子相位估计来说,想要估计的量θ被放在测量概率最大的态上。
连分数算法#
当我们有一个实数α,我们想要找到两个自然数b和c使得cb=α。
具体流程是这样的:
-
首先我们对α做连分数展开,得到一个整数序列[a0;a1,a2,…,an],并满足:
α=a0+a1+a2+⋱+ak1111
-
具体获得这个序列的方法如下:
-
a0=⌊x⌋(取整数部分)
-
令 x1=x−a01
-
a1=⌊x1⌋
-
重复上面的abc,直到误差足够小或达到预定项数。
-
然后生成收敛值序列{q0p0,q1p1,…,qnpn},其中p_i,q_i的计算过程如下:
-
初始化:p0=a0,q0=1;
-
p1=a0a1+1,q1=a1;
-
对于i≥2的情况:
piqi=aipi−1+pi−2=aiqi−1+qi−2
-
这个收敛值序列的值会越来越接近我们的实数α,所以最后我们可以选取符合我们要求的pi和qi作为我们的b和c。
可以举一个例子,当我们有一个实数M = 0.833984375(约等于512427),我们通过上面的算法可以先得到连分数序列[0;1,5,42,2],然后计算得到收敛值序列:[10,11,65,253211,512427],我们可以看到最后一个收敛值就是我们要得到的分数。
-
首先我们在区间 [2,M) 随机选择一个整数a,然后我们去计算 gcd(a,M) (a和M的最大公约数),那么就会有两种情况:
-
gcd(a,M)=1,即它们的最大公约数是G,那么M就可以分解成G和 GM( gcd(a,M)=G 表明G是M的因子,即M可以被G整除),这时候整个算法结束。
-
gcd(a,M)=1,那么此时 a和M共素,则 a在模M整数乘法群(群里的元素都是和M共素且属于模M群)里,记为 a∈ZM∗。(后面基本上讨论的都是这个情况)
-
如果属于步骤1的第二种情况,那么通过乘法群的逆元的存在性,则a在模M整数乘法群中存在逆元 a−1使得:
a×a−1=1(modM)
后面的 1(modM)表示在模M群里面的单位元1。
-
然后由我们选择的a来生成包含不同幂次a的序列:
X:{a1,a2,…}
这个序列的长度是无限的,因为我们可以对a不断做取幂处理,由于a∈ZM∗,所以每一个幂次的a在 ZM∗中都有一个对应的元素,即:
∀k∈N,∃Zk∈ZM∗,Zk=ak(modM)而ZM∗里面包含的元素是有限的(仅包含0,1,2,…,M-1)。因此我们有:
-
无数多个幂次的a(可以看出无数多个小球)。
-
每一个幂次的ak都会对应着ZM∗中的某一个元素,而ZM∗里面的元素是有限的(可以看成不同的抽屉)。
由于抽屉原理,当我们有足够多的小球,那么就一定存在i,j∈R and i<j,使得:
ai=aj(modM)/aj=ai(modM)即两个小球对应于同一个抽屉。然后由于 a^j和a^i$$在\Z_M^\ast 中存在逆元a−j和a−i,所以在等式两边乘a−i:
aj∗a−i=aj−i=1(modM)记r=j−i,这个r就是a在模M群中的阶(order),它说明了序列X是周期性的。
-
因此对于gcd(a,M)=1情况,我们就可以通过找到r来对M进行分解,具体的过程如下:
-
找到r后,首先判断r是不是偶数,如果不是,那么就需要重新寻找r
-
如果r为偶数,那么 :
ar−1=(ar/2−1)(ar/2+1)≡0(modM)
这就说明M可以整除(ar/2−1)(ar/2+1)。(可以注释一下为什么到这没有完成分解)
解决OF问题#
所以现在分解M的问题就转变为找a的序列周期r的问题。
首先给定了目标分解数M,和一个任意选择的a,我们想要找到周期r满足:
ar=1(modM)shor算法本质上就是通过量子相位估计(QPE),估计出一个结果(包含r的分数),然后用连分数算法将周期r提取出来。对于shor算法的QPE,它的算符U定义为:
U∣k⟩={∣ak(modM)⟩∣k⟩0≤k<MM≤k<2n.上面定义表达的意思是,当k∈ZM∗,则计算得到相应ak在ZM∗中对应的元素,如果不在,那么就返回k本身。因为我们知道序列X存在最小的周期r,所以当我作用r次U到同一个态∣k⟩ ,那么这时候就会返回∣k⟩,即Ur∣k⟩=∣k⟩,因此Ur=I。
假设U的本征态为∣ψ⟩,其本征值为ω,则有:
U∣ψ⟩=ω∣ψ⟩Ur∣ψ⟩=∣ψ⟩=ωr∣ψ⟩所以有ωr=1,所以ωrk=eri2πk,这里的角标r说明U有r个特征向量{∣ψj⟩},每个的特征值为ωrj。(这里用几何解释就是:r次单位根,见下图)。
可以发现{∣a0⟩,∣a1⟩,…,∣ar−1⟩}也构成算符U的一组基矢,我们可以用它们来表示{∣ψj⟩},关系是(这其实像离散的傅立叶变换):
∣ψj⟩=r−1/2k=0∑r−1wr−kj∣ak⟩这里其实也可以用U作用到∣ψj⟩来验证,然后对∣ψj⟩求和得到:
r1j=0∑r−1∣ψj⟩=r1j=0∑r−1k=0∑r−1ωrjk∣ak⟩=∣1⟩+r1k=0∑r−1(j=0∑r−1ωrjk)∣ak⟩=∣1⟩第一个等号是因为ωrjk=ωr−jk=e2πijk/r,最后一个等号是因为:
j=0∑r−1e2πjk/r=1−e2πik/r1−e2πik=0可以参考等比数列求和公式。
有了这个关系我们就可以通过制备态∣1⟩,然后展开得到U的每一个本征态,即∣1⟩=r1∑j=0r−1∣ψj⟩。
Shor算法寻找r的过程是:
-
首先根据M来确定说需要的量子比特数n,要满足:2n>M,所以n=⌈log2M⌉,例如,当M = 31时,n = 5(通常来说只需要满足n=⌈log2M⌉,但是可以证明2n个比特数可以以足够的精度来寻找周期r)。
-
然后制备初态∣Φ0⟩=∣0⟩⊗2n∣1⟩(左边是第一寄存器,右边是第二寄存器),我们知道可以通过展开得到:
∣Φ0⟩=∣0⟩⊗2nr1j=0∑r−1∣ψj⟩
-
对第一寄存器做Hadamard操作H⊗2n⊗Im,得到态
∣Φ1⟩=(H∣0⟩)⊗2nr1j=0∑r−1∣ψj⟩=2n1x=0∑22n−1∣x⟩r1j=0∑r−1∣ψj⟩
-
然后对整个系统做受控Uc操作,得到态∣Φ2⟩:
∣Φ2⟩=Uc(∣Φ1⟩)=(k=0∑22n−1∣k⟩⟨k∣⊗Uk)∣Φ1⟩=2n1x=0∑22n−1k=0∑22n−1δkx∣k⟩(r1j=0∑r−1Uk∣ψj⟩)=2n1x=0∑22n−1k=0∑22n−1δkx∣k⟩(r1j=0∑r−1ωjk∣ψj⟩)=2n1r1x=0∑22n−1j=0∑r−1ωjx∣x⟩∣ψj⟩=r1j=0∑r−1∣ϕj⟩∣ψj⟩
其中∣ϕj⟩=2n1∑x=022n−1e2πijx/r∣x⟩,从上式可以看出,我们如果对上面的态进行测量,我们测量到每一个结果∣ϕj⟩的概率都是一样的,都是r1,所以我们在做完测量之后不能够知道是哪个j。
-
然后对第一个寄存器做逆量子傅立叶变换QFT22n−1,得到即:
QFT22n−1∣ϕj⟩=2n1x=0∑22n−1er2πijx2n1k=0∑22n−1e22n−2πikx∣k⟩=k=0∑22n−122n1x=0∑22n−1exp(2πix(rj−22nk))∣k⟩=k=0∑22n−1ck∣k⟩
我们可以看到对于这个态,如果我们以基{∣k⟩}测量,那么我们测量到k=22nrj结果的概率最大。
这里可能有一个问题,这里只是测量到的概率最大,但是不一定就会测量到这个包含r的k。但是我们完全可以多做几次测量,来确保这个结果就是包含r的那个结果。
-
在得到包含r的测量结果k之后,我们就可以对其除以22n,就可以得到一个实数G=rj,但是j我们无从得知,所以我们不能直接计算得到r。
这时候就可以用上面的连分数算法来提取得到,但是需要注意的是,在取r实际上是取符合要求的分母qk(在收敛值序列中),并且这个分母不能大于要分解的目标M。
-
最后,对于gcd(a,M)=1情况,在找到估计的r后,我们就可以对M进行分解了,具体的分解过程如下:
-
找到r后,首先判断r是不是偶数,如果不是,那么就需要重新寻找r
-
如果r为偶数,那么 :
ar−1=(ar/2−1)(ar/2+1)≡0(modM)
这就说明M可以整除(ar/2−1)(ar/2+1)。(可以注释一下为什么到这没有完成分解)
-
然后计算gcd(ar/2−1,M)和gcd(ar/2+1,M),得出M得两个因子。