← Все вопросы
Как эффективно проверить число на простоту?
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 месяца назад
Ваш ответ
Войдите, чтобы ответить на вопрос.