Sieb von Eratosthenes mit C ++

Sieb von Eratosthenes mit C ++

Eine Primzahl ist eine natürliche (ganze) Zahl, die größer oder gleich zwei ist, die nur von sich selbst geteilt werden kann und 1. Die ersten Primzahlen sind: 2, 3, 5, 7 usw.

Für die Nummer 5 sind die Anzahl der Primzahlen, die bis hin zu und/oder 5 sind, 5:

2, 3, 5

Für die Nummer 8 sind die Anzahl der Primzahlen, die bis hin zu und/oder 8 sind, 8:

2, 3, 5, 7

Für die Nummer 19 sind die Anzahl der Primzahlen, die bis hin zu und/oder 19 sind, 19:

2, 3, 5, 7, 11, 13, 17, 19

Für die Nummer 25 sind die Anzahl der Primzahlen, die bis zu und/oder 25 sind, 25:

2, 3, 5, 7, 11, 13, 17, 19, 23

Für die Nummer 36 sind die Anzahl der Primzahlen, die bis hin zu und/oder einschließlich 36 sind,:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31

Für die Nummer 37 sind die Anzahl der Primzahlen, die bis zu und/oder einschließlich 37 sind,:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37

Diese Listen sind nur Beispiele. Es finden Sie viele andere Beispiellisten von Primzahlen unten und/oder eine bestimmte Nummer einbezogen. Beginnen Sie mit dem Verständnis des Sieb von Eratosthenes, indem er feststellt.

Das Sieb von Eratosthenes ist eine Technik, um alle Primzahlen zu finden, die weniger als oder gleich einer gegebenen Zahl sind, wie z. B. 36 oder 37 oben. Diese Zahl wie 36 oder 37 erhält normalerweise den variablen Namen „n“ in der Programmierung. Das Sieb von Eratosthenes wird als effizienter Algorithmus angesehen, um die Liste der Primzahlen zu erhalten.

Demonstration für Sieb von Eratosthenes

Die Frage ist: Finden Sie die Primzahlen weniger oder gleich 5, beispielsweise auf effiziente Weise. Der effiziente Weg hier bedeutet, so wenige Vorgänge wie möglich zu nutzen. Die Primzahlen beginnen von 2. Alle Zahlen einschließlich der Vielfachen kleiner Primzahlen von 2 bis 5 sind:

2, 3, 4, 5

In diesem Bereich ist eine Zahl, die keine Primzahl ist. Ein Vielfaches kann durch Zugabe der gleichen Primzahl immer wieder erhalten werden. Zum Beispiel ist 2 + 2 4 plus 2 wieder 6 6. Und das geht über die Reichweite hinaus. Vier, ein Vielfaches von 2, sollte nicht auf der Liste stehen, da es sich nicht um eine Primzahl handelt. Die Gleichung 3 + 3 ist 6, was bereits über den Bereich hinausgeht. Und 6 oder eine beliebige Zahl, die über den Bereich hinausgeht, sollte nicht auf der Liste stehen. Das Ergebnis ist also wie folgt:

2, 3, 5

Die fragliche Nummer hier ist 5. Die Quadratwurzel von 5 beträgt 2.24. Der Ganzzahlwert für die Quadratwurzel von 5 beträgt 2. Die Vielfachen von Primzahlen unterhalb und bis zu 2, was der Ganzzahlwert für die Quadratwurzel von 5 ist, werden aus der Liste aller Zahlen entfernt.

Betrachten Sie jetzt die Nummer 8. Alle Zahlen einschließlich der Vielfachen kleiner Primzahlen von 2 bis 8 sind:

2, 3, 4, 5, 6, 7, 8

Die Gleichung 2 + 2 ist 4. Vier gehen aus. Die Gleichung 4+2 ist 6. Sechs geht aus. Die Gleichung 6 + 2 ist 8. Acht ist raus. Die nächste zu berücksichtigende Primzahl ist 3. Die Gleichung 3 + 3 ist 6. Sechs wird bereits durch die kontinuierliche Zugabe von 2 ausgeschlossen. Die Gleichung 6 + 3 ist 9; Das ist außerhalb von Reichweite. Die Primzahlen zwischen 2 und 8, inklusiv, sind:

