发现与发明 › 20 世纪

秀尔算法1994

Shor's algorithm

quantum algorithm for integer factorization

秀尔算法 是一个于1994年发现的,以数学家彼得·秀尔命名,针对整数分解题目的的量子算法(在量子计算机上面运作的算法)。不正式地说,它解决的题目是:给定一个整数 ,找出它的质因数。在一个量子计算机上面,要分解整数,秀尔算法的运作需要多项式时间。准确来说,该算法花费 的时间,展示出质因数分解问题可以使用量子计算机以多项式时间解出,因此在复杂度类BQP里面。这比传统上已知的最快的因数分解算法普通数域筛选法所花费的次指数时间——大约 还要快了一个指数。

摘自维基百科「秀爾演算法」,CC BY-SA 4.0

类型
量子算法
发现 / 发明时间
1994 年
发现者 / 提出者
彼得·秀尔
命名来源
彼得·秀尔
学科
数学

相关科学家

百科正文

秀尔算法非常重要,它意味着:假如有可用的量子计算机,我们可以破解基于因数分解以及离散对数的公开密钥加密算法(比如RSA加密算法, 迪菲-赫尔曼密钥交换,椭圆曲线加密)。RSA算法的基础在于假设了我们不能有效率的分解一个已知的整数。就目前所知,这假设对传统(即非量子)的电脑为真;没有已知的传统算法可以在多项式时间内解决这个问题。但秀尔算法展示了因数分解问题在量子计算机上可以很有效率的解决,所以一台足够大的量子计算机可以破解RSA。这对于建立量子计算机和研究新的量子计算机算法是强大的动力。

2001年,IBM的一个小组展示了秀尔算法的实例,使用NMR实验的量子计算机及7个量子比特,将15分解成3×5。不过,对于IBM的实验是否是量子计算的真实展示,有一些疑虑出现,因为没有发现纠缠现象。IBM的实验之后,也有其他的团队以光学量子比特实验秀尔算法,并强调可观察到其纠缠现象。

程序

我们需要解决的问题是:给定一个合成数 N,找到整数 p 在 1 和 N 之间且不包含 1 和 N,并且 N 整除于 p。

秀尔算法包含两个部分:

一个以传统电脑运作的简化算法,将因数分解简化成搜索阶问题。

一个量子算法,解决搜索阶问题。

传统部分

选择任意数字 a < N

计算最大公因数gcd( a, N)。这里可以使用辗转相除法来计算。

若gcd( a, N) ≠ 1,则我们有了一个 N 非平凡的因数,因此这部分结束了。

否则,利用下面的周期查找子程序(Period-finding subroutine,下面会列出)来找出下面这个函数的周期 r: f(x)=a^(x) mod N,

换句话说,找出 a 在 Z _(N) 里面的阶 r,或者最小的正整数 r 令 f(x+r)=f(x)。

若 r 是奇数,回到第一步。

若 a

r /2 ≡ -1 (mod N),回到第一步。

gcd(a r /2+1, N)与gcd(a r /2-1, N)至少有一个是 N 非平凡的因数。分解完成。

量子部分:周期查找子程序(Period-finding subroutine)

这个算法使用的量子线路是为了在给定一个固定常量 N 以及一个任意常量 a 之下,找出 f(x)=a^(x)mod N 所设定的。给定 N,找出 Q

= 2 q 且合乎 N²≤ Q<2N² (这同时表示 Q/r>N)。输入和输出量子比特寄存器需要存储从0到 Q -1所有值的叠加态,因此分别需要 q 个量子比特。这里使用看起来比所需的数量还要更多一倍的量子比特,保证了即使周期 r 的大小逼近 N /2,也至少有 N 个不同的 x 会产生相同的 f(x)。

程序如下:

将寄存器初始化成 Q^(-1/2)∑ ₓ₌₀^(Q-1)|x⟩ |0⟩

x 从0到 Q − 1。所以这一个初始态是 Q 个状态的叠加。

