Berechnung von Primzahlzwillingen

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.
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

Code: Alles auswählen

#Priemzahlzwillinge
print"Um alle Priemzahlzwillinge in einem bestimmten Bereich rauszufinden, bitte den Bereich Definieren:"
a=input("Von ")
b=input(" bis ")
for p in range(a,b):
    i=1
    j=1
    h=p/2
    while j!=0 and i<h:
        i=i+1
        j=p%i
    if j!=0 and p!=a:
        print p
        print"    "

    while j!=0 and i<h:
        i=i
        j=p%i
    if j!=0 and p!=b:
        print p
das ist mein code!
aber wnen ich jetzt 10 und 20 eingebe:
Um alle Priemzahlzwillinge in einem bestimmten Bereich rauszufinden, bitte den Bereich Definieren:
Von 10
bis 20
11

11
13

13
17

17
19

19
ich möchte aber dass es so ausgegeben wird:
Um alle Priemzahlzwillinge in einem bestimmten Bereich rauszufinden, bitte den Bereich Definieren:
Von 10
bis 20

11
13

13
17

17
19
also die erste und die letzte zahl sollen weg!
hofe auf hilfe
danke im vorraus


Edit (birkenfeld): Titel angepasst.
BlackJack

Dazu wirst Du den Algorithmus ändern müssen. Den ich nicht so wirklich verstehe und der auch keine Primzahlzwillinge berechnet. Ausser den Paaren 11, 13 und 17, 19 ist die Differenz grösser als 2.

Es ist vielleicht einfacher erst einmal alle Primzahlen im gewünschten Bereich zu berechnen und aus denen dann die Primzahlzwillinge herauszusuchen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Der Threadtitel ist ja fantastisch! Nicht nur nichtssagend sondern auch irreführend; das wenige, was man da raus interpretieren kann, hat auch nichts mit dem Problem zu tun.

"Fehler bei Primzahlzwillingsberechnung" oder sowas wäre sehr viel besser; die Wahrscheinlichkeit, dass sich die richtigen Leute den Thread anschauen, auch höher.

Ansonsten schließe ich mich BlackJack an. Nicht jedesmal neu Primzahlen berechen, sondern nur einmal. Dann kannst du in der Liste einfach durchgehen und schauen, ob zwei benachbarte Einträge die Differenz 2 haben.
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

Ich habe aber keine ahnung wie ich das machen soll!
ich weiß wie ich die priemzahlen in ineem bereich aurechnen kann! aber dann müsste ich diese ja irgendwie speichern dass sich das programm die primzahlen merkt!
und dann dort in dem gespeicherten nachschauen ob die differenz 2 ist falls ja gibt er dann die 2 zahlen raus!
ich habe aber ehrlichgesagt garkeine ahnung wie ich das schreiben soll!
Tipps wären nett!
BlackJack

Wie berechnest Du denn die Primzahlen in einem Bereich? Die musst Du nur ein einer Liste speichern. Das verpackst Du am besten in einer Funktion, die den Bereich als Argument(e) bekommt und die Liste mit den Primzahlen zurück gibt.

Dann brauchst Du nur noch eine zweite Funktion, die die Primzahlzwillinge aussortiert und in eine neue Liste packt und schon kannst Du beide Funktionen kombinieren um das gewünschte Ergebnis zu erhalten.
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

und wie mache ich das?

davon hab ich noch nie was gehört!

könntest nicht irgendwie ein bespiel posten damit ich sehe wie ich es schreiben muss! weil entwerder hatten wir das in der schule noch nicht oder ich verstehe dich falsch und an nem beispiel kann man dass dann super überprüfen!

(ich verlange nicht das ganze programm)

Danke
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Hi also um die Primzahlen Herauszufinden kannst du den Algorithmus:
"Sieb des Eratosthenses" verwenden.

http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes

Auf der Wikiseite ist rechts ein gif auf dem das Vorgehen animiert dargestellt wird.

Bei der Umsetzung des Algorithmus in Python gehst du ungefähr so vor:

