| Algorithmen |
Von dem griechischen Universalgelehrten Eratosthenes von Kyrene, der im 3. Jahrhundert v. Chr. der berühmten Bibliothek von Alexandria vorstand, stammt eine interessante Methode, mit der aus einer vorgegebenen Menge ganzer Zahlen die Primzahlen herausgesiebt werden. Es ist überaus empfehlenswert, diesen Algorithmus an einem Beispiel zu beschreiben und dabei gleich einmal "von Hand" durchzurechnen.
Wir wollen uns hier mit einer kleinen Zahlenmenge, etwa den natürlichen Zahlen von 1 bis 20, begnügen.
Eine umgangssprachliche Fassung könnte etwa so aussehen:
- Setze
p = 2 - Streiche alle Vielfachen von p
- Setze
p = erste nicht gestrichene Zahl > p - Gehe nach 2.
Die Arbeitsweise dieses Sieb-Verfahrens lässt sich auf einer interaktiven Webseite mit eigenen Wertvortgaben anschaulich nachvollziehen.
| |
Einige Vorüberlegungen sind von Nutzen:
Der eigentliche Algorithmus lässt sich übersichtlicher aufschreiben,
wenn man das Sieben mit einer festen Primzahl p als eigenen Modul ausgliedert.
Das Argument ztab steht hier für eine Tabelle aus Zahlen
|
Um Mehrfachstreichungen zu vermeiden, sollte für
sind sämtlich gerade (und wurden daher beim Sieben mit
Damit können wir nun schon sieben:
|
Die erste nicht gestrichene Zahl
|
... und so weiter.
Das Sieb des Eratosthenes wiederholt diesen Vorgang für alle Primzahlen
![]()
Zunächst wird die Tabelle initialisiert, die Zahl 1 gestrichen und die Schranke für die Siebzahlen mittels introot berechnet. In der While-Schleife werden dann folgende Schritte ausgeführt (solange die Siebzahl p die Schranke m nicht überschritten hat): 1. siebe mit p und rücke weiter; 2. überspringe die gestrichenen Zahlen; 3. hole die nächste noch nicht gestrichene Zahl.
Mit dem Select-Befehl können nun noch alle Elemente, die ungleich 0 sind, herausgefischt werden:
|
Erläuterung: # steht für das erste Argument einer reinen, d.h. unbenannten Funktion; das Zeichen & schließt den Rumpf dieser Funktion ab.
Man kann das Sieb-Verfahren noch etwas verbessern, indem von vornherein nur
ungerade Zahlen
betrachtet werden. In diesem Fall benötigen wir ein etwas abgeändertes
ist dabei nicht mehr
,
sondern
.
|
Die Funktion
Hier ein Probelauf bis zur Zahl 1000 mit Angabe der Rechenzeit (CPU Pentium II / 200 MHz):
|
| |