Простое число — это натуральное число больше 1, которое имеет ровно два делителя: 1 и само себя.

Примеры простых чисел:
2, 3, 5, 7, 11, 13, ...

Составные числа (не простые):
4 (2×2), 6 (2×3), 8 (2×4), 9 (3×3), ...


Основные методы проверки

 Перебор делителей

Принцип:
Проверяем делители от 2 до √n (если делитель есть → число составное).

def is_prime_naive(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

Сложность:
O(√n) — медленно для больших чисел.


 Оптимизированный перебор

Улучшения:

  • Проверяем только нечётные делители после 2.

  • Пропускаем числа, кратные 2 и 3.

def is_prime_optimized(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

Сложность:
O(√n / 3) — быстрее первого метода.


Детерминированные методы

 Решето Эратосфена (для поиска всех простых ≤ n)

Принцип:
Последовательно отсеиваем составные числа.

Код:

def sieve_of_eratosthenes(n):
    sieve = [True] * (n + 1)
    sieve[0] = sieve[1] = False
    for i in range(2, int(n**0.5) + 1):
        if sieve[i]:
            sieve[i*i : n+1 : i] = [False] * len(sieve[i*i : n+1 : i])
    return [i for i, prime in enumerate(sieve) if prime]

Сложность:
O(n log log n) — эффективно для генерации всех простых до n.