2, 3, 5, 7

Die fragliche Nummer hier ist 8. Die Quadratwurzel von 8 beträgt 2.83. Der Ganzzahlwert für die Quadratwurzel von 8 beträgt 2. Die Vielfachen der Primzahlen unterhalb und bis zu 2, was der ganzzahlige Wert für die Quadratwurzel von 8 ist, werden entfernt, um die erforderliche Liste der Primzahlen zu erhalten.

Ein ähnliches Problem besteht darin, die Primzahlen von 2 bis 19 inklusive aufzulisten. Alle Zahlen von 2 bis 19, einschließlich:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19

Die Gleichung 2 + 2 ist 4; 4 ist raus. Die Gleichung 4 + 2 ist 6; 6 ist raus. Die Gleichung 6 + 2 ist 8; 8 ist raus. Die Gleichung 8 + 2 ist 10; 10 ist raus. Die Gleichung 10 + 2 ist 12; 12 ist raus. Die Gleichung 12 + 2 ist 14; 14 ist raus. Die Gleichung 14 + 2 ist 16; 16 ist raus. Die Gleichung 16 + 2 ist 18; 18 ist raus. Die Gleichung 18 + 2 ist 20, was über dem Bereich liegt; 20 ist raus.

Die nächste zu berücksichtigende Primzahl, die nach oben in Richtung der Quadratwurzel von 19 ist, beträgt 3 3. Die Gleichung 3 + 3 ist 6; 6 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 6 + 3 ist 9; 9 geht aus. Die Gleichung 9 + 3 ist 12; 12 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 12 + 3 ist 15; 15 ist raus. Die Gleichung 15 + 3 ist 18; 18 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 18 + 3 ist 21, was über dem Bereich liegt. Das Ergebnis ist:

2, 3, 5, 7, 11, 13, 17, 19

Die fragliche Zahl hier ist 19. Die Quadratwurzel von 19 ist 4.36. Der Ganzzahlwert für die Quadratwurzel von 19 beträgt 4. Die Vielfachen von Primzahlen unterhalb und bis zu 4, was der Ganzzahlwert für die Quadratwurzel von 19 ist, werden entfernt.

Die Primzahlen unter und bis zu 4 sind: 2 und 3. Aufgrund von 3 gab es keinen Sinn, die Zahlen 6, 12 und 18 zu beseitigen, die mehrfach 3 sind, was bereits als Vielfache von 2 entfernt wird. Nur die Vielfachen von 3, die nicht mehrfach von 2 sind, werden aufgrund von 3 entfernt. In der Praxis sollten nach dem Entfernen der Vielfachen von 2 nur die Vielfachen von und über 3 x 3 = 9 entfernt werden, ohne die Entfernung von 6 zu wiederholen. Aufgrund von 3 sind die zu beseitigen Zahlen 9, 12, 15 und 18; mit 12 und 18 theoretisch zweimal entfernt. Nummer 6 sollte einmal entfernt und nicht zweimal entfernt werden.

Sei n 25, eine neue Nummer fragliche Nummer. Alle Zahlen von 2 bis 25 sind:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25

Die Gleichung 2 + 2 ist 4; 4 geht aus. Die Gleichung 4 + 2 ist 6; 6 ist raus. Die Gleichung 6 + 2 ist 8; 8 ist raus. Die Gleichung 8 + 2 ist 10; 10 ist raus. Die Gleichung 10 + 2 ist 12; 12 ist raus. Die Gleichung 12 + 2 ist 14; 14 ist raus. Die Gleichung 14 + 2 ist 16; 16 ist raus. Die Gleichung 16 + 2 ist 18; 18 ist raus. Die Gleichung 18 + 2 ist 20; 20 ist raus. Die Gleichung 20 + 2 ist 22; 22 ist raus. Die Gleichung 22 + 2 beträgt 24; 24 ist raus. Die Gleichung 24 + 2 ist 26, was über dem Bereich liegt.

