coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és1802Date d'inscriptionmardi 15 juillet 2003StatutMembreDernière intervention22 septembre 20095 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és193Date d'inscriptionmercredi 24 août 2005StatutMembreDerniè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és540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 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és540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 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és540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 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és540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 15 juil. 2006 à 00:48
Salut,
pas la peine de réinventer la roue... cf php.net
gmp_prob_prime()
xeonarno
Messages postés21Date d'inscriptionmardi 1 février 2005StatutMembreDernière intervention20 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és20Date d'inscriptiondimanche 2 janvier 2005StatutMembreDernière intervention14 juillet 2006 14 juil. 2006 à 17:41
Mouais t'as raison, j'avais oublé le break;
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 14 juil. 2006 à 01:40
Voila presque 10 fois plus rapide,
On voit ici l'importance du break!
on peut encore améliorer,... a vous.
;)
davwart
Messages postés855Date d'inscriptionmardi 19 novembre 2002StatutMembreDernière intervention28 juillet 20091 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és47Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 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.
18 juil. 2006 à 13:19
17 juil. 2006 à 13:24
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 :)
16 juil. 2006 à 23:53
Ps J'ai mis 5 par erreur. Malalam, STP, tu peux corriger?
16 juil. 2006 à 21:54
16 juil. 2006 à 16:38
c'est une mauvaise solution ça...
if($nb%$val===0){
ça c'est mieux et moins lent
15 juil. 2006 à 00:57
en fait c'est en for($a=$i*2;$a<=$limit;$a+=$i) qu'il faut remplacer ..
15 juil. 2006 à 00:56
15 juil. 2006 à 00:53
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 ..)
15 juil. 2006 à 00:48
<?
$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 ..
14 juil. 2006 à 20:02
pas la peine de réinventer la roue... cf php.net
gmp_prob_prime()
14 juil. 2006 à 18:43
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
14 juil. 2006 à 17:41
14 juil. 2006 à 01:40
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.
;)
13 juil. 2006 à 23:23
- 5/10
13 juil. 2006 à 22:44
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.