Sieve of Eratosthenes - Primzahlen zwischen X und N
Ich fand diese hochoptimierte Implementierung des Sieve of Eratosthenes für Python on Stack Overflow. Ich habe eine ungefähre Vorstellung davon, was es tut, aber ich muss zugeben, dass mir die Details seiner Funktionsweise entgehen.
Ich würde es immer noch gerne für ein kleines Projekt verwenden (mir ist bewusst, dass es Bibliotheken gibt, die dies tun, aber ich möchte diese Funktion verwenden).
Hier ist das Original:
'''
Sieve of Eratosthenes
Implementation by Robert William Hanks
https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n/3035188
'''
def sieve(n):
"""Return an array of the primes below n."""
prime = numpy.ones(n//3 + (n%6==2), dtype=numpy.bool)
for i in range(3, int(n**.5) + 1, 3):
if prime[i // 3]:
p = (i + 1) | 1
prime[ p*p//3 ::2*p] = False
prime[p*(p-2*(i&1)+4)//3::2*p] = False
result = (3 * prime.nonzero()[0] + 1) | 1
result[0] = 3
return numpy.r_[2,result]
Was ich versuche zu erreichen, ist es zu ändern, um alle Primzahlen unter @ zurückzugebn
beginnt u x
damit
primes = sieve(50, 100)
would Primzahlen zwischen 50 und 100 zurückgeben. Diese schien einfach genug, ich habe versucht, diese beiden Zeilen zu ersetzen:
def sieve(x, n):
...
for i in range(x, int(n**.5) + 1, 3):
...
Aber aus einem Grund, den ich nicht erklären kann, ist der Wert vonx
oben hat keinen Einfluss auf das zurückgegebene Numpy-Array!
Wie kann ich @ ändersieve()
zunu return primes betweenx
undn