Primzahlen nach Erathosthenes

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

Hallo,
ich habe ein Problem mit meinem Code:
Ich wollte das Sieb des Erathosthenes nachstellen und habe dazu diesen Code entwickelt.

1. Ich habe das Problem, das die ersten Primzahlen Gelöscht werden, da ja alle gemeinsamen teiler gelöscht werden. Wie Kann man das irgendwie umgehen?

2. Ich möchte alle nullen die durch das entfernen nachträglich löschen. Was kann ich da tun?

3. Ausserdem möchte ich, dass die Zwei 49 am Anfang des Codes aus der Tabelle verschwinden. Wenn ich sie einfach aus der Liste lösche wird ein Fehler ausgegeben.
Naemlich dieser:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\IT\python school\DasSiebDesErathosthenes\src\DasSieb.py", line 6, in <module>
    liste[n] = 0
IndexError: list assignment index out of range
Vielen Dank für eure Hilfe!

Code: Alles auswählen

liste=[49,49]

for n in range (2,1001):
    liste.append(n)
    if n%2 == 0:
        liste[n] = 0
    if n%3 == 0:
        liste[n] = 0
    if n%5 == 0:
        liste[n] = 0
    if n%7 == 0:
        liste[n] = 0
    if n%11 == 0:
        liste[n] = 0
    if n%13 == 0:
        liste[n] = 0
    if n%17 == 0:
        liste[n] = 0
    if n%19 == 0:
        liste[n] = 0
    
print(liste)
input("")
BlackJack

@nb5code: Das die Primzahl selber gelöscht wird kann man verhindern in dem man vorher testet ob es die Zahl ist die beim Modulo verwendet wird.

Letztlich ist das aber kein Sieb denn Du gibst ja (fast) alle benötigten Primzahlen von Hand ein. Das Sieb braucht nur zu wissen das 2 eine Primzahl ist und findet alle anderen selbst heraus. Das ist ja gerade der Sinn eines Verfahrens um Primzahlen zu suchen.

Wie kommst Du ausgerechnet auf 49? Wofür stehen denn diese beiden Zahlen? Also was bedeutet ein Eintrag in der Liste an Index 0 und 1?

Bei diesem Verfahren wo man alle Primzahlen mit zur Wurzel der Obergrenze bereits kennen muss, kann man sich die ganzen 0en auch sparen in dem man einfach nur Zahlen hinzufügt die alle Tests überlebt haben. Und wenn eine Zahl die Tests nicht überlebt, dann fügt man einfach gar nichts der Liste hinzu.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@BlackJack

ich wollte eigentlich 42 schreiben, weil es die antwort auf alle Fragen ist.


ich weiß aber dennoch nicht wie ich es anders machen soll das war mir die logischste Erklärung kann man ncht die nullen im nachhinein löschen ?

und kann man das nicht so machen wie ich es mache

die aufgabenstellung lautet so:

Schon in der Antike war bekannt, dass es unendlich viele Primzahlen gibt. Der Grieche Eratosthenes konnte sogar ein Verfahren angeben, wie Promzahlen gefunden werden können:
Dazu beginnt man ...

mit der Zahl 2 und streicht nur jede 2. folgende Zahl.
danach geht man zur nächsten nicht gestrichenen Zahl (die 3) und streicht nun jede 3. Zahl,
im Anschluss geht man zur nächsten nicht gestrichenen Zahl (die 5 [die 4 wurde durch die 2 getrichen]) und streicht nun jede 5. Zahl,
...usw...
Programmieren Sie im Python-File Eratosthenes ein Programm, das alle Primzahlen unter den ersten 1000 natürlichen Zahlen ausgibt.
Tipp: Erzeugen Sie zuerst eine Liste mit 1000 Einsen; programmieren Sie eine Schleife, in der Sie mit 2 beginnen und sofort mit print(2) ausgeben, setzen jede weitere zweite 1 auf den Wert 0; lassen Sie die Schleife bis zum Ende durchlaufen und programmieren Sie den Rest...


ich meine ich will ja kein eigenes verfahren machen sondern muss dieses nehmen
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@nb5code: so wie Du es machst, kann man keine Primzahlen finden. Im Aufgabentext steht ja schon fast jede Zeile, die Du schreiben mußt, in Worten da.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@Sirius3

aber alle zahlen die sichtbar sind sind primzahlen alöso muss es klappen


wie könnte man die nullen entfernen?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@nb5code: 841 ist also eine Primzahl :evil: .
Den Code den Du da geschrieben hast, macht irgendwas, aber sicherlich keine Primzahlen finden und Erathosthenes würde sich im Grabe umdrehen, wenn Du seinen Namen dafür benutzt.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@nb5code:
Versuch doch mal zunächst mit Bleistift und Papier nachzuvollziehen, was da passiert. Dann wird die Übertragung in ein Programm deutlich leichter.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@jerch habe ich schon und das ist daraus geworden
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

nb5code hat geschrieben:Tipp: Erzeugen Sie zuerst eine Liste mit 1000 Einsen;
Dann hast Du wohl diesen Satz hier überlesen.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@Sirius3 und was soll ich dann mit den einsen machen ich ahbe hinter ihnen den sinn nicht verstanden
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@nb5code: dann hast Du den Sinn des Siebes noch nicht verstanden. Versuch doch zunächst mit Papier und Bleistift das Prinzip zu verstehen, indem Du Kästchen ankreuzt und schaust, welche übrig bleiben.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@Sirius3 danke... :cry:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die Liste mit den einsen ist der _Kern_ des Siebes. Wenn du nicht weisst, wofuer diese Liste steht und was eine 1 oder 0 darin bedeutet, dann verstehst du den Algorithmus nicht und wirst ihn falsch umsetzen.

Halte dich wirklich an den Vorschlag von jerch und Sirius5 und geh den Algorithmus mal per Hand durch. Nicht bis 1000, aber vielleicht bis 10.
Antworten