1. ホーム
  2. java

[解決済み] BigIntegerの.isProbablePrime()の使用例としてはどのようなものがありますか?

2023-05-22 20:47:41

質問

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

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

では、この方法を使いたいと思うようなシナリオはどのようなものでしょうか?暗号技術ですか?

どのように解決するか?

はい、この方法は暗号技術に利用することができます。 RSA暗号 では、1024ビット(約300桁)もの巨大な素数を見つけることが必要です。 RSAの安全性は、この素数を2つ掛け合わせた数の因数分解が非常に困難で時間がかかるという事実に依存しています。 しかし、それが機能するためには、それらが素数でなければならないのです。

これらの数が素数であることを証明することも難しいことがわかりました。 しかし、その ミラー・ラビン一次性検定 で使われる一次性検定の一つである isProbablePrime は、数が合成であることを検出するか、 あるいは何も結論を出しません。 このテストを実行すると n を何度も実行すると、2 分の 1 の n の確率で、この数字が本当に合成されたものであると結論づけることができます。 それを実行すると 100 回実行すると、許容できるリスクは 2 分の 1 になります。 100 となります。