Я пытаюсь вычислить простые числа на одной машине размером примерно 2^30-2^100.
Мой алгоритм приведен ниже для всех, кому интересно.
Я оптимизировал этот код Python, чтобы он был O(sqrt(n/2))
( я верю) для каждого числа: он принимает только нечетные числа, и я гарантирую, что число, переданное ему, является нечетным в другом методе.
Я использовал тест Ферма на простоту, чтобы попытаться ускорить процесс. Однако числа слишком велики для встроенного метода math.pow()
, поэтому я использовал возведение в степень путем возведения в квадрат.
Однако для больших чисел это занимает очень много времени, что было бы быстрее, если использовать только грубую силу.
Моя реализация неверна?
Время исходит от алгоритма возведения в квадрат, его стек повторений также съедает мою память, есть ли для этого более быстрый алгоритм, который мне следует изучить?
Чтобы вычислить, является ли число 35184372088967 простым, потребовалось 0,00100111 секунд с использованием моего алгоритма грубой силы, но для запуска простого теста потребовалось 0,40608 секунд.
Проверка простого числа грубой силой:
def isPrime(n):
for i in range(3,int(math.sqrt(n)),2):
if(n%i==0):
return False
return True
Реализация алгоритма Ферма:
def couldBePrime(n):
if(n>308):
return power(2,n-1)%n==1
else:
return math.pow(2,n-1)%n==1
Возведение в степень по алгоритму возведения в квадрат (времязатратная часть):
def power(base,exp):
if exp == 0:
return 1
elif exp == 1:
return base
elif (exp & 1) != 0:
return base * power(base * base, exp // 2)
else:
return power(base * base, exp // 2)
pow(base,exponent,modulus)
, чтобы выполнить модульное возведение в степень. Это встроенная функция, вам не нужно писать ее самостоятельно. - person user448810   schedule 13.10.2017