Сито Эратосфена - простые числа между X и N
Я нашел эту высоко оптимизированную реализацию Sieve of Eratosthenes для Python при переполнении стека. У меня есть приблизительное представление о том, что он делает, но я должен признать, что детали его работы ускользают от меня.
Я все еще хотел бы использовать его для небольшого проекта (я знаю, что для этого есть библиотеки, но я бы хотел использовать эту функцию).
Вот оригинал:
'''
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]
То, что я пытаюсь достичь, это изменить его так, чтобы он возвращал все простые числа нижеn
начинается с x
чтобы:
primes = sieve(50, 100)
будет возвращать простые числа от 50 до 100. Этоказалось достаточно просто, я попытался заменить эти две строки:
def sieve(x, n):
...
for i in range(x, int(n**.5) + 1, 3):
...
Но по причине, которую я не могу объяснить, ценностьx
в вышесказанном не имеет никакого влияния на возвращаемый массив numpy!
Как я могу изменитьsieve()
втолько вернуть простые числа междуx
а такжеn