建立量子函数版本的 f ( x),并且应用于上面的叠加态,得到 Q^(-1/2)∑ ₓ|x⟩ |f(x)⟩.

这里仍旧是 Q 个状态的叠加。

对输入寄存器进行量子傅里叶变换。这个变换(操作于二的幂次—— Q=2^(q) 个叠加态上面)

使用一个 Q 次单位根例如 ω =e^(2π i/Q) 将任意给定态 |x⟩ 的振幅平均分布在所有 Q 个 |y⟩ 态上。另一个方法是对于每个不同的 x: U_(QFT)|x⟩ =Q^(-1/2)∑ _(y)ω ^(xy)|y⟩。

由此得到最终状态: Q⁻¹∑ ₓ∑ _(y)ω ^(xy)|y⟩ |f(x)⟩.

这是一个远多过 Q 个状态的叠加态,但是远低过 Q 2个。虽然在和中有 Q 2项,但只要 x₀ 和 x 的值相同,态 |y⟩ |f(x₀)⟩ 就可被提出来。令 ω =e^(2π i/Q) 为 Q^(th) 的一个单位根, r 为 f 的周期, x 0为一个产生相同 f ( x)的 x 的集里面的最小元素(我们已经有 x 0 < r),以及

b在0到 (公式略) 之间使得 x₀+rb<Q。那么 ω ^(ry) 则是复平面的一个单位矢量( ω 是一个单位根, r 和y是整数),而 Q⁻¹|y⟩ |f(x₀)⟩ 在最终状态下的系数则为 ∑ ₓ: f(x)=f(x₀)ω ^(xy)=∑ _(b)ω ^(x₀+rb)y=ω ^(x)₀y∑ _(b)ω ^(rby)。这一求和的每一项代表一个获得相同结果的不同路径,而量子干涉发生。在单位矢量 ω ^(ryb) 几乎与复平面指向同一方向(要求 ω ^(ry) 指向正实数轴)时,干涉将是相长的。

进行测量。我们由输入寄存器获取结果y,由输出寄存器获取 f(x₀)。而既然 f 是周期,对某对y和 f(x₀) 进行测量的概率则由 |Q⁻¹∑ ₓ: f(x)=f(x₀)ω ^(xy)|²=Q⁻²|∑ _(b)ω ^(x₀+rb)y|²

给出。分析显示这个概率越高,单位矢量 ω ^(ry) 就越接近正实数轴,或者 ry/Q 越接近一个整数。除非 r 是2的乘方,否则它不会是 Q 的因子。

