web-dev-qa-db-ja.com

BigIntegerの.isProbablePrime()の使用例は何ですか?

メソッドBigInteger.isProbablePrime() は非常に奇妙です。ドキュメントから、これは、数値が1 - 1 / 2^argの確率で素数であるかどうかを示します。ここで、argは整数引数です。

JDKには非常に長い間存在しているため、使用する必要があります。コンピューターサイエンスとアルゴリズム(および数学)についての私の限られた知識から、数字が「おそらく」素数であるが正確には素数ではないかどうかを知ることは実際には意味がないことがわかります。

それでは、この方法を使用したいと考えられるシナリオは何ですか?暗号化?

83
fge

はい、この方法は暗号化で使用できます。 RSA暗号化 には、時には1024ビット(約300桁)程度の巨大な素数の検索が含まれます。 RSAのセキュリティは、これらの素数のうち2つを掛け合わせた数を因数分解することが非常に難しく、時間がかかるという事実に依存しています。しかし、それが機能するためには、彼らはプライムでなければなりません。

これらの数の素数を証明することも難しいことがわかります。しかし、 Miller-Rabin primality test は、isProbablePrimeが使用する素数性テストの1つで、数値が合成されていることを検出するか、結論を出しません。このテストをn回実行すると、2つに1つあると結論付けることができます。n この数字が本当に合成されている確率。実行する100回は、2分の1の許容可能なリスクをもたらします100 この数字は合成です。

67
rgettman

可能なユースケースは、特定の数の素数のテスト(それ自体で多くの用途があるテスト)です。 isProbablePrimeアルゴリズムは正確なアルゴリズムよりもはるかに高速に実行されるため、数値がisProbablePrimeに失敗しても、より高価なアルゴリズムを実行するために費用をかける必要はありません。

8
Ted Hopp

Finding素数は、暗号化における重要な問題です。可能性のあるkビット素数を見つけるための合理的な戦略は、ランダムなkビット数を繰り返し選択し、isProbablePrime()などのメソッドを使用して可能性の素数性をテストすることです。

詳細については、 応用暗号ハンドブックのセクション4.4.1 を参照してください。

インクリメンタル検索による可能性のある素数の生成について BrandtとDamgårdも参照してください。

6
NPE