Die nächste Primzahl, die zu berücksichtigen ist und nach oben in Richtung der Quadratwurzel von 25 ist, beträgt 3 3. Die Gleichung 3 + 3 ist 6; 6 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 6 + 3 ist 9; 9 geht aus. Die Gleichung 9 + 3 ist 12. Zwölf ist bereits als Vielfalt von 2 ausgeschlossen. Die Gleichung 12 + 3 ist 15; 15 ist raus. Die Gleichung 15 + 3 ist 18; 18 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 18 + 3 ist 21; 21 geht aus. Die Gleichung 21 + 3 ist 24; 24 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 24 + 3 ist 27, was über dem Bereich liegt.

Die nächste zu berücksichtigende Primzahl, die in Richtung der Quadratwurzel von 25 liegt, die 5 ist, beträgt 5, 5. Die Gleichung 5 + 5 ist 10; 10 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 10 + 5 ist 15; 15 wird bereits als Mehrfaches von 3 ausgeschlossen. Die Gleichung 15 + 5 ist 20; 20 ist bereits ein Vielfaches von 2 ausgeschlossen. Die Gleichung 20 + 5 ist 25; 25 geht aus. Das Ergebnis ist:

2, 3, 5, 7, 11, 13, 17, 19, 23

Die fragliche Nummer hier ist 25. Die Quadratwurzel von 25 beträgt 5. Der Ganzzahlwert für die Quadratwurzel von 25 beträgt 5. Die Vielfachen von Primzahlen unterhalb und bis zu 5, was der ganzzahlige Wert für die Quadratwurzel von 25 ist, werden entfernt.

Die Primzahlen unterhalb und bis zu 5 sind 2, 3 und 5. Aufgrund von 2 sind die Zahlen, die aus der Liste aller Zahlen nach Multiplikatoren entfernt werden sollen: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22 und 24. Aufgrund von 3 sind die Zahlen, die von Multiples aus der Liste entfernt werden sollen,: 6, 9, 12, 15, 18, 21 und 24. Aufgrund von 5 sind die Zahlen, die von Vielfachen entfernt werden sollen, 10, 15, 20 und 25.

Nach allen Multiplikatoren sind die Entfernungen wie folgt:

2: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24

3: 6, 9, 12, 15, 18, 21, 24

5: 10, 15, 20, 25

Durch Multiples wird 6 zweimal entfernt (theoretisch), 10 wird zweimal entfernt (theoretisch), 12 wird zweimal entfernt (theoretisch), 15 wird zweimal entfernt (theoretisch), 20 wird zweimal entfernt (in Theorie) und 24 wird zweimal entfernt (theoretisch).

Wenn jedoch aufgrund von 3 die Entfernung von 3 x 3 = 9 beginnt, wird 6 nur einmal entfernt. Wenn es aufgrund von 5 ist, beginnt die Entfernung von 5 x 5 = 25, dann wird die Entfernung von 10, 15 und 20 einmal durchgeführt. Die Entfernung von 12, 18 und 24 wird jedoch noch zweimal pro Zahl durchgeführt. Trotzdem würde es einen Vorteil geben, da vier wiederholte Entfernungsvorgänge weggelassen werden (für 6, 10, 15 und 20). Dies verbessert die Effizienz (Zeitkomplexität). Damit werden die Entfernungen sein:

2: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24

3: 9, 12, 15, 18, 21, 24

5: 25

Die Zahlen 6, 10, 15 und 20 wurden jeweils einmal entfernt, anstatt zweimal. Die Zahlen 12, 18 und 24 wurden jeweils zweimal entfernt. Ab sofort kann nichts getan werden, um 12, 18 und 24 nur einmal zu entfernen.

Die Situationen für die Zahlen 36 und 37 oder eine andere Zahl von mehr als 1 werden ähnlich erklärt.

Redundanz vermeiden

