crible d'Eratosthene en c - C - Programmation
Marsh Posté le 02-05-2007 à 15:47:35
Bah plutot que retirer, tu ajoutes seulement si le nombre est bien premier. Donc tu testes avant.
Marsh Posté le 02-05-2007 à 15:54:44
indice :
Pour tester si un nombre premier, tu testes juste avec les nombres premiers plus petits ou égaux à racinecarree(nb)
=> ça évite énormément de tests inutiles : genre 51 ne peut pas être un multiple de 50, au maximum tu trouveras des multiples jusqu'à n à n² = 51
=> et pas la peine non plus de tester si le nombre est un multiple d'un nombre qui n'est pas premier
y'a d'autres approche bien plus rapides, mais bon, celle-ci est évidente et simple à mettre en place.
edition : nombre "premiers" je veux dire, pas "entiers"
Marsh Posté le 02-05-2007 à 15:57:04
ReplyMarsh Posté le 02-05-2007 à 16:13:32
Faudrait faire des calculs que je sais pas faire, mais j'aimerais bien comparer avec ma méthode. Je ne suis pas sûr que le truc que tu indique soit réellement mieux
Quoique pour les grandes valeurs, effectivement ta solution semmble meilleure (mais plus consommatrice en mémoire... j'imagine si on doit rechercher les nombres entiers de 0 à 2^64, ça fait un sacré array à mettre en mémoire, même si c'est un simple array de bit qui est retenu (optimisation à la con qui rend le code imbittable )
Marsh Posté le 02-05-2007 à 16:17:50
C'est un point de vue algorithmique, pas optimisation (donc mieux ou pas, c'est juste une source de doc en plus).
Cela dit, dans la discussion, on trouve une implé en perl:
http://fr.wikipedia.org/wiki/Discu [...] th%C3%A8ne
Marsh Posté le 02-05-2007 à 16:22:54
Nan pis en fait j'avais pas lu le titre du topic. C'est effectivement une implantation de cet algo qu'il veut, j'ai répondu à côté de la plaque
Marsh Posté le 02-05-2007 à 16:32:30
ReplyMarsh Posté le 02-05-2007 à 16:35:59
Sinon, pour en revenir à cet algo donc...
array de byte avec comme valeurs 0 ou 1 (et indices 2..n, je te laisse t'amuser avec un offset pour partir de 0 )
ensuite, tu les initialise tous à 0, et quand ils sont cochés, tu passes à 1
Pour le reste, tu suis bêtement les explications du lien de darkalt3. Ensuite t'as plus qu'à lire les valeurs dans ton tableau, et n'afficher que les indices de ceux qui sont encore à 0
Marsh Posté le 02-05-2007 à 16:42:49
C'est marrant, je ne reconnais pas ma technique dans les tests du gars. Pourtant elle est mieux par exemple que sa première tentative...
Marsh Posté le 02-05-2007 à 17:42:45
LOL.
Bon, ben moi je suis nul en analyse de code...
Je pensais pas solution plus rapide pour de petites valeurs et moins rapide pour des grandes...
Mais c'est l'inverse
Bench sur 2 à 100 :
|
Bench sur 2 à 1000000 :
|
Le code (en C#) :
Code :
|
Ceci dit, le problème avec les petites valeurs, c'est je pense la lourdeur de l'objet List<>... Avec un int[] initialisé avec une taille arbitraire ce serait je pense plus rapide aussi dans le cas des toutes petites valeurs
Evidement, les deux bouts de code retournent le même résultat hein
|
Avec une prévérence tout de même pour mon code : j'ai un objet List<int> qui ne contient QUE les nombres premiers à la sortie. Alors qu'avec l'algo d'Eratosthènemachin, je me retrouve avec un array de bool que je dois parcourir à chaque fois pour retrouver les indices désirés...
En tout cas, je suis content. L'algo que j'ai mis au point en BASIC sur mon C64 (j'avais quoi... 9 ou 10 ans à l'époque ) reste meilleur que ce qu'on étudie à la fac
Marsh Posté le 02-05-2007 à 18:04:40
MagicBuzz, ça t'embêterait de faire du C sur ce forum C ?
Marsh Posté le 02-05-2007 à 18:38:40
Mais tu nous pourris quoi avec ton C# ? On le sait déjà que tu ne connais pas le C
Marsh Posté le 02-05-2007 à 18:49:57
MagicBuzz a écrit : LOL. Bon, ben moi je suis nul en analyse de code... Mais c'est l'inverse |
Mon code Haskell défonce ton code C#
(et en plus il est lisible, et la logique applicative tient en 9 lignes)
(et c'est sans optimisations )
Marsh Posté le 02-05-2007 à 20:06:41
Mon code est parfaitement lisible
Sinon, moi les instructions utiles au code (our le premier par exemple) y'a que 11 lignes, en comptant les déclarations... Alors tes 9 lignes...
Marsh Posté le 02-05-2007 à 20:09:12
matafan a écrit : MagicBuzz, ça t'embêterait de faire du C sur ce forum C ? |
1/ je fais du C, j'ai juste rajouté un # derrière
2/ en ce qui concerne l'algo, perso, je vois pas de diff avec le C... pour le premier algo, la seule code qui ne se transpose pas nativement en C, c'est le coup du List<int> et j'ai indiqué qu'un simple array de taille arbitraire à la place fait aussi bien l'affaire... quant au second... mise à part la déclaration d'un array qui n'est pas la même, ainsi que le type bool qui n'existe pas je crois, le code compile avec un compilateur C... alors faut pas pousser
Marsh Posté le 02-05-2007 à 20:10:22
MagicBuzz a écrit : Mon code est parfaitement lisible |
Absolument pas, c'est la dèche de comprendre la logique applicative.
Lisible c'est ça:
Code :
|
Et en bonus ça écrase ton code en efficacité:
$ time ./a.out 1000000 > /dev/null real 0m0.150s real 0m15.959s |
Marsh Posté le 02-05-2007 à 20:14:27
pis c'est pas du C d'abors, tu va te faire engueuler toi aussi
Marsh Posté le 02-05-2007 à 20:16:42
sinon, ton algo, en français, ça donne quoi ? (parcequ'il a l'air un peu différent du mien, mais je pige pas une ligne sur 15
Marsh Posté le 02-05-2007 à 20:18:13
MagicBuzz a écrit : sinon, ton algo, en français, ça donne quoi ? (parcequ'il a l'air un peu différent du mien, mais je pige pas une ligne sur 15 |
C'est une traduction directe du Crible en Haskell.
Je te le détaille dans un thread dédié dans la souscat FP, histoire de cesser le HS
edit: http://forum.hardware.fr/hfr/Progr [...] 3972_1.htm
Marsh Posté le 03-05-2007 à 14:20:00
Après correction de mon algo complètement pourri, finalement le crible d'eratosthene est infiniment meilleur que mon approche pourrie
Et C# défonce haskell (envirnon 5 fois plus rapide... jusqu'à ce qu'on arrive à plus de 10 000 000, là C# n'aime pas les gros tableaux et devient 3 fois plus lent )
Code :
|
Et qu'on aille pas me dire que c'est du chinois pour ceux qui font du C
Marsh Posté le 03-05-2007 à 16:22:32
Le crible de machin c'est l'algo le plus rapide, point. Le seul inconvénient c'est qu'il n'est exploitable que pour les petits nombres (TRES petits) car extrêmement gourmand en mémoire.
Marsh Posté le 03-05-2007 à 16:36:23
matafan a écrit : Le crible de machin c'est l'algo le plus rapide, point. Le seul inconvénient c'est qu'il n'est exploitable que pour les petits nombres (TRES petits) car extrêmement gourmand en mémoire. |
Je crois que le crible d'Atkin est normalement plus rapide, mais plus complexe (et c'est ne évolution du crible d'Eratosthène et pas un algo complètement différent)
Marsh Posté le 03-05-2007 à 19:21:21
lamouche8 a écrit : Bonjour,
|
Ici, ça va de 0 à 99.
Marsh Posté le 02-05-2007 à 15:42:47
Bonjour,
Je dois trouver les nombres premiers de 1 à 100 en C.
Pour ça, j'ai écris les nombres dans un tableau via ce code :
C'est après que se pose mon problème. Je ne vois pas comment retirer les multiples des nombres premiers.
Si quelqu'un à une idée, merci de bien vouloir m'aider.