演習として書いている RSA 実装の素数性テストを実装しようとしています。私は主に Rabin-Miller を使用していますが、1,000 未満のすべての素数のリストを定式化するエラトステネスのふるいを持っており、候補者がそのうちの 1 つを素因数として持っているかどうかを判断するための簡単なテストに使用します。
関連する機能は次のとおりです。
def comp_test(to_test, primeList):
for i in primeList:
if (to_test / float(i)) % 1 == 0:
return False
return True
ここで、primeList は Sieve によって生成された素数のリストです。これは 2^55 程度の to_test 値までは完全に機能しますが、それを超えると、
(to_test / float(i)) % 1
このステートメントは、Rabin-Miller が素数であると判断した to_test を渡した場合でも、常に 0.0 と評価されます。これが何であるかわかりません。Python が非常に大きな数をどのように処理するかについては明確ではありませんが、私の知る限り、2^55 はオーバーフロー ボーダーのようなものではないようです。Sieve を使用すると、関数が大幅に高速になり、2048 ビットの実装のキーを生成するにはしばらく時間がかかるため、これは演習ですが、Sieve が機能するかどうかを確認したいと思います。
前もって感謝します。