メソッドBigInteger.isProbablePrime()
は非常に奇妙です。ドキュメントから、これは、数値が1 - 1 / 2^arg
の確率で素数であるかどうかを示します。ここで、arg
は整数引数です。
JDKには非常に長い間存在しているため、使用する必要があります。コンピューターサイエンスとアルゴリズム(および数学)についての私の限られた知識から、数字が「おそらく」素数であるが正確には素数ではないかどうかを知ることは実際には意味がないことがわかります。
それでは、この方法を使用したいと考えられるシナリオは何ですか?暗号化?
はい、この方法は暗号化で使用できます。 RSA暗号化 には、時には1024ビット(約300桁)程度の巨大な素数の検索が含まれます。 RSAのセキュリティは、これらの素数のうち2つを掛け合わせた数を因数分解することが非常に難しく、時間がかかるという事実に依存しています。しかし、それが機能するためには、彼らはプライムでなければなりません。
これらの数の素数を証明することも難しいことがわかります。しかし、 Miller-Rabin primality test は、isProbablePrime
が使用する素数性テストの1つで、数値が合成されていることを検出するか、結論を出しません。このテストをn
回実行すると、2つに1つあると結論付けることができます。n この数字が本当に合成されている確率。実行する100
回は、2分の1の許容可能なリスクをもたらします100 この数字は合成です。
可能なユースケースは、特定の数の素数のテスト(それ自体で多くの用途があるテスト)です。 isProbablePrime
アルゴリズムは正確なアルゴリズムよりもはるかに高速に実行されるため、数値がisProbablePrime
に失敗しても、より高価なアルゴリズムを実行するために費用をかける必要はありません。
Finding素数は、暗号化における重要な問題です。可能性のあるkビット素数を見つけるための合理的な戦略は、ランダムなkビット数を繰り返し選択し、isProbablePrime()
などのメソッドを使用して可能性の素数性をテストすることです。
詳細については、 応用暗号ハンドブックのセクション4.4.1 を参照してください。
インクリメンタル検索による可能性のある素数の生成について BrandtとDamgårdも参照してください。