如何解决有效地找到一定范围内的素数
| 这是我为python3的Eratosthenes筛子找到的算法代码。我想做的就是编辑它,这样我可以输入一个范围的下限和上端,然后输入一个素数列表,直到最底端的素数,然后输出该范围内的素数列表。 但是,我不太确定该怎么做。 如果您能提供帮助,将不胜感激。from math import sqrt
def sieve(end):
if end < 2: return []
#The array doesn\'t need to include even numbers
lng = ((end//2)-1+end%2)
# Create array and assume all numbers in array are prime
sieve = [True]*(lng+1)
# In the following code,you\'re going to see some funky
# bit shifting and stuff,this is just transforming i and j
# so that they represent the proper elements in the array.
# The transforming is not optimal,and the number of
# operations involved can be reduced.
# Only go up to square root of the end
for i in range(int(sqrt(end)) >> 1):
# Skip numbers that aren’t marked as prime
if not sieve[i]: continue
# Unmark all multiples of i,starting at i**2
for j in range( (i*(i + 3) << 1) + 3,lng,(i << 1) + 3):
sieve[j] = False
# Don\'t forget 2!
primes = [2]
# Gather all the primes into a list,leaving out the composite numbers
primes.extend([(i << 1) + 3 for i in range(lng) if sieve[i]])
return primes
解决方法
我认为以下工作正常:
def extend_erathostene(A,B,prime_up_to_A):
sieve = [ True ]* (B-A)
for p in prime_up_to_A:
# first multiple of p greater than A
m0 = ((A+p-1)/p)*p
for m in range( m0,p):
sieve[m-A] = False
limit = int(ceil(sqrt(B)))
for p in range(A,limit+1):
if sieve[p-A]:
for m in range(p*2,p):
sieve[m-A] = False
return prime_up_to_A + [ A+c for (c,isprime) in enumerate(sieve) if isprime]
, 这个问题被称为“ Eratosthenes的分段筛”。Google提供了一些有用的参考。
, 您已经有从2到end
的质数,因此只需要过滤返回的列表。
, 一种方法是使用end = top
运行筛网代码并修改最后一行,以仅提供比底数大的数字:
如果范围与幅度相比较小(即,顶部与底部相比较小),则最好使用其他算法:
从底部开始,遍历奇数,检查它们是否为质数。您需要一个isprime(n)函数,该函数仅检查n是否可被从1到sqrt(n)的所有奇数整除:
def isprime(n):
i=2
while (i*i<=n):
if n%i==0: return False
i+=1
return True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。