Кажется, проблема в том, что 239 - это первое простое число, где нетривиально определить, является ли 239 ** 239 + 2
простым.До этого вычисленные числа легко проходили простое тестирование (кратно 5 и т. Д.). Ниже приведен пример очистки вашего кода, чтобы прояснить (по крайней мере, мне), что происходит.Он включает некоторые оптимизации, предложенные в комментариях, но это мало что меняет.Он все еще спускается вниз в 239:
def is_prime(number):
if number < 2:
return False
if number % 2 == 0:
return number == 2
i = 3
while i * i <= number:
if number % i == 0:
return False
i += 2
return True
def calculate(odd_prime):
return odd_prime ** odd_prime + 2
def get_next_odd_prime(odd_number):
while True:
odd_number += 2
if is_prime(odd_number):
return odd_number
def check(odd_prime):
while True:
if is_prime(calculate(odd_prime)):
return odd_prime
odd_prime = get_next_odd_prime(odd_prime)
print(odd_prime)
print(check(5))
Так как 3 проходит этот тест (3 ** 3 + 2 == 29
, который также является простым), мы начинаем со следующего более высокого нечетного простого числа, поскольку четные числа выше 2 не имеют смысла.
Люди могут предложить использовать сито Эратосфен в качестве лучшего основного теста - будьте осторожны.Любая простая ситовая реализация, которая опирается на структуру массива, столкнется с проблемами при создании списка Python всего за 11 ** 11 + 2
или около того из-за проблем с выделением памяти.Я не знаю, насколько больше может пойти битвектор, который, скажем, представляет только нечетные числа.