因子分解算法——Pollard 的 p − 1 p-1 p−1方法
1 算法核心
为了分解合数
n
n
n。设数
n
n
n的一个因子是
p
p
p,若
p
−
1
p-1
p−1的每个因子
q
q
q满足
q
≤
B
q\le B
q≤B(B是自己选的一个数,称为界),此时必有
(
p
−
1
)
∣
B
!
(p-1)|B!
(p−1)∣B!
证:设 p − 1 = q 1 q 2 ⋯ q m p-1=q_{1}q_{2}\cdots q_{m} p−1=q1q2⋯qm,并且 q 1 、 q 2 、 ⋯ 、 q m ≤ B q_{1}、q_{2}、\cdots、q_{m}\le B q1、q2、⋯、qm≤B,显然上式成立。
Pollard的 p − 1 p-1 p−1算法是直接计算 a ≡ 2 B ! ( m o d n ) a\equiv 2^{B!}\pmod{n} a≡2B!(modn)和 g c d ( a − 1 , n ) gcd(a-1,n) gcd(a−1,n),这个最大公因子就是 n n n的一个非平凡因子。
证:由于 p ∣ n p|n p∣n,所以有
a ≡ 2 B ! ( m o d p ) a\equiv 2^{B!} \pmod{p} a≡2B!(modp)
又根据Fermat定理,
2 p − 1 ≡ 1 ( m o d p ) 2^{p-1}\equiv 1 \pmod{p} 2p−1≡1(modp)
因为 2 ( p − 1 ) ∣ 2 B ! 2^{(p-1)}|2^{B!} 2(p−1)∣2B!,所以
a ≡ 2 B ! ≡ 1 ( m o d p ) a\equiv 2^{B!} \equiv 1 \pmod{p} a≡2B!≡1(modp)
即 p ∣ ( a − 1 ) p|(a-1) p∣(a−1)。于是 p p p就是 a − 1 a-1 a−1和 n n n的公因子。最大公因子当然是其中一个。
2 算法评价
根据重复平方-乘方法可以计算 a ≡ 2 B ! ( m o d n ) a\equiv 2^{B!}\pmod{n} a≡2B!(modn),根据扩展的Euclidean算法可以计算最大公因数。所以只要 B B B取值合理,可以在多项式时间计算出结果。但是 B B B必须满足"大于 p − 1 p-1 p−1的所有因子",如果 p − 1 p-1 p−1的因子很大,选择小的 B B B会造成算法求解失败,选择足够大的 B B B会增加算法成功的概率,但那样的话算法的复杂度不比试除法好
为了抵抗Pollard的 p − 1 p-1 p−1因子攻击,通常选取两个大素数 p 1 、 q 1 p_{1}、q_{1} p1、q1,令 p = 2 p 1 + 1 、 q = 2 q 1 + 1 p=2p_{1}+1、q=2q_{1}+1 p=2p1+1、q=2q1+1,这样得到的模数 n = p q n=pq n=pq能够抵抗攻击。
参考书籍:Stinson D , 斯廷森, 冯登国. 密码学原理与实践[M]. 电子工业出版社, 2009.