Indem Sie nur die Vielzahl von Primzahlen von 2 zum Ganzzahlwert von √n entfernen, wird der erforderliche Satz von Primzahlen erhalten. Die Effizienz kann verbessert werden, indem die Vielfachen von Primzahlen entfernt werden, ab dem Quadrat der Primzahl (i2) bis zum Ganzzahlwert von √n wie zuvor vorgeschlagen. Dadurch werden einige Abläufe der Zahlenentfernung ausgelöst. So reduzieren Sie die Gesamtzahl der Operationen. Das Sieb von Eratosthenes erfolgt durch diesen zweiten Ansatz.

Algorithmus des Siebs von Eratosthenes

Der Algorithmus beginnt mit der Erstellung eines in Null basierenden indizierten Längenvektors, der N+1 ist. Jedes Element dieses Vektors wird auf boolean und true initialisiert, mit Ausnahme der ersten und zweiten Elemente für Index 0 und Index 1, die auf False initialisiert werden. Für diesen Vektor entspricht der Index 2 der Zahl (Prime) 2; Der Index 3 entspricht der Zahl (Prime) 3; Der Index 4 entspricht der Zahl 4; usw. Da der Vektor null ein basiertes Index ist, muss die Länge n+1 sein, damit der letzte Index n entspricht.

Eine Indexnummer für diese Vektorliste, die entfernt werden muss. Das heißt, das Element erhält den falschen Wert. Wenn also eine Zahl (Index) mehr als einmal aus der Liste (Vektor) entfernt werden muss, wird der Wert für den Index mehr als einmal falsch gemacht.

Am Ende werden die Indizes für die Elemente des Vektors, deren Werte wahr geblieben sind.

Vorher, die Vielfachen von Prime -Indexen, die vom Quadrat des Prime Index beginnen (i2) Bis zum Ganzzahlwert von √n als falsch gekennzeichnet sind.

C ++ - Codierung

Das Programm in C ++ sollte mit Folgendem beginnen:

#enthalten
#enthalten
Verwenden von Namespace STD;


Das Sieb der Eratosthenes -Funktion ist wie folgt:

Vektor Sieb (int n)
Vektor Sieb (n+1, wahr);
Sieb [0] = falsch;
Sieb [1] = falsch;
int i = 2;
while (ich * ich <= n)
if (sieb [i] == true) // wenn ich eine Primzahl ist
int j = i * i;
während (j <= n) //marking multiples with false
Sieb [j] = falsch;
J = J + i; // nach mehreren erhöhen


i = i + 1; // normales Erhöhung der äußeren Schleife nach 1

Return Sieb;


Lesen Sie die Kommentare des Code. Der Name der Funktion lautet Sieb (). Der zurückgegebene Vektor, nachdem alle Vielfachen als falsch gekennzeichnet sind, wird auch Sieb bezeichnet. Eine geeignete C ++ - Hauptfunktion für diesen Code ist:

int main (int argc, char ** argv)

Vektor vtr = Sieb (37);
für (int i = 0; iif (vtr [i] == true)
Cout << i << ";
Cout << endl;
Rückkehr 0;


Mit diesem Code lautet die Ausgabe wie folgt:

2 3 5 7 11 13 17 19 23 29 31 37

Die Zeitkomplexität für diese Funktion ist O (N log log log n).

Abschluss

Der Algorithmus beginnt mit der Erstellung eines nullbasierten indizierten Vektors der Länge N+1. Jedes Element dieses Vektors wird auf boolean und true initialisiert, mit Ausnahme der ersten und zweiten Elemente für Index 0 und Index 1, die auf False initialisiert werden. Für diesen Vektor ist jeder Index eine Reihe von Interessen. Da der Vektor auf Null basiert, muss die Länge n+1 sein, so dass der letzte Index n ist.

Der Wert der Zahl, die der Index ist, wird falsch gemacht, um die Entfernung anzuzeigen. Das heißt, das Element erhält den falschen Wert.

Am Ende werden die Indizes für die Elemente des Vektors, deren Werte wahr geblieben sind.

Vorher werden die Vielfachen der Prime -Indizes vom Quadrat des Prime -Index bis zum Ganzzahlwert von √n als falsch gekennzeichnet.