Python Prime Checker: несколько методов проверки того, является ли число простым

Я предоставлю вам несколько методов проверки того, является ли число простым в 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