Sieb des Eratosthenes

benötigte Dateien werden geladen...
Primzahlen:
funktion sieb_eratosthenes(N)
    Primzahlen := leere Liste
    durchgestrichen := Array mit Indizes von 2 bis N
    Für alle k von 2 bis N
        durchgestrichen[k] := falsch
    aktuell := 2
 
    Solange aktuell ≤ N
        Wenn durchgestrichen[aktuell] nicht gesetzt ist
            füge aktuell in Primzahlen ein
            j := aktuell + aktuell
            Solange j ≤ N
                durchgestrichen[j] := wahr
                j := j + aktuell
        aktuell := aktuell + 1
 
    Solange aktuell ≤ N
        Wenn durchgestrichen[aktuell] nicht gesetzt ist
            füge aktuell in Primzahlen ein
        aktuell := aktuell + 1

Das Sieb des Eratosthenes ist ein Algorithmus, mit dem sich alle Primzahlen bis zu einer vorgegebenen Zahl bestimmen lassen. Diese Zahl wird im Folgenden N genannt.

Auf dieser Seite lässt sich das Sieb des Eratosthenes für Zahlen bis 1000 visualisieren.

Wenn größere Primzahlen berechnet werden sollen, dann kann dies mit dem folgenden Rechner getan werden: Liste mit Primzahlen bis selbstgewählter Zahl
Der Rechner kann die Primzahlen bis 10.000.000 berechnen, zeigt aber keine Visualisierung an.

Funktionsweise

Als Erstes werden alle Zahlen von 2 bis zur vorgegebenen Zahl N aufgeschrieben. Danach werden von 2 beginnend die Zahlen aufsteigend durchgegangen.

Immer, wenn eine Zahl nicht durchgestrichen ist, dann handelt es sich um eine Primzahl. Diese wird in die Liste der gefundenen Primzahlen aufgenommen und alle Vielfachen dieser Primzahl bis N werden durchgestrichen.

Wenn die aktuelle Zahl durchgestrichen ist, dann handelt es sich um keine Primzahl und es wird nichts weiter damit gemacht.

Wenn die aktuelle Zahl größer als N ist, dann wurden schon alle Zahlen bis N, die keine Primzahlen sind, durchgestrichen. Deshalb können die restlichen nicht durchgestrichenen Zahlen in die Liste der gefundenen Primzahlen aufgenommen werden, ohne dass ihre Vielfachen durchgestrichen werden müssen.

Beispiel

Als Beispiel sollen alle Primzahlen bis 100 ermittelt werden.

Zuerst werden alle Zahlen von 2 bis 100 aufgeschrieben und die Liste der gefundenen Primzahlen ist noch leer.
Sieb des Eratosthenes - Initialisierung
Die 2 ist nicht durchgestrichen. Deshalb wird die 2 in die Liste der Primzahlen aufgenommen und die Vielfachen von 2 werden durchgestrichen.
2 ist eine Primzahl. Die Vielfachen von 2 werden durchgestrichen.
Die 3 ist auch nicht durchgestrichen. Deshalb handelt es sich bei der 3 um eine Primzahl. Die 3 wird in die Liste der Primzahlen aufgenommen und die Vielfachen von 3 werden durchgestrichen.
3 ist eine Primzahl. Die Vielfachen von 3 werden durchgestrichen.
Die 4 ist durchgestrichen. Somit ist 4 keine Primzahl.
4 ist keine Primzahl. Es wird nichts weiter mit der 4 gemacht.
Die 5 ist eine Primzahl. Deshalb wird sie in die Liste der Primzahlen aufgenommen und die Vielfachen von 5 werden durchgestrichen.
5 ist eine Primzahl. Die Vielfachen von 5 werden durchgestrichen.
Die 6 ist durchgestrichen. 6 ist somit keine Primzahl.
6 ist keine Primzahl. Es wird nichts weiter mit der 6 gemacht.
7 ist nicht durchgestrichen und somit eine Primzahl. Die 7 wird in die Liste der Primzahlen aufgenommen und die Vielfachen von 7 werden durchgestrichen.
7 ist eine Primzahl. Die Vielfachen von 7 werden durchgestrichen.
8, 9 und 10 sind durchgestrichen und somit keine Primzahlen.
8, 9 und 10 sind keine Primzahlen - Sieb des Eratosthenes
11 ist größer als 100 = 10. Deshalb wurden schon alle Zahlen, die keine Primzahlen sind und kleiner oder gleich 100 sind, durchgestrichen. Somit werden die Zahlen zwischen 11 und 100, die nicht durchgestrichen sind, in die Liste der Primzahlen aufgenommen.
Sieb des Eratosthenes - Alle Primzahlen bis 100

