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.
In der Generatorfunktion prim_teiler_ohne_modulo kann man auch noch die durch 3 teilbaren Zahlen aus der Prüfung herauslassen, allerdings wird die Schleife dann komplizierter:
def prim_teiler_ohne_modulo():
yield 2
yield 3
primzahlen = list()
wurzel = 0
d = -1
zahl = 5
while True:
if not any(prim.teilbar(zahl) for prim in itertools.islice(primzahlen,
wurzel)):
primzahlen.append(PrimModulo(zahl))
wurzel = int(len(primzahlen) ** 0.5)
yield zahl
# Abwechselnd 2 und 4 zu zahl addieren
zahl += 3 + d
d = -d
Ich habe allerdings bisher gerade mal getestet, dass die Primzahlen bis 100 richtig ausgegeben werden, mehr noch nicht. Insbesondere habe ich keine Laufzeiten verglichen. Interessant wird das Verfahren ja aber eher für Fragestellungen wie "die ersten 100 Primzahlen finden" oder Ähnliches, ohne vorgegebene Obergrenze.
from itertools import islice, chain, count
try:
from itertools import izip
except ImportError:
izip = zip
def prim_teiler_ohne_modulo():
yield 2
yield 3
wurzel = 0
primzahlen = list()
for zahl in chain.from_iterable(izip([count(5, 6), count(7, 6)]):
if not any(prim.teilbar(zahl) for prim in islice(primzahlen, wurzel)):
primzahlen.append(PrimModulo(zahl))
wurzel = int(len(primzahlen) ** 0.5)
yield zahl
def prim_teiler_ohne_modulo_und_wurzel():
yield 2
primzahlen = list()
wurzel = 0
wurzel_grenze = 1
for zahl in count(3, 2):
if not any(prim.teilbar(zahl) for prim in islice(primzahlen, wurzel)):
primzahlen.append(PrimModulo(zahl))
if len(primzahlen) == wurzel_grenze:
wurzel += 1
wurzel_grenze += 2 * wurzel + 1
yield zahl
for zahl in chain.from_iterable(izip(count(5, 6), count(7, 6))):
Aber dann gefällt mir diese Schleife entschieden besser als meine Uralt-Variante (wirklich uralt, ich habe die ganze Idee aus einem Buch zu programmierbaren Taschenrechnern). Über itertools kann man gar nicht genug wissen. Danke schön!