NOMBRE_PREMIER

dom_ponge Messages postés 47 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 septembre 2006 - 13 juil. 2006 à 22:44
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 18 juil. 2006 à 13:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38553-nombre-premier

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 juil. 2006 à 13:19
guill76, le php n'est pas limité à la programmation web, ce code n'a pas été corrigé, donc selon moi, ça ne vaut pas 4.5 de moyenne, mais beaucoup moins, car autant d'erreurs dans un programme aussi court, c'est inaccèptable!
cs_PaDa Messages postés 1802 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
17 juil. 2006 à 13:24
Remarque sans intérêt : c'est vraiment pas la panacée Xeonarno, ce cours.. même si ca change un peu des trucs stupides qu'on fait le reste de l'année en term' S

Une autre optimisation intéressante, plutot que d'aller de 2 en 2, pour des grands nombres, ca peut être intéressant de faire des sauts réguliers avec les écarts des premiers nombres premiers. Quand on saute de 2 en 2 trois fois de suite, on est fatalement tombé sur un multiple de 3, ce qui est intrinsèquement idiot. Donc on peut comme ca s'éviter des dizaines de tests inutiles.. 'suffit de regarder ca de plus près ensuite :)
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
16 juil. 2006 à 23:53
En prog web je vois pas trop l'utilité de savoir si un nombre est premier ou non, mais quoi qu'il en soit le raisonnement semble juste: ça vaut pas 4.67 de moyenne, moi je met 7.
Ps J'ai mis 5 par erreur. Malalam, STP, tu peux corriger?
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
16 juil. 2006 à 21:54
en terme de complexité , ils ont du O(n²) (il parcour tandis que moi O(n) s'il utilise la racine carré ils tomberont a O(n*sqrt(n)) qui est relativement elevé par rapport au mien .. fin au crible d'ératosthene ^^
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 juil. 2006 à 16:38
if(gettype($nb/$val) == 'integer'){

c'est une mauvaise solution ça...

if($nb%$val===0){

ça c'est mieux et moins lent
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 juil. 2006 à 00:57
re dsl mais la c'est bon j'ai fais les tests ..
en fait c'est en for($a=$i*2;$a<=$limit;$a+=$i) qu'il faut remplacer ..
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 juil. 2006 à 00:56
deuxieme erreur (mais moins grave ^^ ) , remplacer for($a=$i;$a<=$square;$a+=$i) par for($a=$i*2;$a<=$square;$a+=$i)
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 juil. 2006 à 00:53
oups une petite erreur ce n'est pas
for($i=2;$i<=$square;$i+=2)
mais
for($i=3;$i<=$square;$i+=2)

mais les perfs restent egales ( y a trop peu de nombres premiers pour faire la difference ..)
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 juil. 2006 à 00:48
avec mon code j'ai 0.030129 :
<?
$deb = microtime(true);
$limit=11150;
$square = sqrt($limit);
$tab = Array();
for($i=0;$i<=$limit;$i++)
$tab[$i] = true;
for($i=2;$i<=$square;$i+=2)
{
if($tab[$i])
{
for($a=$i;$a<=$square;$a+=$i)
$tab[$a] = false;
}
}
echo microtime(true) - $deb;
?>

mais il est pas encore optimisé au max .. j'ai encore un truc (a essayer) d'ameliorer ..
Utilisateur anonyme
14 juil. 2006 à 20:02
Salut,
pas la peine de réinventer la roue... cf php.net

gmp_prob_prime()
xeonarno Messages postés 21 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 20 août 2006
14 juil. 2006 à 18:43
Bonjour tous le monde ,

Je vois que hélas vous n'avez pas fait de cours de spécialité math en terminal. En effet en cours d'arithméthique on découvre que pour voir si un nombre est premier, il suffit de calculer sa racine carré et si ce nombre ne possède pas de diviseur entre 2 et sa racine carré alors il est premier.

Pour calculer une racine carré il suffit d'utiliser l'algorithme de Newton qui est très souvent utilisé dans les solutions embarqués à petit puissance de calcul tels que les téléphones portables. je te laisse le soin de le trouver je ne l'ai pas sous la main.(c'est une suite ).

Bien joué stepibou pour le break, je ne savais pas non plus que ça avait autant d'importance de mettre un break, joli coup d'optimisation ....

Cordialement,

Xeonarno
yannvag Messages postés 20 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 14 juillet 2006
14 juil. 2006 à 17:41
Mouais t'as raison, j'avais oublé le break;
stepibou Messages postés 112 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 11 octobre 2006
14 juil. 2006 à 01:40
oué, intéressant :

Chez moi ton code : 14.76s

celui d'en dessous sans le break : 12.57s

celui la : 1.54s

$nombres=array(2,3);
$nb=4;
$limit=11150;
while($nb<=$limit){
foreach($nombres as $val){
if(gettype($nb/$val) == 'integer'){
$nbpremier=false;
break;
}
}
if($nbpremier==true)
$nombres[]=$nb;
$nbpremier=true;
$nb++;
}

Voila presque 10 fois plus rapide,
On voit ici l'importance du break!

on peut encore améliorer,... a vous.
;)
davwart Messages postés 855 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 28 juillet 2009 1
13 juil. 2006 à 23:23
le code est Ok mais pas du tout du tout optimisé (il y a vraiment plein d'astuces pour trouver si un chiffre X est premier).

- 5/10
dom_ponge Messages postés 47 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 septembre 2006
13 juil. 2006 à 22:44
Un peu lent pour l'utilité(on pourrai mettre les nombres premiers dans un fichier .txt et les reprendres dans le fichier à place d'utilisé cette manière)...
Mais pour rajouté de la rapidité tu pourrai regardé si c'est un nombre pair(sauf pour le nombre 2) et si c'est ce l'est tu ne fait pas tout les calculs pour, sa le rendra 2 fois plus rapide!
Pour l'effort je donne 8.
Rejoignez-nous