Я предоставлю вам несколько методов проверки того, является ли число простым в Python, а также примеры кода. Вот четыре распространенных подхода:
Метод 1: базовая итерация
В этом методе мы выполняем итерацию от 2 до квадратного корня заданного числа и проверяем, делится ли оно на любое число в этом диапазоне.
import math
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
Метод 2: оптимизированное пробное разделение
Этот подход аналогичен базовому методу итерации, но включает в себя некоторые оптимизации. Например, мы можем пропустить четные числа больше 2, поскольку они не являются простыми.
import math
def is_prime(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
Метод 3: Решето Эратосфена
Решето Эратосфена — это древний алгоритм, который эффективно находит все простые числа до заданного предела. Здесь мы изменим его, чтобы проверять, является ли одно число простым.
def is_prime(n):
if n <= 1:
return False
sieve = [True] * (n + 1)
sieve[0] = sieve[1] = False
i = 2
while i * i <= n:
if sieve[i]:
for j in range(i * i, n + 1, i):
sieve[j] = False
i += 1
return sieve[n]
Метод 4: тест на простоту Миллера-Рабина
Тест на простоту Миллера-Рабина — это вероятностный алгоритм, который определяет, является ли число простым. Для больших чисел он более эффективен, чем предыдущие методы.
import random
def is_prime(n, k=5):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0:
return False
def check_composite(a, d, s, n):
x = pow(a, d, n)
if x == 1 or x == n - 1:
return False
for _ in range(s - 1):
x = pow(x, 2, n)
if x == n - 1:
return False
return True
s, d = 0, n - 1
while d % 2 == 0:
d //= 2
s += 1
for _ in range(k):
a = random.randint(2, n - 1)
if check_composite(a, d, s, n):
return False
return True