BigIntegerの.isProbablePrime()の可能なユースケースは何ですか?


84

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

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

それで、この方法を使用したいと思う可能性のあるシナリオは何ですか?暗号化?



6
また、ミラーラビン素数性テスト。主な利点は速度です。たとえば、ファクタリングを確認する場合は、このようなテストを実行してファクタリングプロセスを高速化できます。その「おそらく」の部分をかなり低く保つことができ、実際に役立ちます。しかし、私はそれが山車のように少し不安定で奇妙であることに同意します。
キーザー2014

2
@ maxx777それは与えられたものです-私は実際のユースケースを求めます
fge 2014

4
反対票の背後にある理由を説明してほしい
fge 2014

17
「それはかなり長い間JDKに存在していたので、それはそれが用途を持っているに違いないことを意味します。」-または、役に立たない理由で追加された後、何も削除されていないため削除されませんでした。
user253751 2014

回答:


67

はい、この方法は暗号化で使用できます。 RSA暗号化では、1024ビット(約300桁)のオーダーの巨大な素数を見つける必要があります。RSAのセキュリティは、これらの素数の2つを掛け合わせた数を因数分解することは非常に困難で時間がかかるという事実に依存しています。しかし、それが機能するためには、それらは素数でなければなりません。

これらの数が素数であることを証明することも難しいことがわかりました。しかし、ミラー-ラビン素数判定法による素数判定テストの用途の一つisProbablePrime、いずれかの検出は、数が複合体であるか、何の結論を与えないこと。このテストn時間を実行すると、この数値が実際に複合である確率は2n分の1であると結論付けることができます。その実行100時間は2で1の許容リスク生み出す100この数は複合体であることを。


3
@ Mr.777 Rabin-Millerを1、2回見たことがありますが、Miller-Rabinは数十回見ました。正式な名前があるかどうかはわかりませんが。
キーザー2014

3
@ Mr.777上記でリンクしたウィキペディアのページには、最初に「ミラー-ラビン」と記載されていますが、「ミラー-ラビン素数性テストまたはラビン-ミラー素数性テスト」の両方の名前が認められています。
rgettman 2014

5
の実装isProbablyPrimeは(私が知る限り)完全に決定論的です。テストn時間を実行すると、正しい結果が得られる確率がどのように向上しますか?(それがランダム性の要素であったとしても、あなたが説明する方法でリスクに影響を与えるには、複数の呼び出しのランダム性を独立させる必要があります。)
Ted Hopp 2014

11
@TedHopp実装はランダムジェネレーターを使用し、新しい乱数を使用する各ラウンドでは、コンポジットを検出する可能性が3/4になります。デフォルトのジェネレーターはSecureRandomで、強力なランダム性が保証されています。
その他の男

4
難しいかもしれませんが、PRIMESがPにあることを覚えておいてください。AKSテストはミラーラビンより遅いかもしれませんが、指数関数的な違いやそれらの間に多項式はありません。Miller-Rabinを使用して、可能性のある素数の束を見つけ、AKSを使用して、それらが素数であることを確実に証明できます。
バクリウ2014

20

テストで整数が素数ではないことがわかった場合は、100%であると確信できます。

整数が「確率的素数」であることがテストで示された場合、疑問を抱く可能性があるのは、質問の反対側だけです。さまざまな「塩基」を使用してテストを繰り返すと、素数(複数の塩基に対して強い擬素数)の「模倣」に誤って成功する確率を必要なだけ小さくすることができます。

テストの有用性は、その速度と単純さにあります。最終的な答えとして「確率的素数」のステータスに必ずしも満足するわけではありませんが、素数性テストの大きな銃を持ち込む前に、このルーチンを使用することで、ほぼすべての合成数で時間を無駄にすることを確実に回避できます

整数の因数分解の難しさとの比較は、ちょっとしたニシンです。整数の素数性は多項式時間で決定できることが知られており、実際、ミラーラビン検定を十分な数の素数に拡張することが決定的であるという証拠があります(確率的素数ではなく素数の検出において)が、これは一般化リーマン予想を仮定しているため、(より高価な)AKS素数性検定ほど確実ではありません。


4
AKSは2002年8月にのみ発見されましたが、このメソッドは2002年2月からJDKに
導入

