Sieb des Eratosthenes- Primzahlen gespeichert, wo?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

Also, ich will diesen Code, den Sieb des Eratosthenes, erweitern.
Was ich machen will, sind die Pseudo-Primzahlen ausgeben lassen.
Die Pseudoprimzahlen sind die Zahlen, die Primzahlen sind oder keinen Primfaktor kleiner p haben.
p wäre dann also auch eine Variable, die man eingeben muss, aber egal erstmal.

Meine Frage ist, wie ich bei diesem Code mit den Primzahlen weiterrechnen kann. Denn die werden ja am Ende ausgegeben... unter "print()". Ich brauche die ja, um danach den Algorithmus zu erweitern, und zwar muss ich dann ja abfragen lassen, ob die Zahlen bis nach n teilbar durch eine Primzahl sind....

Also, wie kann man in diesem Code mit den Primzahlen weitermachen:

Code: Alles auswählen

from sys import stdin
print("Geben Sie eine natuerliche Zahl ein")
for line in stdin:
    p,a,b=(int(word) for word in line.split())
    f=[True for i in range(b+1)];
    print("Die Primzahlen bis", b, "lauten:", end=" ")
    for i in range(2,b+1):
        if f[i]:
            print(i,end=" ")
            for k in range(i,int(b/i)+1):
                           f[i*k] = False
                          
    print()
und... die 3 Variablen oben sind nur, weil ich am Ende drei brauche. Bis jetzt habe ich ja nur b benutzt...
Vielen DANK
Zuletzt geändert von Anonymous am Montag 10. November 2014, 19:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@nenagzb: Vermische einfach die Berechnung nicht mit der Ausgabe. Schreib eine Funktion die einfach nur das Sieb benutzt um eine Liste mit Primzahlen erstellt und die Liste zurück gibt.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

@BlackJack: Aber wie lasse ich denn diese Ergebnisse in die Liste tragen? :/
Ne Liste erstellt man ja x=[...] oder noch mit for word und sowas drin, wenn man sie als input definiert..... das habe ich letztens mal dafür angewandt... aber wie kann ich denn, wenn die Liste nicht im Input ist..?

Theoretisch müsste ich hier irgendwie zunächst angeben, dass zu der Liste alle Werte von 2 bis b gehen.... dann muss ich da die False-Angaben wegstreichen... und dann das mit den Pseudoprimzahlen machen.
BlackJack

@nenagzb: Man kann auch eine leere Liste erstellen und da die Primzahlen dann später anhängen. Wobei ich wohl grundsätzlich erst einmal das Sieb komplett durchlaufen würde und aus dem dann die am Ende die Liste erstellen. Dann kann man auch eine „list comprehension” (LC) verwenden wenn man sich die Flags aus dem Sieb mit `enumerate()` zusammen aufzählen lässt und nur die in die Liste schreibt, bei denen das Flag noch `True` ist nach dem sieben.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

@BlackJack dankee, aber ich suche die ganze Zeit danach wie man LC machen kann, und nichts hilft mir weiter. Dieser Befehl "listcomprehension" wird so in der Art gar nicht angewandt... oder? Bzw. wie könnte ich denn diese Liste definieren, bzw. die Elemente dadrin... Weil f oder f oder True kann ich nicht anwenden :( und aufzählen glaube ich geht dann enumerate(list) bzw. in Klammern der Name der Liste....
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

@BlackJack, also ich hatte zwar was über LC gefunden, aber keine Schilderung wie man das anwendet.. und aus den Codes wird mir das gar nicht ersichtlich :(
BlackJack

@nenagzb: Du hast doch selbst im Beitrag davor eine LC beschrieben. Ansonsten machst Du's halt ohne, ganz normal mit einer Schleife.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

@BlackJack, ah ok... aber ich muss ja wissen wie ich die Elemente in der Liste definieren kann.....
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

mit f geht es ja nicht.... und wo ich da einfach eine for-Schleife zu machen sehe ich nicht :(
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

BlackJack hat dir schon die Loesung genannt:
BlackJack hat geschrieben:@nenagzb: Vermische einfach die Berechnung nicht mit der Ausgabe. Schreib eine Funktion die einfach nur das Sieb benutzt um eine Liste mit Primzahlen erstellt und die Liste zurück gibt.
Mit einem Index-Zugriff (also `f`) kannst du die Listenelemente veraendern und das machst du ja auch schon: Nach Ablauf deiner zwei Schleifen hast du alle Zahlen auf Primalitaet untersucht.
Jetzt musst du also nur noch deine Zahlen (in `f`) richtig weiterbenutzen.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

hmm, habe grade ganz viel rumprobiert und jetzt bin ich hier: Was Python aber dann nur ausgibt, sind die Primzahlen und am Ende gibt er noch immer das "b" aus, was ich eingegeben habe :(

Code: Alles auswählen

from sys import stdin
print("Geben Sie eine natuerliche Zahl ein")
for line in stdin:
    p,a,b=(int(word) for word in line.split())
    f=[True for i in range(b+1)];
    print("Die Primzahlen bis", b, "lauten:", end=" ")
    list=f
    for i in range(2,b+1):
        if f[i]:
            print(i,end=" ")
            for k in range(i,int(b/i)+1):
                           f[i*k] = False
                          
    print()
    if f[i]==False:
                for i in range(0,b+1):
                         for k in range(2,p):
                            f[i%k!=0]=True
                
    print(i,end=" ")
Zuletzt geändert von Anonymous am Dienstag 11. November 2014, 08:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

@BlackJack:
@cofi:

Was ich auch versucht habe, war diese Variante:

Code: Alles auswählen

 for k in range(2,p):
                            if (i%k!=0):
                                f[i]=True
                            else:
                                f[i]=False
im Code... Aber darauf geht er gar nicht ein, er nimmt einfach nur den ersten Teil und gibt die Primzahlen aus.... :(
Zuletzt geändert von Anonymous am Dienstag 11. November 2014, 08:49, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

nenagzb: Trenn das doch mal ordentlich in Funktionen auf, die man dann auch einzeln testen kann. Es macht ja zum Beispiel keinen Sinn sich um den zweiten Teil am Zeile 15 Gedanken zu machen solange man nicht sicher ist das der erste Teil das tut was er soll, weil der Zweite ja `f` benutzt was im ersten Teil erstellt wird.

Wobei man sich vielleicht auch mal Gedanken darüber machen sollte wie weit man das Sieb eigentlich für die Aufgabenstellung berechnen muss und ob dann ein zweiter Teil überhaupt nötig ist, oder ob man nicht gleich ein Sieb schreiben kann in dem nur Pseudo-Primzahlen auf `True` stehen.
nenagzb
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 22:01

Okay, vielen Dank, habe es jetzt hinbekommen!
Antworten