函数计算
输入 x=(xn−1,xn−2,…,x0) 储存在 n 比特寄存器 ∣x⟩ 中,输出 f(x) 储存在 m 比特寄存器 ∣y⟩ 中,且 ∣y⟩ 的初值为 ∣0⟩。一个幺正算符 Uf 可以执行以下计算:
Uf∣x⟩∣y⟩=∣x⟩∣y⊕f(x)⟩
其中 ⊕ 表示按位模 2 加法。量子计算的并行性可以明显地看出:
Ufx=0∑2n−1cx∣x⟩∣y⟩=x=0∑2n−1cx∣x⟩∣y⊕f(x)⟩
Deutsch-Jozsa 问题
单比特情况
考虑一个“黑盒”或者“预言机” Uf,它实现了一个函数 f:{0,1}→{0,1}。这个函数只可能是两种类型之一:常数函数(对所有输入都返回相同的输出)或者平衡函数(对一半的输入返回 0,对另一半的输入返回 1)。那么我们需要多少次查询 Uf 才能确定 f 的类型?经典算法在最坏情况下需要两次查询,而量子算法只需要一次查询。
n比特情况
Deutsch-Jozsa 问题是一个通用的 Deutsch 问题。函数 f:{0,1}n→{0,1} 要么是常数函数,要么是平衡函数。经典算法在最坏情况下需要 2n−1+1 次查询,而量子算法只需要一次查询就能确定 f(x) 的类型。
Grover 搜索算法
Grover 算法是一种量子算法,能够以高概率从 N 个元素的无序数据库中找到一个特定的输入,且只需要 O(N) 次查询。相比之下,经典算法在最坏情况下需要 O(N) 次查询。
在量子语言下,Grover 算法提供了一种从均匀叠加态中找到目标态 ∣ϕ⟩ 的方法(N≫1):
∣s⟩=N1i=0∑N−1∣x⟩⇒∣ϕ⟩
Grover 算法还有一个更准确的描述:函数逆运算。假设有一个函数能够在量子计算机上计算,Grover 算法允许我们在给定 y 的情况下找到 x,使得 f(x)=y。
类似于 Deutsch-Jozsa 问题,我们先设定一个查询函数:
f(x)={10 if x=∣ϕ⟩ if x=∣ϕ⟩
step 1:准备初始态 ∣ψ1⟩=∣0⟩⊗n∣1⟩,第一个寄存其中含有 n=log2N 个比特,第二个寄存器含有 1 个比特。
step 2:对两个寄存器分别施加 Hadamard 变换,得到均匀叠加态:
∣ψ2⟩=2n−11i=0∑2n−1∣x⟩21(∣0⟩−∣1⟩)
step 3:执行以下 “Grover iteration” 迭代 r(N) 次,其中函数 r(N) 的渐进行为为 O(N)。Grover 迭代由两个幺正算符 Uf 和 Us 组成:
∣ψ3⟩=(UsUf)r(N)∣ψ2⟩
其中 Uf 是查询函数对应的幺正算符 Uf∣x⟩∣y⟩=∣x⟩∣y⊕f(x)⟩,因此
Uf∣x⟩21(∣0⟩−∣1⟩)=(−1)f(x)∣x⟩21(∣0⟩−∣1⟩)
若我门只关心第一个寄存器的状态,可以忽略第二个寄存器,查询结果可由 ∣x⟩ 的相位判定
Uf∣x⟩={−∣x⟩∣x⟩ if x=∣ϕ⟩ if x=∣ϕ⟩
Uf 可以等价地写为
Uf=1−2∣ϕ⟩⟨ϕ∣
Us 同样作用在第一个寄存器上,定义为
Us=−H⊗n(1−2∣0⟩⟨0∣)H⊗n=2∣s⟩⟨s∣−1
其中 ∣s⟩=H⊗n∣0⟩⊗n=2n1∑i=02n−1∣x⟩ 是均匀叠加态。态 ∣s⟩ 可以被分解为两部分,一部分是目标态 ∣ϕ⟩,另一部分是所有非叠加而产生的态 ∣ϕ⊥⟩=2n−11∑x=ϕ∣x⟩,且 ⟨ϕ∣ϕ⊥⟩=0。因此
∣s⟩=cos2θ∣ϕ⟩+sin2θ∣ϕ⊥⟩
其中 cos2θ=2n1,sin2θ=2n2n−1。在基 {∣ϕ⊥⟩,∣ϕ⟩} 下,算符 Uf 和 Us 的矩阵表示分别为
Uf=1−2∣ϕ⟩⟨ϕ∣=(100−1)
Us=2∣s⟩⟨s∣−1=(cosθsinθsinθ−cosθ)
因此 Grover 迭代 G=UsUf 的矩阵表示为
G=UsUf=(cosθsinθ−sinθcosθ)
因此,Grover 迭代相当于在 {∣ϕ⊥⟩,∣ϕ⟩} 基下绕原点逆时针旋转 θ 角度。∣ψ3⟩ 可以表示为
∣ψ3⟩=(cosθsinθ−sinθcosθ)r(N)∣ψ2⟩=(cos(rθ)sin(rθ)−sin(rθ)cos(rθ))∣ψ2⟩=[cos(rθ+2θ)∣ϕ⊥⟩+sin(rθ+2θ)∣ϕ⟩]21(∣0⟩−∣1⟩)
那么第一个寄存器的态为
ψ3(1)⟩=cos(rθ+2θ)∣ϕ⊥⟩+sin(rθ+2θ)∣ϕ⟩
因为 N=2n≫1,2θ≈N1,所以当
rθ≈2π⇒r≈4πN
得到
ψ3(1)⟩≈∣ϕ⟩
step 4:测量第一个寄存器,我们将以高概率得到目标态 ∣ϕ⟩。
Grover 算法的几何可视化:
下图是由 ∣ϕ⊥⟩ 和 ∣ϕ⟩ 张成的二维空间的几何表示。初始态 ∣s⟩ 位于 ∣ϕ⊥⟩ 和 ∣ϕ⟩ 之间,Grover 迭代 G 相当于绕原点逆时针旋转 θ 角度。经过 r 次迭代后,态被旋转到接近 ∣ϕ⟩ 的位置,从而实现了对目标态的高概率测量。
直观起见,图中夸大了 θ 的大小。在实际情况下,θ 非常小,约为 N2。
算符 Uf 是一个与 ∣ϕ⟩ 垂直平面上的反射,作用在 ∣s⟩ 上后,∣ϕ⟩ 方向的投影分量被反转
Uf=1−2∣ϕ⟩⟨ϕ∣=∣ϕ⊥⟩⟨ϕ⊥∣−∣ϕ⟩⟨ϕ∣=(100−1)
算符 Us 是一个通过 ∣s⟩ 的反射,作用在任意态上后,∣s⊥⟩ 方向的投影分量被反转
Us=−1+2∣s⟩⟨s∣=∣s⟩⟨s∣−∣s⊥⟩⟨s⊥∣=(cosθsinθsinθ−cosθ)
每一次 Grover 迭代 G=UsUf 都相当于先绕 ∣ϕ⊥⟩ 折射,再绕 ∣s⟩ 折射,总体效果是旋转 θ=2sin−1(N1)≈N2。
量子傅里叶变换
离散傅里叶变换
一个 N 维复变量的 f=(f0,f1,…,fN−1) 的离散傅里叶变换定义为
f~k=N1j=0∑N−1e2πiNjkfj,
那么我们得到矢量 f~=(f~0,f~1,…,f~N−1)。由于计算每个 f~k 都不需要得知其他的 f~j,所以可以进行并行计算。
量子傅里叶变换
定义两个 n 比特量子寄存器 ∣k⟩=∣kn−1,kn−2,...,k0⟩ 和 ∣j⟩=∣jn−1,jn−2,...,j0⟩(N=2n),k 和 j 分别为对应的十进制表示。定义一个作用在 n 比特量子态上的算符 F^,其作用为
F^∣j⟩=2n1k=0∑2n−1e2πi2njk∣k⟩
上式虽然与离散傅里叶变换形似,但 F^ 只是一个基矢比变换,还未实现傅里叶变换的功能。
对于任意的量子态 ∣ψ⟩=∑jfj∣j⟩,其量子傅里叶变换由下式给出
∣ψ~⟩=F^∣ψ⟩=j=0∑2n−1fjF^∣j⟩=k=0∑2n−1(2n1j=0∑2n−1e2πi2njkfj)∣k⟩=k=0∑2n−1f~k∣k⟩
∣ψ~⟩ 的系数矢量 f~=(f~0,f~1,…,f~N−1) 正是 ∣ψ⟩ 的系数矢量 f=(f0,f1,…,fN−1) 的离散傅里叶变换结果。这样,我们只用了一次操作 F^ 就实现了对所有 fj 的傅里叶变换,但是光有这样的结果是不够的,因为我们无法直接访问 f~k。
量子线路实施
我们先构建算符 F^ 的量子线路
∣ψ⟩F^∣ψ~⟩F^∣j⟩=2n1k=0∑2n−1e2πi2njk∣k⟩
利用实数的二进制表示
k=(kn−1kn−2⋯k0)binary=(kn−12n−1+kn−22n−2+⋯+k020)decimalj=(0.jl−1jl−2⋯j0)binary=(jl−12−1+jl−22−2+⋯+j02−l)decimal
将 F^∣j⟩ 展开为
F^∣j⟩=2n1k=0∑2n−1exp(2πi2njk)∣k⟩=2n1kn−1=0∑1kn−2=0∑1⋯k0=0∑1exp(2πi2njl=1∑nkn−l2n−l)∣kn−1,kn−2,…,k0⟩=2n1kn−1=0∑1kn−2=0∑1⋯k0=0∑1l=1⨂n[exp(2πij2lkn−l)∣kn−l⟩l]=2n1l=1⨂nkn−l=0∑1exp(2πij2lkn−l)∣kn−l⟩l=2n1l=1⨂n[∣0⟩l+exp(2πij2l1)∣1⟩l]
当求和项数有限时,两个求和可以调换位置,或者求和项数无限但求和项绝对收敛时,两个求和可以调换位置。
现在 F^∣j⟩ 对态 ∣j⟩ 的作用被分解为对每个量子比特的作用的直积。但是 j 仍然以十进制的形式整体作用在每个量子比特上,实际上 j 也是一个二进制数。将 j 的二进制表示代入上式,得
F^∣j⟩=2n1l=1⨂n[∣0⟩l+exp(2πi(jn−12n−l−1+jn−22n−l−2+⋯+j02−l))∣1⟩l]=2n1l=1⨂n[∣0⟩l+exp(2πi(jl−12−1+jl−22−2+⋯+j02−l))∣1⟩l]=2n1l=1⨂n[∣0⟩l+exp(2πi0.jl−1jl−2⋯j0)∣1⟩l]=2n1[∣0⟩1+exp(2πi0.j0)∣1⟩1] ⊗[∣0⟩2+exp(2πi0.j1j0)∣1⟩2] … ⊗[∣0⟩n+exp(2πi0.jn−1jn−2⋯j0)∣1⟩n].
现在,我们可以根据上式搭建量子线路了,利用 Hadamard 门和受控相位门 Uk
H∣0⟩H∣1⟩=21[∣0⟩+exp(2πi×0.0)∣1⟩]=21[∣0⟩+exp(2πi×0.1)∣1⟩]Uk=(100exp(2k2πi))
在上图中,第 l 个量子比特经过一个 Hadamard 门和 l−1 个受控相位门 U2,U3,…,Ul 的作用后,得到了所需的相位因子 exp(2πi×0.jl−1jl−2⋯j0)。整个量子傅里叶变换线路的深度为 O(n2),远小于经典快速傅里叶变换的 O(2nn);但缺点是初态制备问题和末态测量是概率性的。
量子相位估计
算法描述
量子相位估计算法应用于一类本征值为相位因子的幺正算符。设有一个幺正算符 U,其本征态为 ∣u⟩,对应的本征值为 e2πiϕ,其中 0≤ϕ<1,如果能够制备本征态 ∣u⟩ 和实现受控 U2j 操作,那么量子相位估计算法可以高效地估计 ϕ 的值。
第一行的 n 个量子比特寄存器取决于对相位 ϕ 的精度需求,第二行的 m 个量子比特寄存器用于存储本征态 ∣u⟩。上图右边输出的结果为
∣n0,0,…,0⟩∣u⟩→2n1(∣0⟩+e2πi2n−1ϕ∣1⟩)(∣0⟩+e2πi2n−2ϕ∣1⟩)⋯(∣0⟩+e2πi20ϕ∣1⟩)∣u⟩=2n1k=0∑2n−1e2πiϕk∣k⟩∣u⟩=(F^∣2nϕ⟩)∣u⟩
∣2nϕ⟩ 是 ϕ 的二进制表示的前 n 位,也就是将小数形式的 ϕ 小数点后的 n 个二进制数提取出来。
ϕ=(0.ϕn−1ϕn−2⋯ϕ0)binary=(ϕn−12−1+ϕn−22−2+⋯+ϕ02−n)decimal2nϕ=(ϕn−12n−1+ϕn−22n−2+⋯+ϕ020)decimal=(ϕn−1ϕn−2⋯ϕ0)binary
现在我们考虑如何将 ∣2nϕ⟩ 从量子傅里叶变换态 F^∣2nϕ⟩ 中提取出来。我们只需要对第一行的 n 个量子比特施加逆量子傅里叶变换 F^−1
F^−1∣j⟩=2n1k=0∑2n−1exp(−2πi2njk)∣k⟩
就可以得到
∣0,0,…,0⟩∣u⟩→(F^∣2nϕ⟩)∣u⟩F^−1∣2nϕ⟩∣u⟩≡∣ϕn−1,ϕn−2,⋯,ϕ0⟩∣u⟩
傅里叶逆变换的量子线路与正变换类似,可以将所有受控相位门 Uk 替换为其逆门 Uk†,但是这样需要变动的门很多,我们可以将输入端变换为输出端,就直接得到逆变换线路。
最后我们从测量结果 ϕn−1,ϕn−2,⋯,ϕ0 中读取到了 ϕ 的近似值 0.ϕn−1ϕn−2⋯ϕ0
误差分析
一般来说第一个寄存器的比特数 n 不足以存储 ϕ 小数点后所有数据,那么测量结果会有误差,且这个误差并不像经典计算只需四舍五入那么简单,因为还要进行傅里叶逆变换:例如,0.01101 乘以23 得到 11.01,由于不是一个整数,无法直接用直积态 ∣1101⟩ 来表示,这就会对傅里叶变换的结果产生影响。我们希望得到测量结果尽可能趋近于真实值 ϕ,那么就需要进行观察误差较大的概率,并降低这个概率。
假设 0≤b≤2n−1,那么 2nb=0.bn−1bn−2⋯b0 是 ϕ 的一个 n 比特近似值。定义误差 δ=ϕ−2nb,测量结果为
F^−12n1k=0∑2n−1e2πiϕk∣k⟩=2n1l=0∑2n−1k=0∑2n−1exp(−2πi2nlk+2πiϕk)∣l⟩=2n1l=0∑2n−1k=0∑2n−1exp[2πik(ϕ−2nl)]∣l⟩=2n1l=0∑2n−1k=0∑2n−1exp[2πik(ϕ−2nl+b)]∣(l+b)(mod2n)⟩=2n1l=0∑2n−1k=0∑2n−1exp[2πik(δ−2nl)]∣(l+b)(mod2n)⟩=2n1l=0∑2n−11−exp[2πi(δ−2nl)]1−exp[2πi(2nδ−l)]∣(l+b)(mod2n)⟩
通过计算,我们可以证明,得到的结果 ∣m⟩ 满足 ∣m−b∣>ϵ 的概率为
p(∣m−b∣>ϵ)≤2(ϵ−1)1
如果以 2−t 的精度近似 ϕ,那么我们可以选择 ϵ=2n−t−1 使得成功的概率达到 1−ϵ,因此我们在第一个寄存器中至少需要 n 个量子比特
n=t+⌈log(2+2ε1)⌉
求阶问题
阶的定义
Shor 算法可以通过量子计算机分解质因数,求阶是 Shor 算法的核心步骤。
对于两个正整数 x<N,x 与 N 互质,r 是满足下式的最小正整数:xr≡1(modN)。求阶问题是在给定的 x 和 N 下,找到 r 的值。
- 阶 r 也就是 xr=1+kN
- 对于一个正整数 N,若两个整数之差 a−b 能被 N 整除(也就是 a−b=kN),则称 a 与 b 在模 N 下同余,记作 a≡b(modN)
如果 xr≡1(modN),我们可以定义一个函数 f(a)=xamodN,可以证明 f(a) 是一个周期为 r 的函数,即 f(a+r)=f(a)。因此,求阶问题可以转化为寻找函数 f(a) 的周期 r,这和 QFT 或 QPE 密切相关。
算法准备
我们定义一个将在求阶问题中用到的幺正算符
Ux∣y⟩=∣xy mod N⟩
其中 y∈{0,1}⊗L,L=⌈logN⌉,N<2L, 0≤y≤N−1,并且 x 和 N 互质。
用整数 0≤s≤r−1 构造态 ∣us⟩
∣us⟩=r1k=0∑r−1exp(−2πirsk)∣xkmodN⟩
这个态共有阶数 r 项,可以证明
Ux∣us⟩=exp(2πirs)∣us⟩
我们可以使用量子相位估计来获得相位 rs,从而求出阶 r。然而态 ∣us⟩ 依赖于未知的阶 r 且很难制备,幸运的是,我们发现
r1s=0∑r−1∣us⟩=∣1⟩≡∣L−10,0,…,0,1⟩
其中 L=⌈logN⌉ 是存储 N 所需的比特数。∣1⟩ 可以很容易地制备,但是这样使用量子相位估计会令得到的结果为所有 ∣us⟩ 的相干叠加,我们来看如何处理这个问题。
算法步骤
step 1:准备两个寄存器,第一寄存器含有 n=2L+1+⌈log(2+2ε1)⌉ 个量子比特且被初始化为 ∣0⟩≡∣0⟩⊗n,第二寄存器含有 L 个量子比特。初始态被制备在
∣ψ1⟩=∣0⟩∣1⟩
n=2L+1+⌈log(2+2ε1)⌉ 是为了满足连续分数定理的,这保证了能给出阶 r 的有效估计
step 2:对第一个寄存器施加 Hadamard 变换,得到所有态的等权重相干叠加
∣ψ2⟩=H⊗n∣ψ1⟩=2n1j=0∑2n−1∣j⟩∣1⟩
step 3:定义模幂算符 Ux,n,其作用为
Ux,n∣j⟩∣y⟩=∣j⟩Uxj∣y⟩=∣j⟩∣xjy mod N⟩
Uxj 意味着进行 j 次 Ux 操作,是一个受控 U 门。将 Ux,n 作用在态 ∣ψ2⟩ 上,得到
∣ψ3⟩=Ux,n∣ψ2⟩=2n1j=0∑2n−1∣j⟩Uxj∣1⟩=2n1j=0∑2n−1∣j⟩Uxjr1s=0∑r−1∣us⟩=2nr1j=0∑2n−1s=0∑r−1exp(2πirsj)∣j⟩∣us⟩
step 4:若上式没有对 s 的求和项,此时我们已经可以通过量子相位估计计算 r 了。现在我们强行对第一个寄存器施加逆量子傅里叶变换 F^−1,得到
∣ψ4⟩=F^−1∣ψ3⟩=2nr1j=0∑2n−1s=0∑r−1exp(2πirsj)[F^−1∣j⟩]∣us⟩=2nr1j=0∑2n−1s=0∑r−1exp(2πirsj)2n1k=0∑2n−1exp(−2πi2njk)∣k⟩∣us⟩=2nr1j,k=0∑2n−1s=0∑r−1exp[2πi(rs−2nk)j]∣k⟩∣us⟩
step 5:当两个寄存器的状态给定时,测量第一个寄存器得到 k 的概率为
P(k)=22nr1j=0∑2n−1exp[2πi(rs−2nk)j]2
分情况讨论
1.若 2n 被 r 整除
j=0∑2n−1exp[2πi(rs−2nk)j]=1−exp[2πi(sr2n−k)2n1]1−exp[2πi(sr2n−k)]=2nδk,s2n/r
那么
∣ψ4⟩=r1s=0∑r−1∣sr2n⟩∣us⟩
在测量后,我们将会得到一个态 ∣r2ns⟩≡∣b⟩,但是我们仍然不知道 s 和 r 的值。然而我们可以通过将 b 和 2n 除以他们的公因子来得到 r 的值,使得 r 和 s 互质。
2.若 2n 不被 r 整除
我们总可以使用一个 k,定义 δk=rs−2nk,其中 k′∈[0,2n−1],使得 ∣δk′∣≤2n+11。
当 s/r 在右半部分 0≤rs−2nk′≤2n+11,我们有 0≤2πiδk′j≤πi2nj≤πi
当 s/r 在左半部分 −2n+11≤rs−2nk′<0,我们有 −πi≤−πi2nj≤2πiδk′j≤0
无论 δk′ 为正还是负,相位因子之和都会在同一个半复平面内相干叠加,从而导致 P(k′)≈r1。
对于其他 k=k′ 的情况,相位因子 2πiδj 有时位于复平面的上半平面,有时位于下半平面,从而导致相干相消,因此概率 P(k) 可以忽略不计。
现在我们可以以相对高的概率 r1 得到 rs 的很好的近似。我们可以通过连分式展开找到 rs 的最简分数形式,从而以某个精度得到阶 r。(连分式定理的有效性可以被证明)
- 对于不同的 s,k′ 通常不同
- 若 s 和 r 有公因子,那么通过连分式展开得到的 r 可能不是最小阶,需要多次运行算法以获得正确的阶 r。
求阶算法的缺点说结果仍是不确定的,因为测量结果依赖于 s 的选择,而 s 是随机的。
Shor 分解质因数算法
算法步骤如下:
step 1:随机选择一个小于 N 的整数 x。
step 2:计算 gcd(x,N),如果 gcd(x,N)=1,那么我们已经找到了 N 的一个非平凡因子 gcd(x,N),算法结束。
step 3:如果 gcd(x,N)=1,使用求阶算法找到 x 的阶 r。
step 4:如果 r 是奇数,那么重新回到 step 1。
step 5:如果 r 是偶数,若 xr/2≡−1(modN),那么重新回到 step 1。
step 6:计算 gcd(xr/2−1,N) 和 gcd(xr/2+1,N),它们将会是 N 的非平凡因子,算法结束。
证明:如果 r 是 x 模 N 的阶数,那么 xr≡1(modN),因此
xr−1=(xr/2−1)(xr/2+1)=nN,n∈Z
(xr/2−1)(xr/2+1) 能被 N 整除,但 (xr/2−1) 和 (xr/2+1) 都不能被 N 整除(否则 r 不是最小正整数或违背 step 5),这意味着 N 的质因数被拆分在了 (xr/2−1) 和 (xr/2+1) 中,使用 gcd 就能提取出来。gcd(xr/2−1,N) 和 gcd(xr/2+1,N) 将会以极高的概率给出 N 的质因数。