我正在尝试为非常大的整数实现Fermat的因子分解,而我似乎无法使其工作。
我的代码如下
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def FermatsFactorization(N):
a = math.ceil(isqrt(N))
b2 = ((a*a) - N)
while not isqrt(b2).is_integer():
a += 1
b2 = ((a*a) - N)
p = a + isqrt(b2)
q = a - isqrt(b2)
print p
print q
return p,q
所以这段代码可以用于简单的整数,例如5959,但我想考虑下面的
N = 21782178510063776461241988741393403748263149606418470290457970869584937331514019374606465366303005016660193541806517181777318162895347539817622285020192774759478269128757372541938236369238616095442740118695407004519767912490482867488611536705877428644997287974943888081383661776269804618969459352629702475787077033241358667142820088780464925538022629953746785180882881018116846435825219064338036769722076725591665293793855682103585288579694301648980485573448067751223659912804906632104733676877199934241937423870885559163031690669390029458536950673319993077233987061166029740639193164051093517111904059841571819466949
当我尝试运行代码时出现错误
line 108, in FermatsFactorization
b2 = ((a*a) - N)
OverflowError: long int too large to convert to float
有没有人知道这方面的方法,或者是否有一些技巧来实现这么大的分解?