Batshi
Messages postés1Date d'inscriptionsamedi 30 juin 2012StatutMembreDernière intervention 6 juillet 2012 6 juil. 2012 à 16:05
C bon
cs_prim
Messages postés12Date d'inscriptionmardi 17 juin 2003StatutMembreDernière intervention23 mars 2009 14 févr. 2004 à 23:00
franchement bien joué !! j'y avais pensé au crible d'Erastotène mais je ne savais pas comment mettre ca algorithmiquement (ché pas si ca se dit lol); le pire c'est que c franchement rapide comparé a mes boucles sans fin lol
ENCORE BIEN JOUé
cs_prim
Messages postés12Date d'inscriptionmardi 17 juin 2003StatutMembreDernière intervention23 mars 2009 14 févr. 2004 à 23:00
franchement bien joué !! j'y avais pensé au crible d'Erastotène mais je ne savais pas comment mettre ca algorithmiquement (ché pas si ca se dit lol); le pire c'est que c franchement rapide comparé a mes boucles sans fin lol
ENCORE BIEN JOUé
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 14 févr. 2004 à 14:00
voilà j'ai corrigé mon code, teste les vitesses des deux pr voir, j'ai pas le temps ici:
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 14 févr. 2004 à 13:48
je te conseil fortement d'utiliser le crible d'eratosthène pour générer une liste de nombres premiers, parce que les opérations modulo (%) sont gourmandes dans une boucle aussi longue. Pour info, j'avais écrit un script de ce genre avec l'opéro modulo pour calculer ts les nb prem < 10 000 000 et ça prenait plusieurs minutes. j'ai repensé mon code en remplaçant les modulo par des "plus" (+), et ça a mis 2,5 secondes (en C++, notez que sur cppfrance un gars a posté un prog qui génère les nb prem < 1 000 000 en 0,067s!)
pour le crible, le principe est simple:
$Naturels = array(); //tableau des naturels jusque $n (0 compris mais on s'en fiche)
for($i = 0; $i <= $n; $i++) $Naturels[] = true;
//la ligne ci-dessus met ts les naturels à true par défaut, donc par défaut ils sont premiers
$Naturels[1] = false; //pas 1, et l'indice 0 est pas utilisé
//mtnt commence l' "astuce", càd qu'on passe ts les Naturels en revue, et chaque fois qu'on rencontre un nombre qui est mis à true (donc qui est premier), on met ts ses multiples à false
for($i = 2; $i <= $n; $i++)
{
if($Naturels[$i] == false) continue; //on passe s'il est composé (= pas premier)
//si on arrive ici, c'est que c'est un nombre premier, donc on passe tous le tableau à la recherche des multiples, c'est ici que j'avais mis mes modulo, mais pr atteindre les multiples ils suffit d'avancer de $i en $i !
//on a donc mtnt un tableau assez grand qui contient true ou false pr ts les naturels jusque n, donc on crée un nouveau tableau dans lequel on ne met que les nombres premiers (les 'true')
et là il s'agit de traiter ce tableau (afficher, sauver ...) et aussi si le script est encore long d'effacer le tableau Naturels, désormais inutile (il faut utiliser unset ou un truc du genre, je sais plus, unlink peut etre)
j'ai tappé ça en live donc je promets pas que le code fonctionne, mais tu as l'idée ;-)
amicalement,
Kirua
cs_prim
Messages postés12Date d'inscriptionmardi 17 juin 2003StatutMembreDernière intervention23 mars 2009 13 févr. 2004 à 16:58
oué je penses qu'il y a moyen d'optimiser ça, je v y réfléchir ;)
davwart
Messages postés855Date d'inscriptionmardi 19 novembre 2002StatutMembreDernière intervention28 juillet 20091 13 févr. 2004 à 16:42
hou là..c bon en theorie.. mais la..effectivment ça va tourner longtmeps..
y'a moyen d'optimier ça..
par exmple ta deuxieme boulce peut s'arreter à i%2 :-)
6 juil. 2012 à 16:05
14 févr. 2004 à 23:00
ENCORE BIEN JOUé
14 févr. 2004 à 23:00
ENCORE BIEN JOUé
14 févr. 2004 à 14:00
<?
$n = 100;
$Naturels = array();
for($i = 0; $i <= $n; $i++) $Naturels[] = 1;
$Naturels[0] = 0;
$Naturels[1] = 0;
for($i = 2; $i <= $n; $i++)
if($Naturels[$i] == 1)
for($j = $i*2; $j <= $n; $j += $i)
$Naturels[$j] = 0;
$Premiers = array();
for($i = 2; $i <= $n; $i++)
if($Naturels[$i]) $Premiers[] = $i;
echo "";
print_r($Premiers);
echo "
";
?>
bonne journée ;-)
14 févr. 2004 à 13:48
pour le crible, le principe est simple:
$Naturels = array(); //tableau des naturels jusque $n (0 compris mais on s'en fiche)
for($i = 0; $i <= $n; $i++) $Naturels[] = true;
//la ligne ci-dessus met ts les naturels à true par défaut, donc par défaut ils sont premiers
$Naturels[1] = false; //pas 1, et l'indice 0 est pas utilisé
//mtnt commence l' "astuce", càd qu'on passe ts les Naturels en revue, et chaque fois qu'on rencontre un nombre qui est mis à true (donc qui est premier), on met ts ses multiples à false
for($i = 2; $i <= $n; $i++)
{
if($Naturels[$i] == false) continue; //on passe s'il est composé (= pas premier)
//si on arrive ici, c'est que c'est un nombre premier, donc on passe tous le tableau à la recherche des multiples, c'est ici que j'avais mis mes modulo, mais pr atteindre les multiples ils suffit d'avancer de $i en $i !
for($j = $i; $j <= $n; $j += $i)
$Naturels[$j] = false;
}
//on a donc mtnt un tableau assez grand qui contient true ou false pr ts les naturels jusque n, donc on crée un nouveau tableau dans lequel on ne met que les nombres premiers (les 'true')
$Premiers = array();
for($i = 2; $i <= $n; $i++)
if($Naturels[$i]) $Premiers[] = $i;
et là il s'agit de traiter ce tableau (afficher, sauver ...) et aussi si le script est encore long d'effacer le tableau Naturels, désormais inutile (il faut utiliser unset ou un truc du genre, je sais plus, unlink peut etre)
j'ai tappé ça en live donc je promets pas que le code fonctionne, mais tu as l'idée ;-)
amicalement,
Kirua
13 févr. 2004 à 16:58
13 févr. 2004 à 16:42
y'a moyen d'optimier ça..
par exmple ta deuxieme boulce peut s'arreter à i%2 :-)