|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() |
Bonjour à tous,
J'essaie désespérément de comprendre ce crible, j'ai bien compris la théorie (cf http://en.wikipedia.org/wiki/Sieve_of_Sundaram), mais dès que je veux l'implémenter ça ne marche pas du tout. Pour info, j'ai cherché sur google, tout ce que je trouvais en anglais et en français, j'ai dû trouver une dizaine de sources, mais elles étaient toutes fausses. Ou alors j'ai mal compris le but de cet algo. Du coup, voici mon code : Code :
Ce qui se vérifie à peu près. Si vous remarquez, j'ai ajouté une petite ligne pour afficher la valeur de la variable modif et la valeur sensée être un premier (donc modif * 2 + 1). Si vous l'exécutez vous remarquerez que le programme sort bien tous les nombres premiers, mais que pour certaines valeurs de modif étant premier, il nous sort des multiples de 3 et de 5, n'étant forcément pas premières. Si quelqu'un peut m'expliquer où je fais fausse route, et pourquoi toutes les sources du net semblent être fausses, ça m'éclairerait beaucoup. Merci. |
||
|
|
10
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mars 2011 Messages : 531 ![]() |
Salut,
Je ne connaissait pas ce crible mais d'après http://villemin.gerard.free.fr/Wwwgv...r/sundaram.htm: "Si N est dans ce tableau, Alors 2N + 1 n'est pas premier" et "Si N n'est pas dans ce tableau, Alors 2N + 1 est premier." Donc l.39, tu devrais avoir logiquement prime[modif*2 + 1] = false;. Mais tu devrais utiliser 2 tableau. Un tableau "list" qui dit si un nombre est dans le tableau ou pas, et un tableau "prime" qui dit s'il est premier ou pas, car à la l.39 tu écrase une valeur que tu n'as pas encore traité.
__________________
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() |
Merci pour ta réponse.
Je me suis rendu compte de mon erreur, celle où j'écrase la valeur que je viens d'attribuer, juste après avoir posté ici, comme quoi Par contre j'avais été sur le site que tu me proposes mais il est différent de tout ce que j'ai vu, il n'indique pas les mêmes choses, et pour programmer ce genre de tableau ça va augmenter la complexité de l'algorithme. En toute logique et selon wiki, et d'autres sites, une fois qu'on a fait les deux boucles i et j, on devrait avoir le bon NOMBRE de premier - 1 (puisque 2 n'est pas compté). En effet, on est sensé appliquer (selon mes sources) 2n + 1 à tout n restant, et dire que le résultat est premier. Du coup pour tout n restant il existe un premier dans l'intervalle, donc le nombre de n restant devrait indiquer le nombre de premiers. Du coup j'ai résolu mon problème en écrivant ce message ![]() Au final la boucle modif ne sert à rien, je n'ai qu'a modifier mon code pour qu'il affiche les premiers, et en ajoutant un test à la dernière boucle, ça marche, on a donc ça : Code :
Merci encre pour ta réponse |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com