参考:Quantum Computation and Quantum Information (10th Anniversary Edition) - Michael A. Nielsen & Isaac L. Chuang
本学期选修了 “密码学中的量子计算” 研讨课,中途涉及到对Shor因子分解算法的理解。书中的描述有多处存在问题(或本人没理解到位),这里列举一些我自己的思考。
因子分解算法的思路
因子分解问题(Factoring Problem)
给定正整数 N=i=1∏mpiαi ,对其进行素因子分解。
经典筛法的核心策略:找两个正整数 z<y<N,让它们满足 z2≡y2(modN)(平方同余关系)。(当然这里仅考虑 gcd(z,N)=gcd(y,N)=1 的情况,否则 N 就直接被 z,y 分解了。)
z2≡y2(modN)⟺(y−z)⋅(y+z)≡0(modN)
这意味着只要 y−z>1 且 y+z=N,那么就有 h=gcd(y−z,N) 为 N 的一个非平凡因子。
这时对其做一些简单的变换:
- 考虑 gcd(y,N)=1:
z2≡y2(modN)⟺(zy−1)2≡1(modN)
- 设 x=zy−1:
x2≡1(modN)
(x−1)(x+1)≡0(modN)
即得到下述 Statement:
Statement 1:对正整数 N,方程 x2≡1(modN) 的解 x 满足 2⩽x⩽N−1,则 gcd(x−1,N) 和 gcd(x+1,N) 之中至少有一个是 N 的非平凡因子。(x=2时,x−1=1;x=N−2时,x+1=N−1。)
这时问题就变成了,我们怎么去找到这样的一个关系呢?
- How to Find?(注:因子2的检测是平凡的,因此下面均考虑 N 为奇数。)
- 欧拉定理?(xφ(N)≡1(modN)) ⇒ Nope! 我们无法计算 φ(N)!
- 我们可以使用量子傅里叶变换求取元素的阶!(解决元素求阶问题)⇒ 我们可以计算使得 xr≡1(modN) 最小的 r !(元素 x 在模 N 意义下的阶 r=ordN(x)。)
- If we are FORTUNATE,恰有 2∣r,那么就有
(x2r−1)⋅(x2r+1)≡0(modN)
- If we are MORE FORTUNATE,恰有
x2r+1≡0(modN)⟺x2r≡−1(modN)
- 那么检查 gcd(x2r+1,N) 以及 gcd(x2r−1,N) 其中谁为非平凡因子即可!
元素求阶问题的求解在后续内容再进行介绍,下面我们看看怎么将因子分解问题一步一步真正地去调用元素求阶问题来解决,这里面有不少细节值得讨论。
现在出现了一个新的问题:我们怎么获得有着满足这样关系的阶 r 的 x ?
或者说我们均匀随机选取一个 x ,它有多大概率满足下述条件?
- 2∣r
- x2r+1≡0(modN)⟺x2r≡−1(modN)
这里我们首先排除一个情况,即均匀选取了一个 x,很巧合的是它恰好与 N 有非平凡公因子,这样其实问题就直接解决了。但是很显然,这个概率实在是太小了!如,对于 N=p⋅q,p∼q∼N,这样的概率的量级为 p1∼N1!(注:超级大乐透中奖概率 ∼2251,气运之子快去买彩票吧。)
下面我们就仅考虑 gcd(x,piαi)=1 的情况了。
接下来我们将要证明下面这个 Statement:
Statement 2:均匀随机选取一个 x∈(Z/NZ)× ,它满足:
- 2∣r
- x2r+1≡0(modN)⟺x2r≡−1(modN)
的概率满足
x←U((Z/NZ)×)Pr(2∣ordN(x) ∧ x2r≡−1(modN))⎩⎪⎨⎪⎧=0⩾1−2m−11m=1m⩾2
注:这里的结论与参考书中的结论略有不同,参考书中的结论我不是很推得过去,按理说大抵的确是有问题的。。。
上述的 Statement 2 保证了我们是足够幸运的!
It turns out that we are FORTUNATE!
现在我们解决以下问题:
均匀随机选取一个 x∈(Z/NZ)× ,它有多大概率满足:
- 2∣r
- x2r+1≡0(modN)⟺x2r≡−1(modN)
即计算:
x←U((Z/NZ)×)Pr(2∣r ∧ x2r≡−1(modN))
这里其实有一个直觉就是,感觉我们去求这个事件的反面会更简单一点,即计算:
x←U((Z/NZ)×)Pr(2∤r ∨ x2r≡−1(modN))
接下来的任务就是一步一步地研究方程 xr≡1(modN)了。
根据中国剩余定理,我们显然有:
xr≡1(modN)⟺xr≡1(modi=1∏mpiαi)⇒xr≡1(modpiαi)∀i∈[m]
记 ri=ordpiαi(xi),即 xri≡1(modpiαi)。显然:
ri∣r
因为我们研究的是 r 的奇偶性,因此我们考虑在 2-adic 上进行分析。
记 v2(n)∈N 满足 2v2(n)∣n且 2v2(n)+1∤n,也记 2v2(n)∥n。
此时将事件 2∤r ∨ x2r≡−1(modN) 拆成两半就有(注意 v2(ri)⩽v2(r)):
2∤r⇒2∤ri⟺v2(ri)=v2(r)=0, ∀ i∈[m]
- 若 2∣r 且 x2r≡−1(modN),则
xi2r≡−1(modpiαi)⇒ri∤2r, ∀ i∈[m]⟺v2(ri)=v2(r), ∀ i∈[m]
In conclusion,
2∤r ∨ x2r≡−1(modN)⇒v2(ri)=v2(r), ∀ i∈[m]
注意到中国剩余定理:
xr≡1(modi=1∏mpiαi)⟷1−1⎩⎪⎪⎪⎨⎪⎪⎪⎧x1r≡1(modp1α1)⋮xmr≡1(modpmαm)
这里的 x∈Z/NZ 与 (x1,⋯,xm)∈i=1∏m(Z/piαiZ) 是一一对应的。
特别地,对于 x∈(Z/NZ)×,不难证明此时 x∈(Z/NZ)×⟷1−1(x1,⋯,xm)∈i=1∏m(Z/piαiZ)×
不难证明 r≡ri(modφ(piαi)),∀i∈[m],即:
xr≡1(modi=1∏mpiαi)⟷1−1⎩⎪⎪⎪⎨⎪⎪⎪⎧x1r1≡1(modp1α1)⋮xmrm≡1(modpmαm)
这意味着,x←U((Z/NZ)×)⟺(x1,⋯,xm)←U(i=1∏m(Z/piαiZ)×) ,这里 xi,∀i∈[m] 是相互独立选取的,从而 ri,∀i∈[m] 也是相互独立的。
从而得到概率计算上的转化:
==⩾===x←U((Z/NZ)×)Pr(2∣r ∧ x2r≡−1(modN))1−x←U((Z/NZ)×)Pr(2∤r ∨ x2r≡−1(modN))1−x←U((Z/NZ)×)Pr(2∤r ∨ x2r≡−1(modi=1∏mpiαi))1−(x1,⋯,xm)←U(i=1∏m(Z/piαiZ)×)Pr(v2(ri)=v2(r), ∀ i∈[m])1−(x1,⋯,xm)←U(i=1∏m(Z/piαiZ)×)Pr(v2(ri)=v2(r), ∀ i∈[m])1−i=1∏mxi←U((Z/piαiZ)×),i=1,⋯,mPr(v2(ri)=v2(r))⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧01−i=2∏mxi←U((Z/piαiZ)×),i=1,⋯,mPr(v2(ri)=v2(r1))m=1m⩾2
注:我们在这里将r=ordN(x)剥离开,因为 r 总是与 ri 的选取有关,而 ri 之间是相互独立的。
下面我们的任务就是对 xi←U((Z/piαiZ)×)Pr(v2(ri)=v2(r1)) 进行计算了。
这里需要第一个 Insight,就是原根存在定理:
原根存在定理(部分):对奇素数 pi,正整数 αi,(Z/piαiZ)× 为循环群。
从而我们可以设 (Z/piαiZ)× 生成元为 gi。进一步就有 xi=x(modpiαi)=giki(modpiαi),ri=ordpiαi(xi),立即就有:
gikiri≡xiri≡1(modpiαi),ri∣r,ri∣φ(piαi)=piαi−1(pi−1)
由熟知结论:
ri=gcd(φ(piαi),ki)φ(piαi)
根据 ordpiαi(gi)=φ(piαi) 计算得到:
v2(ri)=v2(pi−1)−min(v2(pi−1),v2(ki))
而 xi∈(Z/piαiZ)×⟷1−1ki∈Z/piαi(pi−1)Z,从而需要第二个 Insight:
- xi∈QNR((Z/piαiZ)×)⟺2∤ki⟺v2(ki)=0⟺v2(ri)=v2(pi−1) → 概率 1/2
- xi∈QR((Z/piαiZ)×)⟺2∣ki⟺v2(ki)⩾1⟺v2(ri)<v2(pi−1) → 概率 1/2
对于 i⩾2,r1(特别地 v2(r1))都是一个客观存在的值(相互独立),因此只需要考虑对 v2(r1) 的具体大小进行讨论即可:
xi←U((Z/piαiZ)×)Pr(v2(ri)=v2(r1))⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧⩽21=21=0v2(r1)<v2(pi−1)v2(r1)=v2(pi−1)v2(r1)>v2(pi−1)
即:
xi←U((Z/piαiZ)×)Pr(v2(ri)=v2(r1))⩽ 21,i=2,⋯,m
从而 m⩾2 时:
x←U((Z/NZ)×)Pr(2∣r ∧ x2r≡−1(modN))⩾ 1−i=1∏mxi←U((Z/piαiZ)×)Pr(v2(ri)=v2(r))⩾1−2m−11
现在剩下 m=1 的情况了。事实上我们注意到 2∣r 时:
(x2r−1)⋅(x2r+1)≡0(modp1α1)
若 x2r+1≡0(modp1α1),由阶的极小性同样有 x2r−1≡0(modp1α1),此时:
p1∣gcd(x2r+1,x2r−1)=gcd(x2r+1,2)⇒p1∣2
显然矛盾。
综上所述,
x←U((Z/NZ)×)Pr(2∣ordN(x) ∧ x2r≡−1(modN))⎩⎪⎨⎪⎧=0⩾1−2m−11m=1m⩾2
前面做了哪些假设:
- 提前去除 N 的偶数素因子 2;
- N 为某个素因子幂的情况需要单独讨论;
- 重点考虑选取的 x 满足 gcd(x,N)=1 的情况。
中间涉及了哪些计算:
- 偶素数因子检测
- 素数幂检测算法
- 辗转相除法
- 元素求阶算法
\begin{algorithm}
\caption{\textbf{大整数开根算法}}
\begin{algorithmic}
\State \textbf{输入:} 正整数 $N$,开根次数 $k$
\State \textbf{输出:} $[\sqrt[k]{N}]$
\State $a \gets 0,\ b \gets 1$
\While{$b^k < N$} \Comment{倍增法找上界,$O(\log N)$轮}
\State $a \gets b$
\State $b \gets 2b$
\EndWhile
\If{$b^k = N$} \Comment{恰好开尽}
\State \Return $b$
\EndIf
\While{$a + 1 < b$} \Comment{二分查找,$O(k)$轮}
\State $m \gets \lfloor (a + b) / 2 \rfloor$
\If{$m^k \leqslant N$} \Comment{快速幂判定,$O(\log k \cdot \log^2 N)$}
\State $a \gets m$
\Else
\State $b \gets m$
\EndIf
\EndWhile
\State \Return $a$ \Comment{总复杂度 $O(k\log k \cdot \log^2 N)$}
\end{algorithmic}
\end{algorithm}