许多分解因子算法的理论依据是这样的事实:
假设我们可以找到x≢±y(modn)x\not\equiv \pm y\pmod{n}x≡±y(modn),但是有x2≡y2(modn)x^{2}\equiv y^{2}\pmod{n}x2≡y2(modn)。那么有
n∣(x−y)(x+y)n|(x-y)(x+y) n∣(x−y)(x+y)
但是n∤(x+y)n\nmid (x+y)n∤(x+y)且n∤(x−y)n\nmid (x-y)n∤(x−y),所以gcd(x+y,n)gcd(x+y,n)gcd(x+y,n)和gcd(x−y,n)gcd(x-y,n)gcd(x−y,n)都是nnn的非平凡因子。
Dixon的随机平方算法也是利用这个事实进行设计的。
我们先描述出随机平方算法的大致全貌,再分点详细讨论细节问题。
- 假设我们事先找到一个集合BBB称为因子基,BBB中包含了bbb个最小的素数(bbb是适当选取的一个数);
- 我们通过某种方法得到了若干个整数zzz,使得z2modnz^{2}\mod{n}z2modn的所有因子都在集合BBB中;
- 将某些zzz相乘使得因子基中的每个素数出现偶数次,这样就可以得到一个x2≡y2(modn)x^{2}\equiv y^{2}\pmod{n}x2≡y2(modn)的式子,根据这个式子可以得到nnn的一个分解
通过例子看看具体的流程:
设n=15770708441n=15770708441n=15770708441,并且取的b=6b=6b=6,那么B={1,3,5,7,11,13}B=\lbrace 1,3,5,7,11,13\rbraceB={1,3,5,7,11,13},找到三个zzz确定出如下三个方程:
83409341562≡3×7(modn)120449429442≡2×7×13(modn)27737000112≡2×3×13(modn)8340934156^{2} \equiv 3\times 7\pmod{n}\\ 12044942944^{2} \equiv 2\times 7\times 13\pmod{n}\\ 2773700011^{2} \equiv 2\times 3 \times 13\pmod{n} 83409341562≡3×7(modn)120449429442≡2×7×13(modn)27737000112≡2×3×13(modn)
把上式两边同时相乘得到
(8340934156×12044942944×2773700011)2≡(2×3×7×13)2(modn)(8340934156\times 12044942944 \times 2773700011)^{2} \equiv (2\times 3\times 7\times 13)^{2}\pmod{n} (8340934156×12044942944×2773700011)2≡(2×3×7×13)2(modn)
即
95034357852≡5462(modn)9503435785^{2} \equiv 546^{2}\pmod{n} 95034357852≡5462(modn)
利用Euclidean算法,计算
gcd(9503435785−546,n)=115759gcd(9503435785-546,n)=115759 gcd(9503435785−546,n)=115759
所以得到nnn的一个因子为115759.
如何选择zzz才能使得z2modnz^{2}\bmod{n}z2modn的所有因子都在集合BBB中。
这里没有完全绝对的方法,只能给出几个技巧。一种技巧是简单地随机选择一些zzz,计算z2modnz^{2}\bmod{n}z2modn,这也是随机平方法名字的由来;二是使用行如j+⌈kn⌉,j=0,1,2,⋯,k=1,2,⋯j+\lceil \sqrt{kn} \rceil,j=0,1,2,\cdots,k=1,2,\cdotsj+⌈kn⌉,j=0,1,2,⋯,k=1,2,⋯,这些整数的平方模nnn之后,通常很小,因子容易落在BBB中;另外可以使用行如⌊kn⌋\lfloor \sqrt{kn} \rfloor⌊kn⌋的整数,这些数在模nnn之后,比nnn小一点,这意味着−z2-z^{2}−z2是很小的,只要我们把-1加入BBB中,就可以容易地在BBB上分解z2z^{2}z2。
选择哪些zzz才能使得那些zzz相乘后,因子基中的每个素数出现偶数次。
假定B={p1,⋯,pb}B=\lbrace p_{1},\cdots,p_{b}\rbraceB={p1,⋯,pb}为因子基。设ccc为稍大于bbb的整数(比如c=b+1c=b+1c=b+1,c=b+2c=b+2c=b+2),且假定我们已经得到ccc个同余方程:
zj2≡p1α1j×p2α2j×⋯×pbαbj(modn)z_{j}^{2}\equiv p_{1}^{\alpha_{1j}} \times p_{2}^{\alpha_{2j}} \times \cdots \times p_{b}^{\alpha_{bj}}\pmod{n} zj2≡p1α1j×p2α2j×⋯×pbαbj(modn)
其中1≤j≤c1\le j \le c1≤j≤c。对于每个jjj,考虑向量
αj=(α1jmod2,⋯,αbjmod2)∈(Z2)b\alpha _{j} =(\alpha_{1j}\bmod{2},\cdots,\alpha_{bj}\bmod{2})\in (\mathbb{Z}_{2})^{b} αj=(α1jmod2,⋯,αbjmod2)∈(Z2)b
如果我们可以找到{aj}\lbrace a_{j}\rbrace{aj}的子集使得其模2的和为向量{0,0,⋯,0}\lbrace 0,0,\cdots,0\rbrace{0,0,⋯,0},那么对应的zjz_{j}zj的乘积将会使用BBB中每个因子偶数次。
3. BBB该怎么选。
BBB的选取比较复杂,如果b=∣B∣b=|B|b=∣B∣取得越大,整数z2z^{2}z2似乎更容易在BBB上分解。但是bbb越大,为了找到一个等式需要累积很多同余式。具体方法我们就不赘述,有兴趣的可以参考书籍——Stinson D , 斯廷森, 冯登国. 密码学原理与实践[M]. 电子工业出版社, 2009.