我的任务是使用费马分解方法分解非常大的合数。这些数字是 1024 位大,大约是 309 个十进制数字。
我想出了下面的 Python 代码,它使用该gmpy2
模块来确保准确性。它只是Wikipedia 页面上显示的伪代码的 Python 实现。我阅读了该页面上的“筛选改进”部分,但不确定如何实施。
def fermat_factor(n):
assert n % 2 != 0 # Odd integers only
a = gmpy2.ceil(gmpy2.sqrt(n))
b2 = gmpy2.square(a) - n
while not is_square(b2):
a += 1
b2 = gmpy2.square(a) - n
factor1 = a + gmpy2.sqrt(b2)
factor2 = a - gmpy2.sqrt(b2)
return int(factor1), int(factor2)
def is_square(n):
root = gmpy2.sqrt(n)
return root % 1 == 0 # '4.0' will pass, '4.1212' won't
此代码对于小数字运行得相当快,但对于与问题中给出的数字一样大的数字则需要很长时间。如何提高此代码的速度?我不是在寻找为我编写代码的人,但希望能得到一些建议。感谢您的任何回复。