大整数分解算法 之 Williams's p+1 算法原理
基础知识
卢卡斯数列和卢卡斯序列
卢卡斯数列,英文名:Lucas numbers
卢卡斯数列与斐波那契数列相似,除前两项外,每个卢卡斯数都为前两项之和。
而前两项卢卡斯数是\(L_0 = 2\)和\(L_1 = 1\),不同于前两个斐波那契数\(F_0\)和\(F_1\) 。
因此,卢卡斯数可以定义如下:
尽管在定义上密切相关,但卢卡斯数和斐波那契数显示出截然不同的特性。
卢卡斯序列,英文名: Lucas sequences
这是一个特殊的卢卡斯数列,不要与卢卡斯数列混淆
在数学中,卢卡斯数列\(U_n(P,Q)\)和\(V_n(P,Q)\)是满足递归关系的某些常数递归 整数序列
递归关系:
和
在这里,\(P\)和\(Q\)是固定整数,任何满足这种递归关系的序列都可以表示为卢卡斯序列的线性组合 \(U_n(P,Q)\)和\(V_n(P,Q)\)
它的一堆其他性质参考: https://en.wikipedia.org/wiki/Lucas_sequence
算法原理
选择大于2的整数A,用其生成一个卢卡斯序列:
1、\(V_0=2, V_1=a,V_j=aV_{j-1}-V_{j-2}\)
2、对于任意的奇素数 \(p\),只要满足M是\(p-(D/p)\)的倍数,即 \(p-(D/p)|M\),那么就有\(p|gcd(V_M-2,n)\) ,其中\((D/p)\)为勒让德符号、\(D = a^2-4\) ; (原理我还尚未知道...)
3、那么,我们就可以通过\(gcd(V_M-2,n)\)求得\(n\)的因子。
4、当\((D/p) = -1\),所表示的就是Williams's p+1算法; 若(D/p)=+1,则该算法退化为 \(Pollardp-1\)算法的慢速版本 ,而我们希望\((D/p)\)=一1,但因为预先不知道\(P\)的值,所以可能要尝试多个\(a\)的值 ,从而得到 n的因子
5、下面求计算V的第M个值的算法
x=B
y=(B^2-2) mod N
for each bit of M to the right of the most significant bit
if the bit is 1
x=(x*y-B) mod N
y=(y^2-2) mod N
else
y=(x*y-B) mod N
x=(x^2-2) mod N
V=x
6、Williams's p+1 算法分解n的python脚本
def mlucas(v, a, n):
""" Helper function for williams_pp1(). Multiplies along a Lucas sequence modulo n. """
v1, v2 = v, (v**2 - 2) % n
for bit in bin(a)[3:]: v1, v2 = ((v1**2 - 2) % n, (v1*v2 - v) % n) if bit == "0" else ((v1*v2 - v) % n, (v2**2 - 2) % n)
return v1
for v in count(1):
for p in primegen():
e = ilog(isqrt(n), p)
if e == 0: break
for _ in xrange(e): v = mlucas(v, p, n)
g = gcd(v-2, n)
if 1 < g < n: return g # g|n
if g == n: break
参考: https://www.jsjkx.com/CN/article/openArticlePDF.jsp?id=8765
https://en.wikipedia.org/wiki/Williams's_p_%2B_1_algorithm
https://ctf-wiki.org/en/crypto/asymmetric/rsa/rsa_module_attack/#p-1_1
https://blog.csdn.net/m0_62506844/article/details/125774485

浙公网安备 33010602011771号