Я работаю над проектом, который требует от меня выяснить, являются ли чрезвычайно большие числа простыми числами или нет. Конечно, я читал, как найти простые числа, и предложил очень простой метод грубой силы:
def is_prime_brute_force(p):
if p == 2 or p == 3:
return true
if p == 1 or p % 2 == 0 or any(p % i == 0 for i in range(3, floor_sqrt(p), 2)):
return false
return true
Я также исследовал такие вероятностные c методы, как Миллер -Rabin Primality Test и маленькая теорема Ферма (см. здесь для реализации первого кода Розетты).
Хотя параметры вероятности c на порядок быстрее, чем грубые сила, они все еще очень медленные для очень больших входных данных n
(например, известное простое число 10**9999 + 33603
).
Я столкнулся с интересным наблюдением (конечно, я не первый, кто сталкивался с таким наблюдением), что все простые числа соответствуют уравнению p = 6 * k + 1
или p = 6 * k -1
. В Python такая функция выглядит следующим образом
def is_prime_eq(p):
if p == 2 or p == 3:
return True
if p == 0 or p == 1:
return False
# The same as `return (p % 6 == 1) or (p % 6 == 5)`
prime_test = lambda p, a, m : (p % a == m) or (p % a == (a-m))
return prime_test(p, 6, 1)
Выше гарантировано вернет true, если p
- простое число, но истинный результат не означает, что p
- простое число. Простой пример - 25 (25 = 1 (мод 6), но явно 25 = 5 ^ 2).
Мне интересно, есть ли более общий способ применить это интересное свойство простых чисел, возможно, с другим значения a
для улучшения скорости моей функции is_prime
.