Primzahlen, Primzahlen, Primzahlen...

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
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hey zusammen,

ich hab einfach zum Spass mal versucht, mit Python die Primzahlen errechnen zu lassen von 2 bis zu einer Grenze [bis]. Erst heb ich einfach jedes Element der Liste auf "Primheit" überprüft - nicht sehr effizient das Ganze... dann hab ich angefangen, Regeln einzubauen, die das Ganze schneller machen.

Irgendwann bin ich dann auf Sieb des Eratosthenes (oder so) gestossen und hab dies versucht, umzusetzen - mit Erfolg eigentlich, das hat so ausgeschaut:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import time

def primzahlen(bis):
    """Gibt die Primzahlen von 1 bis [bis] zurück"""

    alle = range(2, bis + 1)

    for zahl in alle:

        if zahl > (bis / 2):
            break

        f_min = 2
        f_max = bis / zahl

        for f_x in range(f_min, f_max + 1):

            vielfaches = zahl * f_x

            if vielfaches in alle:
                alle.remove(vielfaches)

    return alle

t_a = time.clock()

ni = primzahlen(10000)

t_b = time.clock()

t_passed = t_b - t_a

print ni
print len(ni)
print t_passed
das klappt! 1229 Primzahlen bis 10000 - müsste stimmen laut Inter-Njet. Heute habe ich mich mit einem Kollegen unterhalten bei der Arbeit und dieser hatte noch etwas eingeworfen: Eigentlich müsste es ja ausreichen, jeweils die Vielfachen bis und mit 9 aus der Liste zu streichen; schon dann müssten doch die Primzahlen übrig bleiben..? Ich hatte mir dies überlegt, hin und her, und kam zum Schluss - doch, das müsste doch stimmen..? Dann hab ich das probiert:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import time

def primzahlen(bis):
    """Gibt die Primzahlen von 1 bis [bis] zurück"""

    alle = range(2, bis + 1)

    for zahl in alle:

        if zahl > 9:
            break

        f_min = 2
        f_max = bis / zahl

        for f_x in range(f_min, f_max + 1):

            vielfaches = zahl * f_x

            if vielfaches in alle:
                alle.remove(vielfaches)

    return alle

t_a = time.clock()

ni = primzahlen(10000)

t_b = time.clock()

t_passed = t_b - t_a

print ni
print len(ni)
print t_passed
Leute, das stimmt nicht... es gibt dann plötzlich 2288 Primzahlen bis 10000. Ich bin nicht völlig auf dem Holzweg denk ich, aber da fehlt was. Ich habe mir nun überlegt: 11 x 11 z.Bsp. gibt 121 - da denk ich liegt der springende Punkt! Demnach müsste ich die Vielfachen anders rechnen, also mit den übrigbleibenden Zahlen mal rechnen..? Also mit 11 wär's 11 x 13, 11 x 17, 11 x 19 etc..?

Geht Ihr mit mir einig oder seht ihr noch weitere Punkte / andere Ansätze..?

Cheers!
Ich code, also bin ich.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Äh... wie kommst Du überhaupt auf die Idee, dass man nach der 9 nichts mehr streichen muss? Der Witz an Primzahlen ist ja gerade, dass sie die "Basis" für alle Nicht-Primzahlen bilden... also kommen natürlich Zahlen >9 hinzu. Du selber bist ja schon auf die 11 gestoßen :mrgreen:

Ausführungszeiten solltest Du übrigens mittels des ``timeit``-Moduls messen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
heiliga horsd

Der Sieb von Atkin ist eine modifizierte Version des Sieb des Erathostenes und ist schneller, dürfte dir vielleicht für die Expansion in den nächstgrößeren zu untersuchenden Zahlenraum evtl. helfen.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hi again,

@ Hyperion - demnach genau mein Ansatz! Geil. Danke! Ja, timeit muss ich mir unbedingt anschauen, das könnt ich auch gut für meine Games gebrauchen - sag mal, Du postest recht viel und immer auf'n Punkt... hast Du auch schon Games programmiert? Würde mich ehren, mal was davon zu sehen, wenn ja! Youtube oder so?

@ heiliga horsd - danke, det schau ich mir an! Ich kann mir kaum vorstellen, dioes noch weiterzutreiben zwar (einfach so im Kopf mein ich), aber eben darum muss ich das gugg! :D thx Dude

cheers there, have fun,


Henry
Ich code, also bin ich.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Außerdem gibt es noch Miller-Rabin was verwendet wird um bei großen Zahlen festzustellen ob es wie eine Primzahl ausschaut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten