我正在寻找一种快速且内存高效的方法来找到下一个素数。
输入:一个整数n
输出第一个大的素数n
有非常好的代码可以打印所有小于n
以最快方式列出所有素数低于 N的素数。我的低效方法目前找到所有小于的素数2n
,然后n
通过循环遍历列表来搜索大于的第一个素数。这是我当前的代码。
import numpy
def primesfrom2to(n):
""" Input n>=6, Returns a array of primes, 2 <= p < n """
sieve = numpy.ones(n/3 + (n%6==2), dtype=numpy.bool)
for i in xrange(1,int(n**0.5)/3+1):
if sieve[i]:
k=3*i+1|1
sieve[ k*k/3 ::2*k] = False
sieve[k*(k-2*(i&1)+4)/3::2*k] = False
return numpy.r_[2,3,((3*numpy.nonzero(sieve)[0][1:]+1)|1)]
n=10**7
timeit next(x for x in primesfrom2to(2*n) if x > n)
1 loops, best of 3: 2.18 s per loop
n= 10**8
timeit next(x for x in primesfrom2to(2*n) if x > n)
1 loops, best of 3: 21.7 s per loop
最后一个测试需要将近 1GB 的 RAM。这段代码的另一个问题是,例如,如果 $n = 10**10$ 就会失败。
这个问题可以更快解决吗?有没有办法让它使用更少的内存?