Попробуйте это:
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
простых чисел.
Как указано в этого вопроса , максимальный размер списка python в 32-битной системе равен 536,870,912
. Поэтому, даже если у вас не хватает памяти, вы все равно не сможете завершить вычисления.
У вас не должно быть такой проблемы с 64-битной системой.
2 ** 64 => 18446744073709551616
При использовании математики из вышеупомянутого вопроса (2 ** 64) / 8
максимальное количество элементов в списке будет 2,305,843,009,213,693,951
, что превышает предполагаемое число простых чисел, с которыми вы столкнетесь.
Edit:
Чтобы избежать проблем с памятью, вы можете сохранить список простых чисел в файле на жестком диске. Сохраняйте одно простое число в строке и читайте файл каждый раз, когда проверяете новый номер.
Может быть, что-то вроде этого:
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 ).