对 y/Q 进行连分数展开来计算其近似值,并生成满足下列两个条件的 c/(r'): A:r'<N

B:|y/Q-c/(r')|<1/2Q

借着满足这一些条件, r ′有很高的概率会是我们要找的周期 r。

(公式略)。如果成功了,我们就完成了。

否则,以接近y左右的数值作为 r 的候选,或者说多取几个 r'.如果任何候选成功了,我们就完成了。

否则,回到第一步骤(也就是全部重新做一次)。

算法的解释

此算法包含两个部分。算法的第一部分是将因数分解问题转成查找一个函数的周期,而且这部分可以用传统方式实现。第二部分则是使用量子傅里叶变换来搜索这个函数的周期,而且这一部分是量子加速这整个算法的理由。

I.从周期得到因数

小于N且互质于N的整数组成一个有限大,且对乘法同余N的群。在步骤3之后,我们有一个属于这个群的整数a。既然这个群是有限的,a必有一个有限大的阶r,也就是最小的正整数令 a^(r)≡ 1 mod N.

因此可知,N是a r − 1的因数。先假设我们有能力获得r,而且r是偶数。则 a^(r)-1=(a^(r/2)-1)(a^(r/2)+1)≡ 0 mod N

⇒ ⇒ N |(a^(r/2)-1)(a^(r/2)+1).

r是令a r ≡ 1最小的正整数,所以(a r / 2 − 1)必定不能整除于N。若(a r / 2 + 1)也不整除于N的话,则N必定与(a r / 2 − 1)或者(a r / 2 + 1)有一个非显然的公因数。

证明:为了简化,我们分别用u和v表示(a r / 2 − 1)和(a r / 2 + 1)。N | uv,故kN = uv(k是某个整数)。假设gcd(v, N) = 1:则必定存在某个整数m和n令mv + nN = 1 (这是最大公因数的一个性质)。两边同乘以u,我们得到mkN + nuN = u, 所以 N | u,从而产生矛盾(前文提到(a r / 2 − 1)必定不能整除于N)。故假设不成立,即gcd(v, N) ≠ 1。用类似的方法,可以得知若(a r / 2 + 1)不能整除于N, gcd(u, N) ≠ 1。故得证u和v不同时与N互质。

这给予我们一个N的因数分解。若N是两个质数的乘积,则这是唯一可能的分解。

II.找寻周期

秀尔的周期查找算法非常倚赖量子计算机同时处于许多状态的能力。物理学家称呼这个特性为状态的“叠加”。在计算函数f的周期时,我们会同时估计这个函数的所有点。

不过,量子物理不允许我们直接获取这些信息。测量会令观测结果塌陷到其中一个可能的结果,并摧毁所有其他可能。如果不是因为不可克隆原理,我们可以先测量f(x)而非测量x,再制造几个结果态的拷贝(将会是多个有着同样的f(x)的态的叠加)。对这些态上的x的测量将会给出能给出相同f(x)的不同的x,由此推导出周期来。因为我们不能克隆完全相同的量子状态,这个方法行不通。因此在这里我们需要小心的转变叠加态,使其成为可以以高概率回传正确答案的状态。这可使用量子傅里叶变换来达成。

因此秀尔在这里必须解决三个“实现”的问题,而且速度必须够快,也就是可这些问题可以用量子门个数为 log N 的多项式来实现。

制造状态的叠加。

这可以借着对所有输入的量子比特使用哈达玛门(Hadamard gate)来达成。另一个方法是使用量子傅里叶变换(如下述)。

以量子变换实现函数f。

要达成这件事情,秀尔使用了反复平方以完成模的取幂变换。值得注意的是,这一个步骤比起量子傅里叶变换还难以实现,需要更多辅助的量子比特以及明显更多的门来完成。

进行量子傅里叶变换。

利用受控旋转门(controlled rotation gate)和哈达玛门,秀尔设计了一个量子傅里叶变换的线路,只使用了 q(q-1)/2=O((log Q)²) 个门(Q = 2q)。

在这一些变换之后,测量会给出周期r的近似值。为简明起见,假设存在y令yr/Q是整数,则测量到y的概率是1(理论上)。要推导出这个,我们首先注意到对任何整数b, e^(-2π ibyr/Q)=1。因此Q/r的平方能告诉我们测量y的概率,因为b大致上取Q/r个值,因此概率为 1/r²。有r个y使得yr/Q为整数, f(x₀) 也有r种可能,所以概率总和为1。

Note:另一种解释秀尔算法的方式是将之视为是乔装过后的量子相位估计算法。

瓶颈

秀尔算法的运行瓶颈在于量子模幂运算,这部分远比量子傅里叶变换以及经典的前处理与后处理要慢。目前存在多种构建与优化模幂运算量子电路的方法。其中最简单且(目前)最实用的方法是模仿传统算术电路,使用可逆门构建,例如从逐位进位加法器(ripple-carry adder)开始构建。

若已知指数运算中的底数和模数,则可进一步优化电路设计。

可逆电路通常在使用n个量子比特时需要大约n3个量子门的数量级。

尽管存在一些替代技术来使用量子傅里叶变换实现模幂运算,这些方法在门数量的优化上也逐步在改进,但由于其常数因子非常高,在量子比特数量少于约600的情况下并无实际竞争力。

以上内容摘自维基百科「秀爾演算法」,按 CC BY-SA 4.0 使用,去掉了参考文献、外部链接等尾部小节,公式改写成了纯文本。全文、配图和出处见原文。

同一学科、时间相近的发现与发明