Seite 1 von 2

Berechnung von Primzahlzwillingen

Verfasst: Freitag 15. Dezember 2006, 16:16
von Cthulhu

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.

Verfasst: Freitag 15. Dezember 2006, 17:04
von 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.

Verfasst: Freitag 15. Dezember 2006, 20:14
von Joghurt
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.

Verfasst: Dienstag 26. Dezember 2006, 12:13
von Cthulhu
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!

Verfasst: Dienstag 26. Dezember 2006, 13:58
von 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.

Verfasst: Mittwoch 27. Dezember 2006, 15:35
von Cthulhu
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

Verfasst: Mittwoch 27. Dezember 2006, 16:02
von Smokie_joe
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

Verfasst: Freitag 29. Dezember 2006, 16:43
von Cthulhu
ja und wie erstelle ich eine liste in die der bereich reingeschrieben wird???

Verfasst: Freitag 29. Dezember 2006, 17:04
von BlackJack
Mit `list()` oder `[]`. Arbeite doch wenigstens mal das Tutorial aus der Python-Doku durch.

Verfasst: Freitag 5. Januar 2007, 22:50
von Cthulhu
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

Verfasst: Samstag 6. Januar 2007, 00:05
von 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.

Verfasst: Samstag 6. Januar 2007, 09:27
von helmut
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

Verfasst: Samstag 6. Januar 2007, 10:36
von Luzandro
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

Verfasst: Donnerstag 11. Januar 2007, 22:21
von Cthulhu
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)

Verfasst: Donnerstag 11. Januar 2007, 23:24
von 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?

Mehr Hilfe gibt es nicht ...

Verfasst: Freitag 12. Januar 2007, 00:09
von sunmountain

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]

Verfasst: Freitag 12. Januar 2007, 08:48
von Luzandro
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 ]

3 Experten ...

Verfasst: Freitag 12. Januar 2007, 09:17
von sunmountain
... 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.

Verfasst: Freitag 12. Januar 2007, 09:24
von Luzandro
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 ;) )

Wirklich bitter

Verfasst: Freitag 12. Januar 2007, 09:49
von sunmountain
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 ...