A la recherche d'un chiffre premier en JAVA grâce au MODULO
Résolution du problème EULER Project numéro 7. Antisèche. JAVA 8.0
Les travaux de EULER sont à l'origine du Projet EULER, l'un des plus grands projets de concours informatiques présents sur internet.
Un nombre premier est un nombre divisible par 1 ou lui même.
Les vingt-cinq nombres premiers inférieurs à 100 sont : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, et 97. (extrait de WIKIPEDIA)
Les nombres premiers sont très utilisés notamment dans les systèmes de cryptographie. Ce qui fera l'objet d'un projet sujet.
Ici, je vais vous proposer un programme vous permettant de générer des chiffres premiers (limité au 999 999ème chiffres selon les performances de votre ordinateur).
Comment a été construit ce programme.
D'abord, il faut savoir qu'il existe un site sous le nom du Projet EULER https://projecteuler.net/.
Le 7ème défi proposé par le projet EULER est le suivant :
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
La traduction : trouver le 10 001st chiffre premier.
Pour répondre au problème j'ai utilisé le MODULO qui est une technique JAVA permettant d'extraire le multiple d'un nombre après sa division.
On prend par exemple 9 et on écrit 9%4= 1
Si un nombre est divisible par 1 ou lui même, cela signifie que son MODULO est toujours égal à 0 quelque soit le chiffre par lequel il va être divisé.
Donc tous les nombres au Modulo = 0 sont des nombres premiers.
J'ai donc fait un tri entre les modulo = 0 et les autres. Puis j'ai bouclé l'ensemble. Mais la logique est là :
Chaque modulo = 0 est classé premier et chaque modulo différent de zéro n'est pas classé premier car divisible au moins une fois par un nombre différent de 1 ou lui même.
qq[zz] = ll[yy]%zz;
// System.out.print("\n!"+ll[yy]%zz);
if (qq[zz]==0)
{ oo[yy]=oo[yy]+1;
// System.out.print("Yeah");
// System.out.print("test"+oo[yy]);
}
if (qq[zz]!=0)
{oo[yy]=oo[yy]+0;}
La difficulté a été d'imbriquer des boucles pour tester chaque nombre. Cela est prenant en terme de mémoires et de temps. C'est probablement la limite de ce programme. Il m'a tout de même permis de résoudre le problème EULER n°7.
Notez également l'utilisation du Break qui permet de sortir de la boucle une fois le chiffre demandé trouvé.
if (cheese ==X)
{ System.out.print("la réponse:");
System.out.print("\n");
System.out.print ("le "+cheese+"ème est"+ll[yy]);
break; (c'est un break bienvenu !)
} }
Pour trouver par exemple le 12 ème chiffre premier, il vous faudra dire que X = 12 dans le programme qui va suivre.
package chiffrespremiers;
/** * * @author user */ public class Chiffrespremiers {
/** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here
int X = 12; // variable d'entrée il s'agit du chiffre premier que je recherche.
double ii = 0; double qq[] = new double[999999]; double ll[] = new double[999999]; double oo[] = new double[999999]; double resultat[] = new double[999999]; double ee = 0; double aa = 0; double uu = 0; double jj = 0; int cheese =0; double pp = 1;
for (int lll =0; lll < 1; lll++)
{ for (int yy =0; yy < 999999; yy++) { ll[yy] = pp; ll[yy] = ll[yy] +1; oo[yy]=0; for (int zz =2; zz < 999997; zz++) { // qq[yy] = qq[yy] + 1; // System.out.print(ll[yy]); qq[zz] = ll[yy]%zz; // System.out.print("\n!"+ll[yy]%zz); if (qq[zz]==0) { oo[yy]=oo[yy]+1; // System.out.print("Yeah"); // System.out.print("test"+oo[yy]); } if (qq[zz]!=0) {oo[yy]=oo[yy]+0;} // System.out.print("YO"); } if (oo[yy]==1) { cheese = cheese +1; System.out.print (cheese+"ème chiffre_premier est :"+ll[yy]); System.out.print ("\n"); resultat[lll] = ll[yy]; if (cheese ==X) { System.out.print("la réponse:"); System.out.print("\n"); System.out.print ("le "+cheese+"ème est"+ll[yy]); break; } }pp = ll[yy]; } //System.out.print("\n"); System.out.print("le chiffre est"+(resultat[lll])); } } }