Crible d'Eratosthène

Un nombre premier est un nombre entier naturel qui admet exactement deux diviseurs distincts entiers et positifs : 1 et lui-même.

Le crible d’Ératosthène permet de déterminer les nombres premiers plus petit qu’un certain nombre n fixé.

On considère pour cela un tableau tab de nbooléens, initialement tous égaux à True, sauf tab[0] et tab[1] qui valent False, 0 et 1 n’étant pas des nombres premiers.

On parcourt alors ce tableau de gauche à droite.

Pour chaque indice i :

  • si tab[i] vaut True : le nombre i est premier et on donne la valeur False à toutes les cases du tableau dont l’indice est un multiple de i, à partir de 2*i (c’est-à-dire 2*i, 3*i ...).

  • si tab[i] vaut False : le nombre i n’est pas premier et on n’effectue aucun changement sur le tableau.

On dispose de la fonction crible, incomplète et donnée ci-dessous, prenant en paramètre un entier n strictement positif et renvoyant un tableau contenant tous les nombres premiers plus petits que n.

Sieve of Eratosthenes animation.gif
By CC BY-SA 3.0, Link

Auteur SKopp sur Wikipedia allemand

Compléter la fonction crible

###
# Testsbksl-nlassert crible(40) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]bksl-nlbksl-nl# Autres testsbksl-nlassert crible(500) == [2,bksl-nl 3,bksl-nl 5,bksl-nl 7,bksl-nl 11,bksl-nl 13,bksl-nl 17,bksl-nl 19,bksl-nl 23,bksl-nl 29,bksl-nl 31,bksl-nl 37,bksl-nl 41,bksl-nl 43,bksl-nl 47,bksl-nl 53,bksl-nl 59,bksl-nl 61,bksl-nl 67,bksl-nl 71,bksl-nl 73,bksl-nl 79,bksl-nl 83,bksl-nl 89,bksl-nl 97,bksl-nl 101,bksl-nl 103,bksl-nl 107,bksl-nl 109,bksl-nl 113,bksl-nl 127,bksl-nl 131,bksl-nl 137,bksl-nl 139,bksl-nl 149,bksl-nl 151,bksl-nl 157,bksl-nl 163,bksl-nl 167,bksl-nl 173,bksl-nl 179,bksl-nl 181,bksl-nl 191,bksl-nl 193,bksl-nl 197,bksl-nl 199,bksl-nl 211,bksl-nl 223,bksl-nl 227,bksl-nl 229,bksl-nl 233,bksl-nl 239,bksl-nl 241,bksl-nl 251,bksl-nl 257,bksl-nl 263,bksl-nl 269,bksl-nl 271,bksl-nl 277,bksl-nl 281,bksl-nl 283,bksl-nl 293,bksl-nl 307,bksl-nl 311,bksl-nl 313,bksl-nl 317,bksl-nl 331,bksl-nl 337,bksl-nl 347,bksl-nl 349,bksl-nl 353,bksl-nl 359,bksl-nl 367,bksl-nl 373,bksl-nl 379,bksl-nl 383,bksl-nl 389,bksl-nl 397,bksl-nl 401,bksl-nl 409,bksl-nl 419,bksl-nl 421,bksl-nl 431,bksl-nl 433,bksl-nl 439,bksl-nl 443,bksl-nl 449,bksl-nl 457,bksl-nl 461,bksl-nl 463,bksl-nl 467,bksl-nl 479,bksl-nl 487,bksl-nl 491,bksl-nl 499]bksl-nl bksl-nlbksl-nl 5/5
def crible(n):bksl-nl """bksl-nl Renvoie un tableau contenant tous les nombres premiers plus petitsbksl-nl que nbksl-nl """bksl-nl premiers = []bksl-nl tab = [True] py-str nbksl-nl tab[0], tab[1] = False, Falsebksl-nl for i in range(..., n):bksl-nl if tab[i] == ...:bksl-nl premiers.append(...)bksl-nl for multiple in range(2 py-str i, n, ...):bksl-nl tab[multiple] = ...bksl-nl return premiersbksl-nlbksl-nl# Testsbksl-nlassert crible(40) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]bksl-nlbksl-nlbksl-nldef crible(n):bksl-nl """bksl-nl Renvoie un tableau contenant tous les nombres premiers plus petitsbksl-nl que nbksl-nl """bksl-nl premiers = []bksl-nl tab = [True] py-str nbksl-nl tab[0], tab[1] = False, Falsebksl-nl for i in range(2, n):bksl-nl if tab[i] == True:bksl-nl premiers.append(i)bksl-nl for multiple in range(2 py-str i, n, i):bksl-nl tab[multiple] = Falsebksl-nl return premiersbksl-nlbksl-nlbksl-nlbksl-nlbksl-nl


A la place de la ligne 12 nous aurions pu écrire :

for multiple in [k*i for k in range(2, n) if k*i<n]: