Crible d'Erathostène.


Le crible d'Erathostène, un contemporain d'Achimède, permet de déterminer tous les nombres premiers inférieurs à un nombre entier N.

Rappel: un nombre naturel est dit premier si aucun nombre ne le divise sauf 1 et lui-même. Par convention, 1 n'est pas considéré comme premier.

A titre indicatif, le plus grand nombre premier connu est 21257787-1. Ce nombre s'écrit avec 378632 chiffres.

Voici les différentes étapes de l'algorithme:

Placer d'abord les nombres 1, 2, 3, ..., N dans un tableau.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Commencer avec l'élément en 2ème position et continuer avec les suivants:
si l'élément en position i a été supprimé, passer au suivant
sinon, supprimer tous les éléments du tableau (mais pas lui) dont le numéro de position est un multiple de i
Ceci donne:
i=2 : l'élément en 2ème position vaut 2. Supprimons donc les éléments en positions 4, 6, ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 x 5 x 7 x 8 x 9 x 11 x 13 x 15 x 19

i=3 : l'élément en 3ème position vaut 3. Supprimons donc les éléments en positions 6, 9, 12, ...
Note: l'élément en position 6 a été supprimé pour la 2ème fois mais ceci ne pose aucun problème.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 x 5 x 7 x 9 x 11 x 13 x x x 17 x 19

i=4 : l'élément en 4ème position a été supprimé. Ne rien faire.
Comme on peut le constater, seuls subsistent les nombres premiers.
Informatiquement, se pose le problème de la suppression des multiples de 2, 3, ... Le plus simple, comme on se trouve dans un tableau de nombre, est de remplacer le nombre supprimé par 0.
Il est également évident que dans le tableau, il est inutile de stocker un nombre (puisqu'il est égal à sa position); un booléen fera tout aussi bien l'affaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
V V V F V F V F V F V F V F F F V F V



Il faut noter que Erathostène positionnait les nombres comme ci-dessous et supprimait les verticales et obliques correspondant aux différents multiples:
en rouge, les verticales "multiples" de 2
en bleu, les obliques "multiples" de 3
en blanc, la verticale "multiple" de 5
en jaune, les obliques "multiples" de 7

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100


PROGRAM Erathostene;

CONST N=1000;

VAR A:ARRAY[1..N] OF BOOLEAN;
    i,j,M:WORD;

BEGIN
FOR i:=1 TO N DO A[i]:=TRUE;
M:=TRUNC(SQRT(N));
FOR i:=2 TO M DO
  IF A[i] THEN FOR j:=2 TO N DIV i DO A[i*j]:=FALSE;
FOR i:=1 TO N DO IF A[i] THEN WRITE(i:5);
END.

Page précédente.
Page d'accueil.