Temps de calcul des diverses versions

publicité
/*Attention!versionNONFONCTIONNELLE!ŞNefonctionnequepourk<121*/
privatestaticbooleanprem(intk){
if(k<2){returnfalse;}
if((k==2)||(k==3)||(k==5)||(k==7)){returntrue;}
if((k%2!=0)&&(k%3!=0)&&(k%5!=0)&&(k%7!=0)){
returntrue;
}
returnfalse;
}//prem
/**
*Listedesnombrespremiersàraisonde10parligne.
*
*Squelettegénéralduprogramme
*
*@authorPeterDAEHNEŞHEGGenève
*@version1.0
*/
publicclassPremSquelette{
/*RetournelavaleurtrueSIETSEULEMENTSIkestunnombrepremier*/
privatestaticbooleanprem(intk){
/*Applicationstrictedeladéfinition:
kestpremiers'ilaexactementdeuxdiviseursdistincts.*/
privatestaticbooleanprem(intk){
intcpt=0;
inti=1;
while(i<=k){
if(k%i==0){cpt=cpt+1;}
i=i+1;
}
returncpt==2;
}//prem
/*Algorithmetestantsikestunnombrepremier*/
}//prem
privatestaticvoidlisterPremiers(intn){
System.out.print("Listedesnombrespremiersentre0et"+n);
intk=0;intcpt=0;
while(k<=n){
if(prem(k)){
if(cpt%10==0){System.out.println();}
System.out.print(""+k);cpt=cpt+1;
}
k=k+1;
}
System.out.println();System.out.println("Ilyena"+cpt);
}//listerPremiers
/*Onarrêtelarecherchedesdiviseursàlaracinecarréedek.
Lesnombres0et1sonttraitésàpart.
Onretournelerésultatdèsqueconnu(undiviseuraététrouvé).*/
privatestaticbooleanprem(intk){
if(k<2){returnfalse;}
intracine=(int)Math.sqrt(k);
inti=2;
while(i<=racine){
if(k%i==0){returnfalse;}
i=i+1;
}
returntrue;
}//prem
publicstaticvoidmain(String[]args){
if(args.length<1){
System.out.println("Vousdevezfournirlalimitecommeparamètre.");
}else{
listerPremiers(Integer.parseInt(args[0]));
}
}//main
}//PremSquelette
Temps de calcul des diverses versions
Prem1
Prem2
Prem3
Prem4
-
temps
temps
temps
temps
de
de
de
de
calcul
calcul
calcul
calcul
pour
pour
pour
pour
tester
tester
tester
tester
les
les
les
les
nombres
nombres
nombres
nombres
premiers
premiers
premiers
premiers
entre
entre
entre
entre
0
0
0
0
et
et
et
et
1000000: 256.559 [secondes]
10000000:
6.905 [secondes]
10000000:
3.485 [secondes]
10000000:
2.332 [secondes]
Le cas de Prem1 doit être considéré à part et n’est pas comparable avec les autres.
Pour les autres solutions, on observe que les résultats expérimentaux confirment ce qu’on attendait
théoriquement :
ƒ entre Prem2 et Prem3, on gagne un facteur d’environ 2 (on ne fait que la moitié du travail dans Prem3, puisqu’on ne
teste pas les nombres pairs) ;
ƒ entre Prem3 et Prem4, on diminue encore le temps d’environ un tiers (en ne traitant pas les multiples de 3, il y a
environ un tiers de nombres en moins à tester).
/*Onarrêtelarecherchedesdiviseursàlaracinecarréedek.
Lesnombres0et1ainsique2etlespairssonttraitésàpart.
Onretournelerésultatdèsqueconnu(undiviseuraététrouvé).*/
privatestaticbooleanprem(intk){
if(k==2){returntrue;}
if((k<2)||(k%2==0)){returnfalse;}
intracine=(int)Math.sqrt(k);
inti=3;
while(i<=racine){
if(k%i==0){returnfalse;}
i=i+2;
}
returntrue;
}//prem
/*Onarrêtelarecherchedesdiviseursàlaracinecarréedek.
Lesnombres0,1,2,3ainsiquelespairsetlesmultiplesde3sonttraitésàpart.
Onretournelerésultatdèsqueconnu(undiviseuraététrouvé).*/
privatestaticbooleanprem(intk){
if((k==2)||(k==3)){returntrue;}
if((k<2)||(k%2==0)||(k%3==0)){returnfalse;}
intracine=(int)Math.sqrt(k);
inti=5;intpas=2;
while(i<=racine){
if(k%i==0){returnfalse;}
i=i+pas;pas=6Şpas;
}
returntrue;
}//prem
Téléchargement