« Crible d'Ératosthène » : différence entre les versions
Contenu supprimé Contenu ajouté
LiveRC : Révocation des modifications de 193.49.212.181; retour à la version de 193.49.212.181 |
→Version récursive : à sourcer : incomplet et pas clair |
||
(285 versions intermédiaires par plus de 100 utilisateurs sont masquées) | |||
Ligne 1 :
{{Voir homonymes|Ératosthène (homonymie)}}
Le '''crible d'[[Ératosthène]]''' est un procédé qui permet de trouver tous les [[nombre premier|nombres premiers]] inférieurs à un certain [[entier naturel]] donné ''N''. Le [[crible d'Atkin]] est plus rapide mais plus complexe.
== Algorithme ==
L'algorithme procède par élimination : il s'agit de supprimer d'une table des entiers de 2 à N tous les [[multiple (mathématiques)|multiples]] d'un entier (autres que lui-même).
En supprimant tous ces multiples, à la fin il ne restera que les entiers qui ne sont multiples d'aucun entier à part 1 et eux-mêmes, et qui sont donc les nombres premiers.
On commence par rayer les multiples de 2, puis les multiples de 3 restants, puis les multiples de 5 restants, et ainsi de suite en rayant à chaque fois tous les multiples du plus petit entier restant.
On peut s'arrêter lorsque le carré du plus petit entier restant est supérieur au plus grand entier restant, car dans ce cas, tous les non-premiers ont déjà été rayés précédemment.
À la fin du processus, tous les entiers qui n'ont pas été rayés sont les nombres premiers inférieurs à N.
L'animation ci-dessous illustre le crible d'Ératosthène pour N=120 :
[[Image:New Animation Sieve of Eratosthenes.gif|thumb|upright=2|center]]Remarque: si un nombre n est [[Nombre composé|composé]], alors n=n<sub>1</sub>n<sub>2</sub>, avec nécessairement l'un au moins des diviseurs n<sub>i</sub> plus petit que <math>\sqrt{n}</math>. C'est pourquoi dans le crible ci-dessus, pour chaque nombre premier trouvé, la suppression commence par le carré de celui-ci. À partir de 11, on devrait donc démarrer à 121=11², au-delà de la taille choisie 120, il n'y a donc plus aucune suppression après avoir trouvé les multiples de 7.
== Exemples de mise en œuvre informatique ==
Le crible d'Ératosthène peut être mis en œuvre de façon classique ou [[Récursivité|récursive]], mais aussi sous la forme d'une [[Pipeline (architecture des processeurs)|méthode pipe-line]].
=== Pseudo-code ===
Dans une version classique, on transcrit ainsi l'algorithme :
'''Fonction''' Eratosthène(Limite)
L = tableau de booléen de taille Limite, initialisé à Vrai
L[1] = Faux
'''Pour''' i de 2 à Limite
'''Si''' L[i]
'''Pour''' j de i*i à Limite par pas de i
''on peut commencer à i*i car tous les multiples de i inférieurs à i*i ont déjà été rayés''
L[j] = Faux
'''Fin pour'''
'''Fin si'''
'''Fin pour'''
'''Retourner''' L
'''Fin fonction'''
Comme dans l'animation ci-dessus, on peut optimiser le code précédent en arrêtant la boucle '''Pour''' i une fois <code>i*i>Limite</code> puisque l'on ne rentrera plus dans la boucle '''Pour''' j et en se contentant d'afficher les indices de L contenant Vrai.
'''Fonction''' Eratosthène(Limite)
L = tableau de booléen de taille Limite, initialisé à Vrai
L[1] = Faux
i=2
'''Tant que''' i*i≤Limite
'''Si''' L[i]
'''Pour''' j de i*i à Limite par pas de i
''on peut commencer à i*i car tous les multiples de i inférieurs à i*i ont déjà été rayés''
L[j] = Faux
'''Fin pour'''
'''Fin si'''
i=i+1
'''Fin tant que'''
'''Retourner''' L
'''Fin fonction'''
On peut aussi éviter de cocher plusieurs fois les nombres pairs et diviser le temps d'exécution par 2
'''Fonction''' Eratosthène(Limite)
L = tableau de booléen de taille Limite, initialisé à Vrai
Mettre à Faux les cases d'indice pair > 2
L[1] = Faux
i=3
'''Tant que''' i*i≤Limite
'''Si''' L[i]
'''Pour''' j de i*i à Limite par pas de 2*i
L[j] = Faux
'''Fin pour'''
'''Fin si'''
i=i+1
'''Fin tant que'''
'''Retourner''' L
'''Fin fonction'''
=== Version récursive ===
{{section à sourcer}}
Le crible d'Ératosthène se code facilement avec une [[fonction récursive]], qu'il suffit d'appeler initialement avec le tableau des entiers de 2 à N.
Voici un pseudo code :
<pre>
FONCTION Eratosthène( entiers )
SI premier entier au carré > dernier entier
ALORS AFFICHE entiers
SINON
AFFICHE premier entier
EXECUTE Eratosthène( tous les entiers non multiples du premier entier )
FIN SI
FIN FONCTION
</pre>
=== Version pipe-line : le crible de [[Charles Antony Richard Hoare|Hoare]] (1978) ===
L'idée est d'engendrer chaque nombre à vérifier, pour le soumettre à un tri en cascade, ne conservant des entiers reçus que ceux qui sont premiers.
Pour cela, à chaque nombre premier repéré est associé un poste qui ne transmettra parmi ses successeurs que ceux qui ne sont pas ses multiples.
Ce système n'utilise pas de table ou de liste de nombres à traiter ''a priori'', mais à tout moment ''un poste'' (cellule active ou ''[[coroutine]]'') ''par nombre premier déjà reconnu''.
<pre>
Crible de C.A.R HOARE :
Un GENERATEUR passe chaque entier de 2 à N au premier poste disponible(qu'il crée s'il n'existe pas).
Pour chaque POSTE créé :
* il conserve le premier entier qu'il reçoit, disons p,
* puis il transmet au poste suivant (créé si besoin) tout entier reçu n non divisible par p.
</pre>
Ainsi :
*2 crée le poste 2
*3 passe le poste 2 et crée le poste 3
*4 est intercepté par le poste 2
*5 passe les postes 2 et 3, et crée le poste 5
*6 est intercepté par le poste 2
*7 passe les postes 2, 3, 5, et crée le poste 7
*...
*36 est intercepté par le poste 2,
*37 passe les postes 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, et crée le poste 37...
En régime de croisière, '''''ce crible commence à vérifier la primalité de nouveaux nombres pendant qu'il poursuit ou achève la vérification de la primalité de nombres précédents'''''.
Nous noterons, qu'à moins de disposer d'une machine parallèle avec <math>\sqrt{n}</math> processeurs, cette méthode est inefficace puisque chaque poste parcourt un nombre d'entiers de l'ordre de n.
== Notes et références ==
{{Références}}
C. A. R. Hoare, ''Communicating sequential processes'', CACM 21 (1978) {{p.|666-677}}
Κόσκινον Ερατοσθένους ''or, The Sieve of Eratosthenes. Being an Account of His Method of Finding All the Prime Numbers'', by the Rev. Samuel Horsley, F. R. S.,
Philosophical Transactions (1683-1775), Vol. 62. (1772), {{p.|327-347}}.
== Annexes ==
=== Articles connexes ===
*[[Crible de Sundaram]]
*[[Crible d'Atkin]]
*[[Spirale d'Ulam]]
*[[Nombre chanceux]]
*[[Divisions successives]]
*[[Densité asymptotique|Densité]]
=== Liens externes ===
* [http://legeneraliste.perso.sfr.fr/?p=prems Implémentation en C# d'une optimisation du crible d'Ératosthène]
* [http://
* [http://pagesperso-orange.fr/therese.eveilleau/pages/truc_mat/pratique/textes/crible_an.htm Le crible d'Ératosthène]
{{Portail|arithmétique|informatique
[[Catégorie:Test de primalité]]
[[Catégorie:Nombre premier]]
[[Catégorie:Théorie des cribles]]
|