Javaで数値が素数かどうかを確認する
1. 前書き
まず、同じ基本理論を見ていきましょう。
簡単に言えば、1と数自体で割り切れる場合、数は素数です。 非素数は合成数と呼ばれます。 そして、ナンバーワンは素数でも複合でもありません。
この記事では、Javaで数値の素数性をチェックするさまざまな方法を見ていきます。
2. カスタム実装
このアプローチでは、2〜(数の平方根)の間の数が正確に数を除算できるかどうかを確認できます。
数値が素数の場合、次のロジックはtrueを返します。
public boolean isPrime(int number) {
return number > 2
&& IntStream.rangeClosed(2, (int) Math.sqrt(number))
.noneMatch(n -> (number % n == 0));
}
3. BigIntegerの使用
BigIntegerクラスは通常、大きなサイズの整数、つまり64ビットより大きい整数を格納するために使用されます。 intおよびlong値を操作するためのいくつかの便利なAPIを提供します。
それらのAPIの1つはisProbablePrimeです。 このAPIは、数値が確実に合成数である場合はfalseを返し、素数である可能性がある場合はtrueを返します。 大きな整数を扱う場合、これらを完全に検証するのは非常に集中的な計算になる可能性があるため便利です。
A quick side-note –isProbablePrime APIは、「ミラー-ラビンおよびルーカス-レーマー」素数テストと呼ばれるものを使用して、数がおそらく素数であるかどうかを確認します。 数が100ビット未満の場合は、「ミラー-ラビン」テストのみが使用されます。それ以外の場合は、両方のテストが数の素数のチェックに使用されます。
「ミラーラビン」テストは、固定回数を繰り返して数の素数を決定し、この反復カウントは、APIに渡される数のビット長と確実性の値を含む単純なチェックによって決定されます。
public boolean isPrime(int number) {
BigInteger bigInt = BigInteger.valueOf(number);
return bigInt.isProbablePrime(100);
}
4. Apache CommonsMathの使用
Apache Commons Math APIは、数値の素数性をチェックするために使用するorg.apache.commons.math3.primes.Primes,という名前のメソッドを提供します。
まず、pom.xmlに次の依存関係を追加して、Apache CommonsMathライブラリをインポートする必要があります。
org.apache.commons
commons-math3
3.6.1
commons-math3の最新バージョンはhereにあります。
メソッドを呼び出すだけでチェックを実行できます。
Primes.isPrime(number);
5. 結論
この簡単な記事では、数の素数をチェックする3つの方法を見てきました。
このためのコードは、パッケージcom.example.primecheckerover on Github.にあります。