Проверка на простоту за корень

Материал из Algocode wiki
Перейти к: навигация, поиск

Проверка на простоту за $O(\sqrt{N})$

$N$ - число, для которого мы определяем, простое ли оно.

Основные понятия

Рекомендуется сначала прочитать статью про простые числа.

Проверка на простоту за $O(N)$

Линейная проверка очень простая - надо просто перебрать все числа от $2$ до $N - 1$ и проверить, что $N$ не делится ни на одно из них. Отдельно обрабатывается случай для $N = 1$.

bool isPrime(int n) {
    if (n == 1) {
        return false;
    }
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

Ускорение до $O(\sqrt{N})$

Утверждение:
Пусть $N = a \times b$, причем $a \leq b$. Тогда $a \leq \sqrt N \leq b$.

Доказательство:
если $a \leq b < \sqrt{N}$, то $ab \leq b^2 < N$, но $ab = N$. А если $\sqrt{N} < a \leq b$, то $N < a^2 \leq ab$, но $ab = N$.

Иными словами, если число $N$ равно произведению двух других, то одно из них не больше корня из $N$, а другое не меньше корня из $N$.

Из этого следует, что если число $N$ не делится ни на одно из чисел $2, 3, 4, \ldots, \bigl\lfloor\sqrt{N}\bigr\rfloor$, то оно не делится и ни на одно из чисел $\bigl\lceil\sqrt{N}\bigr\rceil + 1, \ldots, N-2, N-1$, так как если есть делитель больше корня (не равный $N$), то есть делитель и меньше корня (не равный $1$). Поэтому в цикле for достаточно проверять числа не до $N$, а до корня.

bool isPrime(int n) {
    if (n == 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}



Автор конспекта: Полина Романченко

По всем вопросам пишите в telegram @Romanchenko