以下のコードスニペットは、指定された数値が素数であるかどうかを確認します。誰かが私にこれがなぜ機能するのか説明できますか?このコードは、Java試験のために与えられた学習ガイドにありました。
public static void main(String[] args)
{
int j = 2;
int result = 0;
int number = 0;
Scanner reader = new Scanner(System.in);
System.out.println("Please enter a number: ");
number = reader.nextInt();
while (j <= number / 2)
{
if (number % j == 0)
{
result = 1;
}
j++;
}
if (result == 1)
{
System.out.println("Number: " + number + " is Not Prime.");
}
else
{
System.out.println("Number: " + number + " is Prime. ");
}
}
条件if (number % j == 0)
は、number
がj
で正確に割り切れるかどうかを尋ねます
プライムの定義は
それだけで割り切れる数と1
したがって、2からnumberまでのすべての数値をテストし、それらのいずれも正確に割り切れない場合は素数になり、そうでない場合は素数になりません。
もちろん、number
はnumber
の半分以上で割り切れないため、実際にnumber
に移動する必要はありません。
このセクションは、jの値を増やしていきます。number
= 12のふりをすると、j
= 2,3,4,5,6になります。
_ int j = 2;
.....
while (j <= number / 2)
{
........
j++;
}
_
このセクションは、result
がnumber
で正確に割り切れる場合、j
を1に設定します。 result
が1に設定されると、決してresetが0になりません。
_ ......
if (number % j == 0)
{
result = 1;
}
.....
_
もちろん、実際にはsqrt(number)
より高くする必要はないので、さらに改善できますが、このスニペットはそれを行わないことを決定しました。高くする必要がない理由は、(たとえば)40が4で割り切れる場合、4 * 10であるため、4と10の両方をテストする必要がないためです。これらのペアの1つは常にsqrt(number)
。
また、result
をブール値として使用することを意図しているように見えますが、実際には整数0と1を使用して代わりにtrueとfalseを表していることに注意してください。これは良い習慣ではありません。
進行中のプロセスを説明するために各行をコメントしようとしました。
int j = 2; //variable
int result = 0; //variable
int number = 0; //variable
Scanner reader = new Scanner(System.in); //Scanner object
System.out.println("Please enter a number: "); //Instruction
number = reader.nextInt(); //Get the number entered
while (j <= number / 2) //start loop, during loop j will become each number between 2 and
{ //the entered number divided by 2
if (number % j == 0) //If their is no remainder from your number divided by j...
{
result = 1; //Then result is set to 1 as the number divides equally by another number, hergo
} //it is not a prime number
j++; //Increment j to the next number to test against the number you entered
}
if (result == 1) //check the result from the loop
{
System.out.println("Number: " + number + " is Not Prime."); //If result 1 then a prime
}
else
{
System.out.println("Number: " + number + " is Prime. "); //If result is not 1 it's not a prime
}
Java java.math.BigIntegerクラスには、数値の素数性をチェックするメソッドisProbablePrime(int確かさ)が含まれています。
isProbablePrime(int certainty)
:BigInteger
クラスのメソッドで、指定された数値が素数かどうかを確認します。にとって certainty = 1
、BigInteger
が素数の場合はtrueを返し、BigInteger
が複合の場合はfalseを返します。
この方法でミラー-ラビン素数アルゴリズムを使用して素数をチェックします。
import Java.math.BigInteger;
public class TestPrime {
public static void main(String[] args) {
int number = 83;
boolean isPrime = testPrime(number);
System.out.println(number + " is prime : " + isPrime);
}
/**
* method to test primality
* @param number
* @return boolean
*/
private static boolean testPrime(int number) {
BigInteger bValue = BigInteger.valueOf(number);
/**
* isProbablePrime method used to check primality.
* */
boolean result = bValue.isProbablePrime(1);
return result;
}
}
Output: 83 is prime : true
詳細については、my blog を参照してください。