RECHERCHE DE NOMBRES PREMIERS PAR LE CRIBLE D'ERATOSTHENE
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010
-
27 juin 2006 à 14:34
ncoder
Messages postés244Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 6 avril 2008
-
29 juin 2006 à 13:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Pole4
Messages postés20Date d'inscriptionmardi 11 octobre 2005StatutMembreDernière intervention13 mars 2007 29 juin 2006 à 12:55
En réponse à un message plus haut, oui on peut l'optimiser.
En mémoire, en ne stockant qu'un nombre sur 2, les nombres impairs (ne pas oublier 2).
En temps, il faut remplacer :
-les pow(2,x%8) par 1<<(x&7)
-les x/8 par x>>3
-à part pour 2, on peut utiliser une incrément de j qui est 2*i
-on peut commencer pour j à i*i
-plus compliqué qu'au dessus, prendre une variable qui contient j/8, et une autre j%8, et à chaque fois, ajouter i%8, sur la variable de j%8 et si c'est >8, enlever 8 à cette variable et incrémenter l'autre (valable pour la version qui utilise les nb pairs et impairs, à modifier pour l'autre).
Avec ça, on peut aller beaucoup plus loin que 100000. (le record est 10^16)
Autre optimisation algorithmique : utiliser le crible d'Atkin.
Pole.
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 29 juin 2006 à 12:30
BruNews,
D'abord merci d'avoir conservé cette source, cela me permettra de faire progresser l'algorythme, si c'est encore possible.
Ensuite, j'ai moi-même recherché, sur la totalité des codes sources, ceux qui font référence à premier, premiers, Eratosthène...
Je n'ai trouvé que le mien en C, me serais-je trompé dans ma recherche ?
Si c'est le cas, veuiller m'indiquer ceux que je n'ai pas su trouver, afin de m'en inspirer si c'est utile.
Enfin, je reconnais que j'étais bien conscient que ma source était destinée à être supprimer, en revanche je voulais bénéficier du surcis pour connaitre l'avis d'autres developpeurs, et mes mises à jours n'ont eu pour but que de leurs présenter la version la plus récente, et de corriger de nombreuses fautes d'orthographes.
Salutations.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 28 juin 2006 à 18:05
_michel,
une prochaine fois évite les mises à jour si j'ai indiqué que ça ne sera pas conservé, ce serait perdre du temps.
Je vais donc exceptionnellement laisser cette source mais rappelle toi bien à l'avenir de controler que le sujet n'est pas déjà traité en de nombreux exemplaires parce qua ce sera suppression à tout coup, la place sur nos serveurs n'est pas infinie.
Bonne continuation.
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 28 juin 2006 à 16:34
Ha oui, j'oubliais, il est conseillé de changer la sortie standard, pour éviter d'afficher 10000 lignes à l'écran.
Pour ceux qui ne savent pas comment on fait , on tape :
"premier > fichier.txt"
au lieu
"premier"
L'inconvénient est qu'on ne peut pas executer le programme de l'explorateur Windows, mais à partir d'une invite de commande.
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 28 juin 2006 à 16:15
Donc, il serai peut être interessant de faire un programme qui donne touts les diviseurs d'un nombre.
Si les seuls diviseurs sont 1 et ce nombre, il est premier.
vlostanlen
Messages postés6Date d'inscriptiondimanche 19 mars 2006StatutMembreDernière intervention28 juin 2006 28 juin 2006 à 16:08
L'algorithme est rapide est intéressant, mais je trouve qu'il est plus utile de savoir si un nombre est premier, ou quels nombre sont premiers dans une plage de nombres. Bon codage, mais "tournure" pas très judicieuse à mon goût.
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 28 juin 2006 à 14:37
Ca y est, j'ai modifié mon code, il est beaucoup plus rapide, mais peut-on encore l'optimiser?
Noxk
Messages postés10Date d'inscriptiondimanche 26 février 2006StatutMembreDernière intervention27 mars 2007 28 juin 2006 à 10:01
for(i=0; i<Taille; i++)
Tab[i] = i + 2;
for (i=2; i<Taille/2; i++)
{
if (!Tab[i])
continue;
for (j=i*2; j<Taille; j += i)
{
if (Tab[j])
Tab[j] = 0;
}
}
voila le bout de code que j'avais du utiliser pour calculer les nombres premiers. Si ca peut servir...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 juin 2006 à 18:00
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 27 juin 2006 à 15:06
Merci, je vais l'essayer pour voir si c'est plus rapide (vu que le 9999ème nbr 1er vaut environ 104000, je suis pas encore trop sur que ca va être possible niveau mémoire).
Pole4
Messages postés20Date d'inscriptionmardi 11 octobre 2005StatutMembreDernière intervention13 mars 2007 27 juin 2006 à 14:46
Utilise le crible d'Erathostène.
On part d'une liste
2 3 4 5 6 7 8 9 10
On prend le premier nombre : 2->1 er nombre premier
On l'enlève.
On enlève tous ses multiples.
3 5 7 9
On prend le premier nombre : 3-2ème nombre premier
On l'enlève.
On enlève tous ses multiples.
5 7
5 est plus grand que la racine carré de 10, on stoppe.
Normalement pour l'implémentation, on prend une liste qu'on a mis à 0, et à chaque fois qu'on effectue l'opération on enlève, on met la case correspondante à 1. Pour prendre le premier nombre, on recherche le premier nombre != 0.
Pole.
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 27 juin 2006 à 14:34
Je cherche à optimiser mon algo.
Merci de me donner des conseils.
29 juin 2006 à 13:38
http://www.cppfrance.com/codes/NOMBRES-PREMIERS-CRIBLE-ERATHOSTENE_24873.aspx
http://www.cppfrance.com/codes/RECHERCHE-NOMBRES-PREMIERS-AVEC-CRIBLE-ERATOSTHENE_9715.aspx
ou encore
http://www.cppfrance.com/codes/CRIBLE-ERATOSTHENE_10945.aspx
A+ bonne programmation
29 juin 2006 à 12:55
En mémoire, en ne stockant qu'un nombre sur 2, les nombres impairs (ne pas oublier 2).
En temps, il faut remplacer :
-les pow(2,x%8) par 1<<(x&7)
-les x/8 par x>>3
-à part pour 2, on peut utiliser une incrément de j qui est 2*i
-on peut commencer pour j à i*i
-plus compliqué qu'au dessus, prendre une variable qui contient j/8, et une autre j%8, et à chaque fois, ajouter i%8, sur la variable de j%8 et si c'est >8, enlever 8 à cette variable et incrémenter l'autre (valable pour la version qui utilise les nb pairs et impairs, à modifier pour l'autre).
Avec ça, on peut aller beaucoup plus loin que 100000. (le record est 10^16)
Autre optimisation algorithmique : utiliser le crible d'Atkin.
Pole.
29 juin 2006 à 12:30
D'abord merci d'avoir conservé cette source, cela me permettra de faire progresser l'algorythme, si c'est encore possible.
Ensuite, j'ai moi-même recherché, sur la totalité des codes sources, ceux qui font référence à premier, premiers, Eratosthène...
Je n'ai trouvé que le mien en C, me serais-je trompé dans ma recherche ?
Si c'est le cas, veuiller m'indiquer ceux que je n'ai pas su trouver, afin de m'en inspirer si c'est utile.
Enfin, je reconnais que j'étais bien conscient que ma source était destinée à être supprimer, en revanche je voulais bénéficier du surcis pour connaitre l'avis d'autres developpeurs, et mes mises à jours n'ont eu pour but que de leurs présenter la version la plus récente, et de corriger de nombreuses fautes d'orthographes.
Salutations.
28 juin 2006 à 18:05
une prochaine fois évite les mises à jour si j'ai indiqué que ça ne sera pas conservé, ce serait perdre du temps.
Je vais donc exceptionnellement laisser cette source mais rappelle toi bien à l'avenir de controler que le sujet n'est pas déjà traité en de nombreux exemplaires parce qua ce sera suppression à tout coup, la place sur nos serveurs n'est pas infinie.
Bonne continuation.
28 juin 2006 à 16:34
Pour ceux qui ne savent pas comment on fait , on tape :
"premier > fichier.txt"
au lieu
"premier"
L'inconvénient est qu'on ne peut pas executer le programme de l'explorateur Windows, mais à partir d'une invite de commande.
28 juin 2006 à 16:15
Si les seuls diviseurs sont 1 et ce nombre, il est premier.
28 juin 2006 à 16:08
28 juin 2006 à 14:37
28 juin 2006 à 10:01
Tab[i] = i + 2;
for (i=2; i<Taille/2; i++)
{
if (!Tab[i])
continue;
for (j=i*2; j<Taille; j += i)
{
if (Tab[j])
Tab[j] = 0;
}
}
voila le bout de code que j'avais du utiliser pour calculer les nombres premiers. Si ca peut servir...
27 juin 2006 à 18:00
http://www.google.com/custom?domains=cppfrance.com&q=premier&sa=Rechercher&sitesearch=cppfrance.com
Ne sera pas conservé.
27 juin 2006 à 15:06
27 juin 2006 à 14:46
On part d'une liste
2 3 4 5 6 7 8 9 10
On prend le premier nombre : 2->1 er nombre premier
On l'enlève.
On enlève tous ses multiples.
3 5 7 9
On prend le premier nombre : 3-2ème nombre premier
On l'enlève.
On enlève tous ses multiples.
5 7
5 est plus grand que la racine carré de 10, on stoppe.
Normalement pour l'implémentation, on prend une liste qu'on a mis à 0, et à chaque fois qu'on effectue l'opération on enlève, on met la case correspondante à 1. Pour prendre le premier nombre, on recherche le premier nombre != 0.
Pole.
27 juin 2006 à 14:34
Merci de me donner des conseils.