Featured image of post Qu'est-ce que le crible d'Ératosthène ? Algorithme et implémentation pour énumérer les nombres premiers jusqu'à 1000

Qu'est-ce que le crible d'Ératosthène ? Algorithme et implémentation pour énumérer les nombres premiers jusqu'à 1000

Nous expliquons clairement le fonctionnement et les étapes spécifiques de l'algorithme 'Crible d'Ératosthène' pour trouver efficacement les nombres premiers. Nous présentons également un exemple d'implémentation utilisant le langage Rust pour énumérer les nombres premiers inférieurs ou égaux à 1000.

Qu’est-ce que le Crible d’Ératosthène ?

Le Crible d’Ératosthène est un algorithme utilisé pour trouver tous les nombres premiers jusqu’à une limite donnée. L’algorithme est simple et peut être implémenté via les étapes suivantes :

  1. Créer un tableau booléen de N éléments et initialiser tous les éléments à vrai (true).
  2. Définir les 0ème et 1er éléments du tableau sur faux (false) (car 0 et 1 ne sont pas premiers).
  3. Si le 2ème élément du tableau est vrai, afficher 2 comme nombre premier.
  4. Définir tous les multiples de 2 supérieurs ou égaux à $2^2$ sur faux (*).
  5. Si le 3ème élément du tableau est vrai, afficher 3 comme nombre premier.
  6. Définir tous les multiples de 3 supérieurs ou égaux à $3^2$ sur faux.
  7. Répéter le même processus pour les 4ème, 5ème, …, et N-ième éléments.
  • La raison pour laquelle on commence à marquer comme faux à partir du carré du nombre est que les nombres inférieurs au carré ont déjà été traités lors des étapes précédentes.

Implémentation en Rust

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
fn main() {
    let n = 1000;
    let mut is_prime = vec![true; n+1];
    is_prime[0] = false;
    is_prime[1] = false;
    for i in 2..=n {
        if is_prime[i] {
            println!("{}", i);
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i;
            }
        }
    }
}

Version légèrement optimisée

Nous pouvons optimiser légèrement l’implémentation en considérant les points suivants :

  • Initialiser le tableau à faux (false) au lieu de vrai (true) (cela est plus rapide).
  • Puisque les multiples de 2 ne sont pas des nombres premiers, ignorer l’étape visant à définir les multiples de 2 sur faux.
  • Il n’est pas nécessaire de boucler jusqu’à n ; trouver les nombres premiers jusqu’à la racine carrée de n suffit pour trouver tous les nombres premiers inférieurs ou égaux à n.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let n = 1000;
    let mut is_prime = vec![false; n+1];
    is_prime[2] = true;
    for i in (3..=n).step_by(2) {
        is_prime[i] = true;
    }
    for i in 3..=((n as f64).sqrt() as usize) {
        if is_prime[i] {
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i * 2;
            }
        }
    }
    for i in (2..=n).filter(|&x| is_prime[x]) {
        println!("{}", i);
    }
}

Référence

comments powered by Disqus
Généré avec Hugo
Thème Stack conçu par Jimmy