一个分解整数的算法 这里提供一个分解整数的算法,该算法可能存在不足,欢迎大家批评指证。
一、原理介绍 在介绍算法前,先介绍一下原理。
①、设a≡b(mod n),如果(a,n)=c>1,那么(b,n)=c>1,或者如果(b,n)=c>1,则(a,n)=c>1。
证明: ∵a≡b(mod n) => a-jn=b,j≥0
又 ∵(a,n)=c>1 => a=cf,n=cg (f,g≥1) ∴
代入上式得: cf-jcg=b => c(f-jg)=b,即(b,n)=c>1 证毕
反之也然,证明略。
该证明为,a中含有n的因子,则同余b中也一定含有n的因子。
②、对于一组数f1、f2、f3… fm,m≥1,如果其中有一个数fi (i≥1)与n有因子c,即(fi,n)=c≥1,则这组数的乘积:f1*f2*…fi…*fm与n也有因子c,这 是因为f1*f2*…fi…*fm=f1*f2*…cg…*fm=c(f1*f2*…g…*fm),这里fi=cg。
该段的意思是如果一组数中,其中一个数含有n的因子,则这组数的乘积也必含有n的因子。
③、设a^2≡b(mod n),以a为中心,向两边从1到m进行加减(m≥1)的一组平方剩余可以表示如下:
(a-m)^2≡dm,…,(a-3)^2≡d3,(a-2)^2≡d2,…(a-1)^2≡d1,a^2≡b,(a+1)^2≡c1,(a+2)^2≡c2,(a+3)^2≡c3,…,(a+m)^2≡cm (mod n)
这组平方剩余的左边相乘可得:
(a-m)^2*…*(a-3)^2*(a-2)^2*(a-1)^2*a^2*(a+1)^2*(a+2)^2*(a+3)^2*…*(a+m)^2 (mod n)
上述乘积中,对a两边的平方剩余进行两两相乘可以得到:
(a-1)^2*(a+1)^2 (mod n)=(a^2-1)^2 (mod n)≡(b-1)^2 (mod n) (a-2)^2*(a+2)^2 (mod n)=(a^2-4)^2 (mod n)≡(b-4)^2 (mod n) (a-3)^2*(a+3)^2 (mod n)=(a^2-9)^2 (mod n)≡(b-9)^2 (mod n) . . .
(a-m)^2*(a+m)^2 (mod n)=(a^2-m^2)^2 (mod n)≡(b-m^2)^2 (mod n) 即上述平方剩余左边相乘,可以表达如下:
(a-m)^2*…*(a-3)^2*(a-2)^2*(a-1)^2*a^2*(a+1)^2*(a+2)^2*(a+3)^2*…*(a+m)^2 (mod n)=a^2*(a^2-1)^2*(a^2-4)^2*(a^3-9)^2*…*(a^2-m^2)^2 (mod n)≡(a(b-1)(b-4)(b-9)…(b-m^2))^2 (mod n)
根据②可得,以a为中心向两边加减m的平方剩余中,如果a-i或者a+i(1≤i≤m)含有n的因子c,则上述平方剩余的乘法也必有n的因子c,
也即: a(b-1)(b-4)(b-9)…(b-m^2)必有n的因子c 又根据①,上式可表示为:
b(b-1)(b-4)(b-9)…(b-m^2)
即以a^2≡b(mod n)为中心,求向两边加减m个数的范围内,如果乘积中有n的因子,上述平方剩余的乘积也必有n的因子,共有2m+1个数。
④、对于平方数,可知:
1^2=1
2^2=1+3 3^2=1+3+5
. . .
m^2=1 +3+5+…+2m-1 (m≥1)
该证明请参考其它文章。
二、算法介绍
根据以上介绍,设计出以下的一个分解算法,供大家参考:
算法:
以a^2≡b (mod n)为基础 输入a,b,n,num
1、if sqrt(b)是平方数 then return gcd(a+sqrt(b),n)
2、res=b 乘积结果
3、m=1 从1开始计算平方
4、i=1
5、b=b-m 计算下一个减的平方
6、res=(res*b)%n 按③中求乘积,同时求剩余,避免计算值过大
7、if res=0 then return gcd(b,n) 如果为0,b中必有n的因子
8、m=m+2 按④中求平方
9、i=i+1
10、if i 11、return gcd(res,n) 其中gcd为碾转相除法。 上述算法中,a^2≡b (mod n)选择比较重要,又因算法中使用加2来求平方,速度会受影响,是否还有其它更好的办法来提高速度,或者更好的建议,希望大家多多提出,本人不胜感激。