web-dev-qa-db-fra.com

Comment ce test de nombre premier en Java fonctionne-t-il?

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. ");
    }
}
9
Adam Staples

Théorie générale

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.

Sections spécifiques

Boucle while

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++;
  }

If statement

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;
  }
  .....

Améliorations supplémentaires

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.

25
Richard Tingle

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
}    
7
Levenal

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.

3
Chris Knight

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 .

2
Rajesh Dixit