Ваш код обычно беспорядок. Но ваша главная, конкретная проблема c в том, что последняя строка вашей функции lucas_lehmer()
неверна:
return True
Это тест , он не может всегда возврат True
! Последняя строка должна быть:
return s == 0
Вот переписать ваш код, чтобы исправить вышеуказанную проблему, а также устранить ее:
def is_prime(number):
if number <= 1:
return False
if number % 2 == 0:
return number == 2
for factor in range(3, int(number ** 0.5) + 1):
if number % factor == 0:
return False
return True
def lucas_lehmer(prime):
s = 4
m = 2 ** prime - 1
for _ in range(prime - 2):
s = (s * s - 2) % m
return s == 0
mersenne_primes = [number for number in range(3, 1500) if is_prime(number) and lucas_lehmer(number)]
print(*mersenne_primes)
Вывод не в том же формате как ваш оригинал, но это легко исправить. Это с готовностью идет в 100 раз выше, чем ваш код:
> python3 test.py
3 5 7 13 17 19 31 61 89 107 127 521 607 1279
>
Но, начав примерно в 200 раз, он станет заметно медленнее.