私の仕事は、フェルマーの素因数分解法を使用して非常に大きな合成数を因数分解することです。数値は1024ビットで、10進数で約309桁です。
私は以下のPythonコードを思いつきました。これは、gmpy2
正確さのためにモジュールを使用しています。これは、ウィキペディアのページに表示されている擬似コードの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
このコードは、小さい数値の場合はかなり高速に実行されますが、問題で指定された数値と同じ大きさの数値の場合は時間がかかりすぎます。このコードの速度を改善するにはどうすればよいですか?私は自分のコードを書いてくれる人を探していませんが、いくつかの提案をいただければ幸いです。ご回答ありがとうございます。