次の素数を見つけるための高速でメモリ効率の良い方法を探しています。
入力:整数n
次の値より大きい最初の素数を出力n
n
N 未満のすべての素数を一覧表示するFastest wayよりも小さいすべての素数を出力する、非常に優れたコードがあります。私の非効率的な方法は、現在、リストをループするだけで、より小さいすべての素数を見つけて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
この最後のテストには、ほぼ 1 GB の RAM が必要です。このコードのもう 1 つの問題は、たとえば $n = 10**10$ の場合に失敗することです。
この問題はより速く解決できますか? メモリの使用量を少なくする方法はありますか?