【发布时间】:2012-09-26 00:18:22
【问题描述】:
我的任务是使用Fermat's factorization method 分解非常大的合数。这些数字是 1024 位大,大约是 309 个十进制数字。
我想出了下面的 Python 代码,它使用 gmpy2 模块来确保准确性。它只是Wikipedia page 上显示的伪代码的 Python 实现。我阅读了该页面上的“Sieve Improvement”部分,但不知道如何实现它。
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
此代码对于小数字运行得相当快,但对于问题中给出的大数字则需要很长时间。如何提高此代码的速度?我不是在寻找为我编写代码的人,但希望能得到一些建议。感谢您的任何回复。
【问题讨论】:
标签: python factorization