L'extrait de code ci-dessous vérifie si un nombre donné est un nombre premier. Quelqu'un peut-il m'expliquer pourquoi cela fonctionne? Ce code était sur un guide d'étude qui nous a été donné pour un Java examen.
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. ");
}
}
La condition if (number % j == 0)
demande si number
est exactement divisible par j
La définition d'un nombre premier est
un nombre divisible par lui-même et 1
donc si vous testez tous les nombres entre 2 et nombre, et qu'aucun d'eux n'est exactement divisible, alors c'est un nombre premier, sinon ce n'est pas.
Bien sûr, vous n'avez pas besoin d'aller jusqu'au number
, car number
ne peut pas être exactement divisible par quelque chose au-dessus de la moitié number
.
Cette section passe par des valeurs de j croissantes, si nous prétendons que number
= 12 alors elle passera par j
= 2,3,4,5,6
int j = 2;
.....
while (j <= number / 2)
{
........
j++;
}
Cette section définit result
sur 1, si à tout moment number
est exactement divisible par j
. result
n'est jamais reset à 0 une fois qu'il a été défini sur 1.
......
if (number % j == 0)
{
result = 1;
}
.....
Bien sûr, vous pouvez encore améliorer cela car vous n'avez pas besoin d'aller plus haut que sqrt(number)
mais cet extrait de code a décidé de ne pas le faire; la raison pour laquelle vous n'avez pas besoin d'aller plus haut est parce que si (par exemple) 40 est exactement divisible par 4 c'est 4 * 10, vous n'avez pas besoin de tester à la fois 4 et 10. Et de ces paires, une sera toujours inférieure à sqrt(number)
.
Il convient également de noter qu'ils semblent avoir l'intention d'utiliser result
comme booléen, mais ont en fait utilisé des entiers 0 et 1 pour représenter vrai et faux à la place. Ce n'est pas une bonne pratique.
J'ai essayé de commenter chaque ligne pour expliquer les processus en cours, j'espère que ça aide!
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
}
Il fonctionne en itérant sur tout nombre compris entre 2 et la moitié du nombre entré (car tout nombre supérieur à l'entrée/2 (mais inférieur à l'entrée) donnerait une fraction). Si l'entrée numérique divisée par j
donne un reste 0 (if (number % j == 0)
) alors l'entrée numérique is divisible par un nombre autre que 1 ou lui-même. Dans ce cas, le résultat est défini sur 1 et le nombre n'est pas un nombre premier.
La classe Java java.math.BigInteger contient une méthode isProbablePrime (int certainty) pour vérifier la primauté d'un nombre.
isProbablePrime(int certainty)
: Une méthode dans la classe BigInteger
pour vérifier si un nombre donné est premier. Pour certainty = 1
, il retourne vrai si BigInteger
est premier et faux si BigInteger
est composite.
L'algorithme de primalité de Miller – Rabin est utilisé pour vérifier la primalité dans cette méthode.
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
Pour plus d'informations, consultez mon blog .