Чтобы оптимизировать поиск простых чисел, вы можете использовать несколько методов. Вот несколько подходов и примеры кода на Python:
- Наивный подход.
Наивный подход заключается в переборе всех чисел от 2 до N-1 и проверке, делит ли какое-либо из них N поровну. Если ни один из них этого не делает, то N — простое число.
def is_prime_naive(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
- Решето Эратосфена:
Решето Эратосфена — это эффективный алгоритм для поиска всех простых чисел до заданного предела. Он работает путем итеративной маркировки кратных каждого простого числа, начиная с 2, как составных (не простых).
def sieve_of_eratosthenes(n):
primes = [True] * (n + 1)
primes[0] = primes[1] = False
p = 2
while p * p <= n:
if primes[p]:
for i in range(p * p, n + 1, p):
primes[i] = False
p += 1
return [i for i in range(n + 1) if primes[i]]
- Тест на простоту Миллера-Рабина.
Тест на простоту Миллера-Рабина — это вероятностный алгоритм, который определяет, является ли данное число простым или составным.
import random
def miller_rabin(n, k=5):
if n <= 1:
return False
if n <= 3:
return True
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 - 2)
if check_composite(a, d, s, n):
return False
return True