Javaで素数を決める方法

Javaで素数を決定する方法

数学と安全保障における非常に重要な質問は、数が素数かどうかを言うことです。 これは、パスワードを暗号化するときに非常に便利です。 このチュートリアルでは、単純な場合に数値が素数であるかどうかを調べる方法を学習します。

些細なケース

彼らが持っている唯一の除数が1とそれ自体である場合、我々は数が素数であることを学びました。 簡単に、1からそれ自体までのすべての整数(排他的)をチェックし、それが均等に分割されるかどうかをテストできます。

たとえば、このアルゴリズムを実行したいと思うかもしれません:

//checks whether an int is prime or not.
boolean isPrime(int n) {
    for(int i=2;i

これは最初は悪くないように見えますが、もっと速く、もっと速くすることができます。 2が整数nを除算する場合、(n / 2)もnを除算することを考慮してください。 これは、2からnまでのすべての整数を試す必要がないことを示しています。 これでアルゴリズムを変更できます:

//checks whether an int is prime or not.
boolean isPrime(int n) {
    for(int i=2;2*i

より効率的なコーディングを行うと、実際にはnの平方根まで上がるだけでよいことがわかります。これは、数値のすべての因子をリストすると、平方根が常に中央にあるためです(整数ではありません。それでも問題ありません。近似しすぎる可能性がありますが、コードは引き続き機能します)。

最後に、2が「奇数の」素数であることがわかります-偶然、唯一の偶数です。 このため、2を個別にチェックし、nの平方根まで奇数をたどるだけです。 最終的に、コードは次のようになります。

//checks whether an int is prime or not.
boolean isPrime(int n) {
    //check if n is a multiple of 2
    if (n%2==0) return false;
    //if not, then just check the odds
    for(int i=3;i*i<=n;i+=2) {
        if(n%i==0)
            return false;
    }
    return true;
}

ご覧のとおり、すべての整数をチェックする(数値が素数であることを確認するためにnまで)から、平方根までの整数の半分(実際には奇数)をチェックするだけになりました。 これは、特に数値が大きい場合を考えると、大きな改善です。

繰り返し

多くの数が素数であるかどうかを確認するように求められるプログラムを作成するとします。一度だけではありません。 上記のプログラムはそのアルゴリズム用に高度に最適化されていますが、この状況に特に適した別の方法があります:Prime Sieve。

基本的な考え方は次のとおりです。

  1. 2以上の整数はすべて素数であると仮定します。

  2. リストの最初から始めます。数が素数の場合は、リストからその数の倍数ごとに取り消し線を引きます。 それらは素数ではありません。

  3. 次の番号に移動します。取り消し線が引かれている場合はスキップします。素数ではありません。 取り消し線が付いていない場合は、素数である必要があり、倍数を取り消し線で囲みます。

  4. 繰り返す

これが何を意味するのか見てみましょう。 リストを考慮してください:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

2は素数です…倍数を取り消します。 リストは次のようになります。
2 3 4 5 [line-through]*6 78 910 1112 1314 1516 17%(t7 )s 1920…*

2が唯一の素数である理由がわかります。 3でそれを行うことで、6(すでに消されている)、9、12(すでに消されている)、15などを消します。 最終的に、リストは次のようになります。
2 3 4 5 [line-through]*6 78910 1112 1314%(t7 )s16 1718 1920…*

そして、私たちの素数は残っているものです:(2,3,5,7,11,13,17,19,23,29、…)。 コードでは、このリストを配列として追跡することができます。 つまり、n個の数値を調べてこの「ふるい」を設定しますが、数値が素数であるかどうかに関係なく瞬時の値を返すため、関数を繰り返し呼び出すときにそれを補います。 これがどのように見えるかです。 もちろん、これを自分のニーズに合わせて自分で編集できます。

import java.util.Arrays;
//global array just to keep track of it in this example,
//but you can easily do this within another function.

// will contain true or false values for the first 10,000 integers
boolean[] primes=new boolean[10000];
//set up the primesieve
public void fillSieve() {
    Arrays.fill(primes,true);        // assume all integers are prime.
    primes[0]=primes[1]=false;       // we know 0 and 1 are not prime.
    for (int i=2;i