Mache dir eine liste die die Zahlen: 0 - ("bis Eingabe") des Gewünschten Zahlenbereichs enthält.
Wende auf die liste den algorythmus an. Dann hast du nur noch die Primzahlen in der liste und anschließend kannst du wenn du nicht die Primzahlen von 0 aus willst diese noch löschen.(z.b. lösche alle Primzahlen die < ("von Eingabe").

mfg
Smokie
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

ja und wie erstelle ich eine liste in die der bereich reingeschrieben wird???
BlackJack

Mit `list()` oder `[]`. Arbeite doch wenigstens mal das Tutorial aus der Python-Doku durch.
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

also ein kumpel von mir hatte mir jetzt dne tipp gegeben ich schau zuerst ob eine zahl eine primzahl ist dann schau ich ob die zahl + 2 eine priemzahl ist falls ja gib die beiden zahlen aus!
ich hab das versucht zu verwirklichen aber irgendwie hab ich einene fehler eingebaut und der will nicht gefunden werden!
hoffe ihr findet ihn!

Code: Alles auswählen

#Primzahlzwillinge
print"Um alle Primzahlzwillinge in einem bestimmten Bereich zu finden, bitte hier den Bereich definieren: "
a=input("Von: ")
b=input("bis: ")
for p in range (a,b):
    h=p/2
    i=1
    j=1
    t=1
    while j!=0 and i<=h:
        i=i+i
        j=p%i

    if j!=0 and p!=a:
        while t!=0 and i<=h:
            q=p+2
            t=q%i
        if t!=0 and p!=a:
            print" "
            print p
            print p+2
und wenn ihr mir gerade am helfen seid und ich den quellcode hier reingeschrieben habe könntet ihr mir vl auch noch sagen wie ich es hinkriege dass nache wenn ich das proggi laufne lasse das "von" und "bis" schön in einer reihe steht (macht neen schöneren eindruck!)

Danke im vorraus
BlackJack

So unkommentiert ist der Quelltext schwer verständlich.

Schau Dir mal an was Du in den Schleifen als Abbruchbedingungen stehen hast und ob die alle erreicht werden können, oder ob da nicht eine dabei ist, die in einer Endlosschleife enden kann.

Dein Ansatz ist übrigens sehr ineffizient.
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

also ein kumpel von mir hatte mir jetzt dne tipp gegeben ich schau zuerst ob eine zahl eine primzahl ist
Dieses "Schauen" packst Du am besten in eine eigene Funktion. Bei der Programmierung dieser Funktion kannst Du bei Wikipedia mit den Suchwörtern Primzahl, Primfaktor, Faktorisierungsverfahren, ... Hilfe zur Erstellung eines effizienten Codes finden.
Gruss Helmut
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

Auch wenn du es mit vielen verschiedenen nichtssagenden Variablen verschleierst - das einzige was dein Code berechnet sind Paare von ungeraden Zahlen. Es wurde dir hier schon der Link zum Sieb des Erastosthenes gepostet und ich würde dir nochmals vorschlagen, dass du dir diesen durchlest und eine Funktion schreibst, die dir für einen gegebenen Bereich eine List der Primzahlen liefert.

Noch ein paar Kommentare zu deinem Code:

Code: Alles auswählen

...
    while j!=0 and i<=h:
        i=i+i
        j=p%i

    if j!=0 and p!=a:
...
Das einzige was du damit überprüfst (abgesehen vom p!=a, was eigentl. unnötig/falsch ist), ist ob p ungerade ist, denn i ist immer ein Vielfaches von 2 und j kann daher auch nur 0 sein, wenn p gerade ist

Code: Alles auswählen

        while t!=0 and i<=h:
            q=p+2
            t=q%i
i <= h ist schon die Abbruchbedingung der vorigen Schleife, d.h. der Teil hier wird nie ausgeführt

Code: Alles auswählen

        if t!=0 and p!=a:
            print" "
            print p
            print p+2
und damit ist dieses if auch immer wahr, denn das p hast du schon einmal abgefragt (warum auch immer) und das t ist immer 1
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

so ich hab jezttz folgendes programm gebaut:

Code: Alles auswählen

#Primzahlzwillinge
print"Um alle Priemzahlzwillinge in einem bestimmten Bereich rauszufinden, bitte den Bereich Definieren:"
a=input("Von ")
b=input(" bis ")
for p in range(a,b):
    i=1
    j=1
    h=p/2
    while j!=0 and i<h:
        i=i+1
        j=p%i
    if j!=0 and p!=a and p!=1:
        z=p
        t=1
        k=z+2
        while t!=0 and i!=h+2:
            i=i+1
            t=k%i
        if t>0 and k!=a and p!=1:
            print p
            print k
            print ""
aber es hat noch ine kleine makke!
es gibt immer die primzahl +2 noch raus aber meiner meinung nach hab ich das in dem code so geregelt dass er die beiden zahlen nur ausgibt wenn beide priemzahlen sind!?!?

ich möchte jetzt bitte hilfe zu meinem quelltext haben und nicht wieder auf das sieb des was weiß ich was abgelenkt werden!
es funktioniert so!
ich finde nur dne fehler nicht!

ich erläutere auch gerne den ablauf!
also zuerst definiert man einen bereich dann schaue ich ob der rest irgendwann 0 wird (w.h. die teilung würde aufgehen, w.h. es ist keine primzahl) wenn sie dnan bis zu einem gewissen punkt nicht aufgeht ist es eine primzahl!
(bis hierhun funktionniert das proggi auch!
aber jetzt soll er das ganz wieder machen nur mit der primzahl plus 2 abe rirgendwie druckt er die einfach aus ohne zu überprüfen obs ne primzahl is!

bitte um hilfe!

(bitte nichtwieder irgendwelche links! brauche direkt hilfe! danke)
BlackJack

Nimm Dir einfach mal ein Blatt Papier und einen Bleistift und vollzieh das Programm Schritt für Schritt nach was passiert, wenn `p` eine Primzahl ist, die nicht zu einem Zwilling gehört.

Und versuch mal unnötige Namen und Tests zu entfernen. Wozu braucht man `z`?

Ob `p` (un)gleich 1 ist, kann man ganz am Anfang einmal sicherstellen, dann braucht man das nicht mehr testen. Und wann soll `k` jemals gleich `a` werden können wenn `p` das schon nicht sein kann? Warum darf `p` nicht gleich `a` sein?
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Code: Alles auswählen

def sieb_des_eratosthenes(min,max):
    zahlen = range(min,max)
    for i in xrange(2,max):
        entferne_vielfache(i,zahlen)
    return zahlen

def entferne_vielfache(i,zahlen):
    for j in xrange(i**2,zahlen[-1],i):
        if j in zahlen:
            zahlen.remove(j)
    return zahlen

MIN=10
MAX=20

primzahlen = sieb_des_eratosthenes(MIN,MAX)

primepaare = [ (primzahlen[i],primzahlen[i+1]) for i in xrange(len(primzahlen)-1) if primzahlen[i]+2==primzahlen[i+1] ]

print "Primepaare von %i bis %i" % (MIN,MAX)
for p in primepaare:
    print p[0]
    print p[1]
    print
Ich denke der Code ist so einfach,
das ich mir Kommentare spare.
[/code]
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

Cthulhu hat geschrieben:ich möchte jetzt bitte hilfe zu meinem quelltext haben und nicht wieder auf das sieb des was weiß ich was abgelenkt werden!
Und darf ich dich dennoch mit der Frage nach dem Grund nerven? Dein Code ist höchst umständlich und schwer verständlich geschrieben, weshalb du ja auch selber nicht weißt, was er richtig oder falsch tut. Die Hinweise sollten keine "Ablenkung" sein, sondern dich auf einen sinnvolleren und einfacheren Weg bringen :roll:

@sunmountain
Du gehst hier bei der ersten Funktion ALLE Werte von 2 bis max durch, obwohl ein Großteil davon selbst schon Vielfache von Primzahlen sein werden.

Code: Alles auswählen

def primzahl_zwillinge(a,b):
        bereich = range(2,b)
        primzahlen = []
        while len(bereich) > 0:
                primzahl = bereich.pop(0)
                primzahlen.append(primzahl)
                bereich = [ zahl for zahl in bereich if zahl % primzahl != 0 ]
        return [ (x,y) for x in primzahlen for y in primzahlen if x >= a and x+2 == y ]
Auch nicht optimal, weil die Listcomprehension am Ende im Gegensatz zu deinem Code unnötigerweise 2 Loops enthält, aber ich finde es lest sich so irgendwie schön funktional...

edit:
wobei sich folgendes auch nicht schlechter liest ;)

Code: Alles auswählen

[ (x,x+2) for x in primzahlen if x >= a and x+2 in primzahlen ]
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

... 4 Meinungen :D .
Ich denke mal, jeder hat seine Vorlieben beim Codieren.
Ich bevorzuge den Weg, mir Gedanken über Redudanzen zu machen
wenn Sie die Lesbarkeit beeinträchtigen oder das Laufzeitverhalten.
Solange die Aufgabe nicht lautet, die Primzahlen von 1 bis 1E10 zu suchen,
sollte jede halbwegs "normal" programmierte Version in endlicher
Zeit zu den Ergebnissen kommen.
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

Ja schon klar - wollts nur erwähnen, v.a. auch weil ja die Idee vom Sieb darauf beruht, dass man die Vielfachen der Primzahlen entfernt (und ich es irgendwie witzig finde, dass du dann trotzdem xrange verwendest ;) )
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

fand ich allerdings die Tatsache, das der junge Freund den Hinweisen
der anderen auf die wikipedia nicht gefolgt ist - dort gibt es ein gut leserliches Pascal Programm, das man leicht portieren kann.
(So hab' ich es dann gemacht :oops: ...)
Wer lesen kann ist klar im Vorteil ...
Antworten