Алгоритмы проверки простоты числа
Обзор проверки простоты числа
Проверка простоты числа заключается в определении, является ли данное число простым. Существует несколько алгоритмов, каждый из которых имеет различную эффективность и сложность.
Общие алгоритмы проверки простоты числа
Алгоритм |
Временная сложность |
Точность |
Сложность |
Проверка на делители |
O(√n) |
100% |
Низкая |
Тест Ферма на простоту |
O(k log n) |
Вероятностный |
Средняя |
Тест Миллера-Рабина |
O(k log³n) |
Вероятностный |
Высокая |
Метод проверки на делители
def trial_division(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
Тест Ферма на простоту
import random
def fermat_test(n, k=5):
if n <= 1 or n == 4:
return False
if n <= 3:
return True
for _ in range(k):
a = random.randint(2, n - 2)
if pow(a, n - 1, n)!= 1:
return False
return True
Тест Миллера-Рабина на простоту
def miller_rabin(n, k=5):
if n <= 1 or n == 4:
return False
if n <= 3:
return True
def check(a, d, n, s):
x = pow(a, d, n)
if x == 1 or x == n - 1:
return True
for _ in range(s - 1):
x = pow(x, 2, n)
if x == n - 1:
return True
return False
s = 0
d = n - 1
while d % 2 == 0:
d //= 2
s += 1
for _ in range(k):
a = random.randint(2, n - 2)
if not check(a, d, n, s):
return False
return True
Алгоритм сравнения в виде диаграммы потока
graph TD
A[Start Primality Test] --> B{Choose Algorithm}
B --> |Simple Cases| C[Trial Division]
B --> |Probabilistic| D[Fermat Test]
B --> |Advanced| E[Miller-Rabin Test]
C --> F{Is Prime?}
D --> G{Probability of Primality}
E --> H{High Accuracy}
Практические соображения
В LabEx мы рекомендуем выбирать соответствующий алгоритм на основе:
- Размера числа
- Требуемой точности
- Вычислительных ресурсов
- Конкретного случая использования