← Все вопросы

Как эффективно проверить число на простоту?

Задан 2 месяца назад613 просмотров3 ответа
14

Пишу проверку, простое число или нет. Сделал цикл от 2 до n и проверяю делители — но на больших числах тормозит. Как ускорить?

3 ответа

25
✓ Принятый ответ — помог автору

Главная оптимизация: проверять делители только до корня из n, а не до n. Если у числа есть делитель больше корня, то парный ему делитель меньше корня — так что искать выше корня бессмысленно.

def is_prime(n):
    if n < 2:
        return False
    if n < 4:
        return True          # 2 и 3
    if n % 2 == 0:
        return False
    i = 3
    while i * i <= n:         # до корня из n
        if n % i == 0:
            return False
        i += 2               # только нечётные
    return True

Это O(√n) вместо O(n). Для проверки одного числа более чем достаточно. Если надо найти ВСЕ простые до N — бери решето Эратосфена, оно ещё эффективнее.

Андрей Соколов условие i*i <= n вместо math.sqrt — умно, без флоатов · 2 месяца назад
Дмитрий Первый автор: то что надо, принято · 2 месяца назад
9

Ключевое — цикл до √n. Это сразу превращает медленную проверку в быструю.

-4

проверяй до n//2, дальше делителей точно нет

Лев Герасимов это уже лучше наивного, но всё равно O(n). Правильный порог — корень из n, а не n//2 · 2 месяца назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект