これを試して:
def getPrimes(maxnum):
primes = []
for i in xrange(2, maxnum):
is_mul = False
for j in primes: # Try dividing by all previous primes
if i % j == 0:
is_mul = True # Once we find a prime that i is divisible by
break # short circuit so we don't have to try all of them
if not is_mul: # if we try every prime we've seen so far and `i`
primes.append(i) # isn't a multiple, so it must be prime
return primes
非常に多くの素数に到達するまで、メモリが不足しないようにする必要があります。このようにして、倍数のリストを作成することを心配する必要はありません。ただし、これがまだふるいとしてカウントされるかどうかはわかりません。
実際、これはでは機能しませんmaxnum = 39312312323123123
。素数定理を使用すると1,028,840,332,567,181
、その範囲にほぼ素数があると推定できます。
この質問で指摘されているように、32ビットシステムでのPythonリストの最大サイズはです536,870,912
。したがって、メモリが不足していなくても、計算を終了することはできません。
ただし、64ビットシステムではその問題は発生しないはずです。
2 ** 64 => 18446744073709551616
前述の質問の計算を使用する(2 ** 64) / 8
と、リスト内の要素の最大数は、2,305,843,009,213,693,951
遭遇する素数の推定数よりも多くなります。
編集:
メモリの問題を回避するために、素数のリストをハードディスク上のファイルに保存することができます。1行に1つの素数を格納し、新しい番号を確認するたびにファイルを読み取ります。
多分このようなもの:
primes_path = r'C:\temp\primes.txt'
def genPrimes():
for line in open(primes_path, 'r'):
yield int(line.strip())
def addPrime(prime):
primes_file = open(primes_path, 'a')
primes_file.write('%s\n' % prime)
primes_file.close()
def findPrimes(maxnum):
for i in xrange(2, maxnum):
is_mul = False
for prime in genPrimes(): # generate the primes from a file on disk
if i % prime == 0:
is_mul = True
break
if not is_mul:
addPrime(i) # append the new prime to the end of your primes file
最後に、すべての素数を含むファイルがハードドライブにあります。
さて、これはかなり遅いでしょうが、メモリが不足することはありません。ファイル( RAIDなど)の読み取り/書き込み速度を上げることで、速度を上げることができます。