Begründungen

Warum handelt es sich um keine Primzahl, wenn die gerade betrachtete Zahl durchgestrichen ist?

Wenn die gerade betrachtete Zahl durchgestrichen ist, dann gab es in einem der vorherigen Schritte eine Zahl, die größer als 1 und kleiner als die gerade betrachtete Zahl ist und die Teiler von der gerade betrachteten Zahl ist. Somit ist die gerade betrachtete Zahl keine Primzahl.

Warum müssen die Vielfachen von Zahlen, die durchgestrichen sind, nicht durchgestrichen werden?

Wenn die gerade betrachtete Zahl durchgestrichen ist, dann existiert mindestens eine kleinere Zahl, die größer als 1 ist und die Teiler von der gerade betrachteten Zahl ist. Da jedes Vielfache einer Zahl auch Vielfaches der Teiler dieser Zahl ist, sind die Vielfachen von der durchgestrichenen gerade betrachteten Zahl bereits durchgestrichen.

Warum handelt es sich um eine Primzahl, wenn die gerade betrachtete Zahl nicht durchgestrichen ist?

Wenn die gerade betrachtete Zahl nicht durchgestrichen ist, dann gibt es keine Zahl, die größer als 1 und kleiner als die gerade betrachtete Zahl ist und die Teiler von der gerade betrachteten Zahl ist. Ansonsten wäre die gerade betrachtete Zahl schon in einem der vorherigen Schritte durchgestrichen worden. Somit handelt es sich bei der gerade betrachteten Zahl um eine Primzahl.

Warum wurden schon alle Zahlen, die keine Primzahlen sind, durchgestrichen, wenn die aktuelle Zahl größer als N ist?

Wenn man 2 oder mehr Zahlen multipliziert, die alle größer als N sind, dann erhält man eine Zahl, die größer als N ist. Deshalb enthält die Primfaktorzerlegung jeder Zahl, die kleiner oder gleich N ist, mindestens einen Primfaktor, der kleiner oder gleich N ist. Wenn die aktuelle Zahl größer als N ist, dann wurden schon alle Vielfachen von Zahlen, die kleiner oder gleich N sind, durchgestrichen. Somit kann es keine Zahlen, die kleiner oder gleich N sind, geben, die keine Primzahlen sind, aber noch nicht durchgestrichen wurden.

Pseudocode

funktion sieb_eratosthenes(N)
    Primzahlen := leere Liste
    durchgestrichen := Array mit Indizes von 2 bis N
    Für alle k von 2 bis N
        durchgestrichen[k] := falsch
    aktuell := 2
 
    Solange aktuell ≤ N
        Wenn durchgestrichen[aktuell] nicht gesetzt ist
            füge aktuell in Primzahlen ein
            j := aktuell + aktuell
            Solange j ≤ N
                durchgestrichen[j] := wahr
                j := j + aktuell
        aktuell := aktuell + 1
 
    Solange aktuell ≤ N
        Wenn durchgestrichen[aktuell] nicht gesetzt ist
            füge aktuell in Primzahlen ein
        aktuell := aktuell + 1

Implementierung

Sieb des Eratosthenes in Java:

Eratosthenes.java

TestClass.java

gute Erklärvideos auf Youtube

Seite teilen:FacebookTwitter