3
いいえ、待ってください。これは1997年2月からJDKにあります(probablePrimeメソッドではなくメソッドを調べていましたisProbablePrime
James_pic 2014

1
実際、Agrawal、Kayal、およびSaxenaの2002年の論文「PRIMESis in P」のタイトルは、決定論的(一般的な整数)素数性テストの多項式(ビット長n)の複雑さの最初の無条件の証明を示しています。Miller(1975)は、GRHを仮定すると、整数の素数性をビット長の4乗に比例するステップで決定論的にテストできることを示しました。これは、AKSまたはそのバリアントで現在知られている指数よりもはるかに優れています。
hardmath 2014

AKSは漸近的に高速ですが、ECPPのような方法は、「暗号化」または「産業」素数に対してはるかに効率的です。
ブレットヘイル

2
AKSはめちゃくちゃ遅いです、そして地質学的スケール時間で計算可能などんな数でもAPR-CLより速くはありません、ましてや人間のスケール。APR-CLとECPPはすでに1997年に登場しました。ブレットが述べているように、証拠が必要な場合はECPPが適しています。これらはすべて、確率的素数法(MR、BPSW、フロベニウスなど)に比べて遅いです。
danaJ 2014

19

の標準的な使用例BigInteger.isProbablePrime(int)は暗号化です。具体的には、RSAなどの特定の暗号化アルゴリズムでは、ランダムに選択された大きな素数が必要です。ただし、重要なことに、これらのアルゴリズムでは、これらの数値が素数であることが保証されている必要はありません。非常に高い確率で素数である必要があります。

非常に高いのはどれくらいですか?さて、暗号アプリケーションで、一つは典型的に呼び出すだろう.isProbablePrime()したがって128と256との間の引数のどこかで、このような試験に合格非素数の確率は2未満である128又は2 256

それを考えてみましょう。100億台のコンピューターがあり、それぞれが1秒あたり100億の確率的素数を生成し(これは、最新のCPUでは1つの数あたり1クロックサイクル未満を意味します)、それらの数の素数性がテストされた.isProbablePrime(128)場合、平均すると、1つの非素数が1,000億年1回入ると予想さます。

それは、これらの100億台のコンピュータが経験のない数十億年の何百ものためのすべての実行何とかできれば、ケースになること、である任意のハードウェア障害を。ただし、実際には、ランダムな宇宙線が適切なタイミングでコンピュータ.isProbablePrime(128)に当たって、他の検出可能な影響を引き起こすことなく、戻り値をfalseからtrueに反転する可能性がはるかに高くなります。 -その確実性レベルで確率的素数性テストに実際に合格する素数。

もちろん、ランダムな宇宙線やその他のハードウェア障害の同じリスクは、AKSのような決定論的素数性テストにも当てはまります。したがって、実際には、これらのテストでさえ、ランダムなハードウェア障害のために(非常に小さい)ベースラインの偽陽性率があります(実装のバグなど、他のすべての考えられるエラーの原因は言うまでもありません)。

それは固有の偽陽性率プッシュするのは簡単ですので、ミラー-ラビン素数判定法で使用される.isProbablePrime()だけで十分に何度もテストを繰り返して、このベースライン・レートを下回るまでのところを、さらには繰り返し何度、以来、ミラー・ラビンテストはまだです実際には、AKSのような最もよく知られている決定論的素数性テストよりもはるかに高速であり、暗号化アプリケーションの標準的な素数性テストのままです。

(さらに、RSAモジュラスの要因の1つとして強い擬素数を誤って選択した場合でも、通常、壊滅的な障害につながることはありません。通常、このような擬素数は、約2つ(またはまれにそれ以上)の素数の積になります。半分の長さ。つまり、マルチプライムRSAキーになります。いずれの要素も小さすぎない限り(もしそうであれば、プライマリティテストで検出されたはずです)、RSAアルゴリズムはそれでも問題なく動作し、同じ長さの通常のRSAキーよりも特定の種類の攻撃に対してはやや弱いものの、キーの長さを不必要にスキップしなければ、キーは十分に安全であるはずです。)


障害の問題は、AKSが実際に使用されない理由の1つであり(驚くほど遅い速度がもう1つです)、ECPPがより一般的です。お気づきのとおり、アルゴリズムの実装エラーは非常に発生する可能性があるため、独立したコードで証明書を検証しておくと便利です。
danaJ 2014

8

考えられるユースケースは、特定の数の素数性をテストすることです(それ自体が多くの用途があるテストで)。isProbablePrimeこのアルゴリズムは、数が失敗しそうならば、はるかに速く正確なアルゴリズムよりも実行されisProbablePrime、その後、1つの必要性より高価なアルゴリズムを実行しているの費用に行きません。


それで、それは実用的な目的のためですか?そして素因数分解がNP問題であるという事実のために?
fge 2014

@ fge-はい、私が提案したユースケースは実用性のためのものです。これが素因数分解に役立つかどうかはわかりません。素因数分解は、素数性をテストするよりもはるかに難しい問題です。後者の場合、多項式時間アルゴリズムがあります:AKS素数性テスト
テッドホップ2014

5
@fge:因数分解は確かにNPにありますが、因数分解が知られていない「NP完全」を意味しているのではないかと思います。それどころか、NP困難ではないと強く疑われてます。
モニカの上に残さhmakholm

6

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

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

BrandtとDamgårdによるインクリメンタルサーチによる確率的素数の生成についても参照してください。


5

RSA鍵生成などのアルゴリズムは、数値が素数であるかどうかを判別できることに依存しています。

ただし、このisProbablePrimeメソッドがJDKに追加された時点(1997年2月)では、妥当な時間内に数が素数であるかどうかを決定論的に決定する方法は証明されていませんでした。当時最もよく知られていたアプローチはミラーラビンアルゴリズムでした。これは確率的アルゴリズムであり、誤検出を引き起こすことがあります(つまり、非素数を素数として報告します)が、犠牲を払って誤検出の可能性を減らすように調整できます。実行時間のわずかな増加の。

それ以来、2002年8月に発見されたAKSアルゴリズムのように、数が適度に素数であるかどうかを決定論的に決定できるアルゴリズムが発見されました。ただし、これらのアルゴリズムはまだミラーラビンほど高速ではないことに注意してください。

おそらくより良い質問はisPrime、2002年以降JDKにメソッドが追加されていない理由です。


歴史的な視点をありがとう!@immibisは、「JDK内にあるが、削除されていない」というコメントで正しい方向に進んでいたようです。:)
fge 2014

1
Javaが標準ライブラリからコンテンツを削除しないことで有名ですが、削除できたとしても削除されるかどうかはわかりません。一部のアプリケーションでは、99.999999999%であることが何かの素数で十分であり、100%確実であるよりもはるかに高速です。
James_pic 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.