Featured image of post Was ist das Sieb des Eratosthenes? Algorithmus und Implementierung zur Auflistung von Primzahlen bis 1000

Was ist das Sieb des Eratosthenes? Algorithmus und Implementierung zur Auflistung von Primzahlen bis 1000

Wir erklären den Mechanismus und die spezifischen Schritte des „Siebs des Eratosthenes“, eines Algorithmus zum effizienten Finden von Primzahlen, auf leicht verständliche Weise. Wir stellen auch ein Implementierungsbeispiel vor, das Primzahlen bis zu 1000 mit der Sprache Rust auflistet.

Was ist das Sieb des Eratosthenes?

Das Sieb des Eratosthenes ist ein Algorithmus, mit dem alle Primzahlen bis zu einem bestimmten Grenzwert gefunden werden können. Der Algorithmus ist einfach und kann durch die folgenden Schritte implementiert werden:

  1. Erstellen Sie ein boolesches Array mit N Elementen und initialisieren Sie alle Elemente auf wahr (true).
  2. Setzen Sie das nullte und das erste Element des Arrays auf falsch (false) (da 0 und 1 keine Primzahlen sind).
  3. Wenn das 2. Element des Arrays wahr ist, geben Sie 2 als Primzahl aus.
  4. Setzen Sie alle Vielfachen von 2 ab $2^2$ auf falsch (*).
  5. Wenn das 3. Element des Arrays wahr ist, geben Sie 3 als Primzahl aus.
  6. Setzen Sie alle Vielfachen von 3 ab $3^2$ auf falsch.
  7. Wiederholen Sie den gleichen Vorgang für das 4., 5., …, und N-te Element.
  • Der Grund, warum die Elemente ab dem Quadrat des Wertes auf falsch gesetzt werden, liegt daran, dass Zahlen, die kleiner als das Quadrat sind, bereits in vorherigen Schritten verarbeitet wurden.

Implementierung in 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;
            }
        }
    }
}

Leicht optimierte Version

Wir können die Implementierung unter Berücksichtigung der folgenden Punkte leicht optimieren:

  • Initialisieren Sie das Array mit falsch (false) statt mit wahr (true) (das ist schneller).
  • Da Vielfache von 2 keine Primzahlen sind, überspringen Sie den Schritt, bei dem die Vielfachen von 2 auf falsch gesetzt werden.
  • Es ist nicht notwendig, bis n zu iterieren; es reicht aus, die Primzahlen bis zur Quadratwurzel von n zu berechnen, um alle Primzahlen zu finden, die kleiner oder gleich n sind.
 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);
    }
}

Referenz

comments powered by Disqus
Erstellt mit Hugo
Theme Stack gestaltet von Jimmy