【秀尔演算法】
秀尔演算法（Shor's algorithm）是一个于1994年发现的，以数学家彼得·秀尔命名，针对整数分解题目的的量子演算法（在量子计算机上面运作的演算法）。不正式地说，它解决的题目是：给定一个整数 ，找出它的质因数。在一个量子计算机上面，要分解整数，秀尔演算法的运作需要多项式时间（时间是 的某个多项式这么长， 在这里的意义是输入的档案长度）。准确来说，该演算法花费  的时间，展示出质因数分解问题可以使用量子计算机以多项式时间解出，因此在复杂度类BQP里面。这比传统上已知的最快的因数分解演算法普通数域筛选法所花费的次指数时间——大约 还要快了一个指数。
秀尔演算法非常重要，它意味着：假如有可用的量子计算机，我们可以破解基于公开密钥加密的算法（比如RSA加密演算法）。RSA演算法的基础在于假设了我们不能有效率的分解一个已知的整数。就目前所知，这假设对传统（即非量子）的电脑为真；没有已知的传统演算法可以在多项式时间内解决这个问题。但秀尔演算法展示了因数分解问题在量子计算机上可以很有效率的解决，所以一个足够大的量子计算机可以破解RSA。这对于建立量子计算机和研究新的量子计算机演算法是一个强大的动力。
2001年，IBM的一个小组展示了秀尔演算法的实例，使用NMR实验的量子计算机及7个量子位元，将15分解成3×5。不过，对于IBM的实验是否是量子计算的真实展示，有一些疑虑出现，因为没有发现缠结现象。IBM的实验之后，也有其他的团队以光学量子位元实验秀尔演算法，并强调可观察到其缠结现象。
== 程序 ==
试著解决的问题是：给定一个合成数，找到整数在和之间且不包含和，并且整除于。
秀尔演算法包含两个部份：
# 一个以传统电脑运作的简化演算法，将因数分解简化成搜寻阶问题。
# 一个量子演算法，解决搜寻阶问题。
=== 传统部份 ===
选择任意数字
计算gcd（  ,   ）。这里可以使用辗转相除法来计算。
若gcd(  ,   ) ≠ 1，则我们有了一个  非平凡的因数，因此这部份结束了。
否则，利用下面的周期寻找子程序（Period-finding subroutine，下面会列出）来找出下面这个函数的周期  ：
,
换句话说，找出在里面的阶，或者最小的正整数  令
。
若  是奇数，回到第一步。
若      /2 ≡ -1 (mod   ),回到第一步。
gcd(a  /2+1,   )与gcd(a  /2-1,   )至少有一个是  非平凡的因数。分解完成。
=== 量子部份：周期寻找子程序（Period-finding subroutine） ===
这个演算法使用的量子线路是为了在给定一个固定常数  以及一个任意常数  之下，找出 所设定的。给定  ,找出   = 2  且合乎（这同时表示）。输入和输出量子位元暂存器需要储存从0到  -1所有值的叠加态，因此分别需要  个量子位元。这里使用看起来比所需的数量还要更多一倍的量子位元，保证了即使周期  的大小逼近  /2，也至少有  个不同的  会产生相同的  。
程序如下：
将暂存器初始化成
从0到   − 1。所以这一个初始态是  个状态的叠加。
建立量子函式版本的  (  )，并且应用于上面的叠加态，得到
.
这里仍旧是  个状态的叠加。
对输入暂存器进行量子傅立叶变换。这个变换（操作于二的幂次——  个叠加态上面）
使用一个 次单位根例如将任意给定态的振幅平均分布在所有  个态上。另一个方法是对于每个不同的  ：
。
由此得到最终状态：
.
这是一个远多过  个状态的叠加态，但是远低过  2个。虽然在和中有  2项，但只要  和  的值相同，态就可被提出来。令
为 的一个单位根，
为  的周期，
0为一个产生相同  (  )的  的集里面的最小元素（我们已经有  0
进行测量。我们由输入寄存器取得结果y，由输出寄存器取得。而既然  是周期，对某对y和进行测量的概率则由
给出。分析显示这个概率越高，单位向量就越接近正实数轴，或者越接近一个整数。除非  是2的乘方，否则它不会是的因子。
对进行连分数展开来计算其近似值，并生成满足下列两个条件的：
藉著满足这一些条件，  ′有很高的机率会是我们要找的周期  。
检查  (  ) =   (   +   ′)  。如果成功了，我们就完成了。
否则，以接近y左右的数值作为  的候选，或者说多取几个 .如果任何候选成功了，我们就完成了。
否则，回到第一步骤（也就是全部重新做一次）。
== 演算法的解释 ==
此演算法包含两个部份。演算法的第一部份是将因数分解问题转成寻找一个函式的周期，而且这部份可以用传统方式实作。第二部份则是使用量子傅立叶变换来搜寻这个函式的周期，而且这一部份是量子加速这整个演算法的理由。
=== I.从周期得到因数 ===
小于N且互质于N的整数组成一个有限大，且对乘法同余N的群。在步骤3之后，我们有一个属于这个群的整数a。既然这个群是有限的，a必有一个有限大的阶r,也就是最小的正整数令
因此可知，N是a r − 1的因数。先假设我们有能力获得r，而且r是偶数。则
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，由此推导出周期来。因为我们不能复制完全相同的量子状态，这个方法行不通。因此在这里我们需要小心的转变叠加态，使其成为可以以高机率回传正确答案的状态。这可使用量子傅立叶变换来达成。
因此秀尔在这里必须解决三个「实作」的问题，而且速度必须够快，也就是可这些问题可以用量子闸个数为的多项式来实作。
制造状态的叠加。
这可以藉著对所有输入的量子位元使用哈达玛闸（Hadamard gate）来达成。另一个方法是使用量子傅立叶变换（如下述）。
以量子变换实作函数f。
要达成这件事情，秀尔使用了反复平方以完成模的取幂变换。值得注意的是，这一个步骤比起量子傅立叶变换还难以实作，需要更多辅助的量子位元以及明显更多的闸来完成。
进行量子傅立叶变换。
利用受控旋转闸（controlled rotation gate）和哈达玛闸，秀尔设计了一个量子傅立叶变换的线路，只使用了个闸（Q = 2q）。
在这一些变换之后，测量会给出周期r的近似值。为简明起见，假设存在y令yr/Q是整数，则测量到y的机率是1（理论上）。要推导出这个，我们首先注意到对任何整数b，
。因此Q/r的平方能告诉我们测量y的概率，因为b大致上取Q/r个值，因此概率为。有r个y使得yr/Q为整数，也有r种可能，所以机率总和为1。
Note:另一种解释秀尔演算法的方式是将之视为是乔装过后的量子相位估计演算法。
== 参见==
*泡利矩阵
*量子退火