Сито Эратостена в Python & C++

⚡ Умное резюме

Решето Эратосфена — это классический алгоритм для простых чисел, который фильтрует составные числа путем итеративного помечания кратных каждого простого числа, оставляя только простые числа в пределах выбранного верхнего предела для быстрого поиска.

  • 🔢 Основная идея: Отметьте кратные каждого простого числа, начиная с 2, чтобы выделить простые числа до n включительно.
  • 🧮 Ограниченная петля: Итерации следует выполнять только до квадратного корня из n, поскольку большие множители уже исключены.
  • Сложность времени: Алгоритм работает за O(n log log n), что близко к линейному значению в практических диапазонах.
  • Сегментированное сито: Разделение диапазона на блоки уменьшает объем вспомогательной памяти с O(n) до O(√n).
  • 🧪 Случаи использования: Криптография, хеширование, соревновательное программирование и теория чисел основаны на быстрой генерации простых чисел.

Сито Эратостена в Python

Что такое сито Эратостена?

Решето Эратосфена — это простейшее решето простых чисел. Это алгоритм, используемый для нахождения всех простых чисел в пределах заданного предела. Существует несколько решеток простых чисел, включая решето Эратосфена, решето Аткина и решето Сундарама.

Слово "решето«Это относится к приспособлению, которое фильтрует вещества. В том же духе, алгоритм сита в Python В контексте других языков это относится к методу, который отфильтровывает простые числа из списка целых чисел.

Этот алгоритм фильтрует простые числа, используя итеративный подход. Процесс фильтрации начинается с наименьшего простого числа. Простое число — это натуральное число больше 1, имеющее только два делителя: 1 и само число. Numbers Числа, не являющиеся простыми, называются составными числами.

Зачем использовать сито Эратостена?

В методе решета Эратосфена сначала выбирается небольшое простое число, а затем отфильтровываются все его кратные. Процесс выполняется в цикле по заданному диапазону, эффективно получая все простые числа до n без пробного деления каждого кандидата.

Благодаря этому проверка методом решета происходит быстрее, чем проверка на простоту каждого числа по отдельности. Она широко используется в теории чисел, криптографии, хешировании и спортивном программировании, где необходимо быстро генерировать множество простых чисел.

Например:

Возьмем диапазон чисел от 2 до 10.

Сито Эратосфена Алгоритм

После применения решета Эратосфена будет получен список простых чисел 2, 3, 5, 7.

Сито Эратосфена Алгоритм

Алгоритм Решето Эратосфена

Вот алгоритм Решета Эратосфена:

Шаг 1) Составьте список чисел от 2 до заданного диапазона n. Начнём с 2, потому что это наименьшее и первое простое число.

Шаг 2) Выберите наименьшее число в списке, x (изначально x равно 2), пройдите по списку и отфильтруйте соответствующие составные числа, отметив все кратные выбранному числу.

Шаг 3) Затем выберите следующее простое или наименьшее неотмеченное число в списке и повторите шаг 2.

Шаг 4) Повторяйте предыдущий шаг до тех пор, пока значение x не станет меньше или равно квадратному корню из n (x <=Алгоритм Решето Эратосфена).

Примечание: Математическое рассуждение довольно простое. Числовой диапазон n можно разложить на множители следующим образом:

n = a * b

Опять же, n = Алгоритм Решето Эратосфена * Алгоритм Решето Эратосфена

= (коэффициент меньше, чем Алгоритм Решето Эратосфена) * (коэффициент больше, чем Сито Эратосфена Алгоритм)

Итак, по крайней мере, один из главные факторы или оба должны быть <= Алгоритм Решето ЭратосфенаСледовательно, перемещение до Алгоритм Решето Эратосфена будет достаточно.

Шаг 5) После этих четырех шагов оставшиеся неотмеченные числа будут представлять собой все простые числа в заданном диапазоне n.

Рабочий пример

Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.

Давайте рассмотрим пример и посмотрим, как это работает.

В этом примере мы найдем список простых чисел от 2 до 25. Таким образом, n = 25.

Шаг 1) На первом этапе мы возьмем список чисел от 2 до 25, поскольку мы выбрали n = 25.

Алгоритм Решето Эратосфена

Шаг 2) Затем мы выбираем наименьшее число в списке, x. Изначально x = 2, потому что это наименьшее простое число. Затем мы проходим по списку и отмечаем числа, кратные 2.

Число n, кратное 2, равно: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24.

Сито Эратосфена Алгоритм

Примечание: Синий цвет обозначает выбранное число, а розовый — исключенные кратные числа.

Шаг 3) Затем мы выбираем следующее наименьшее немаркированное число, то есть 3, и повторяем последний шаг, отмечая числа, кратные 3.

Сито Эратосфена Алгоритм

Шаг 4) Повторяем шаг 3 таким же образом до тех пор, пока x = Сито Эратосфена Алгоритм или 5.

Сито Эратосфена Алгоритм

Шаг 5) Оставшиеся неотмеченные числа — это простые числа от 2 до 25.

Сито Эратосфена Алгоритм

псевдо-Code

Приведенный ниже псевдокод отражает базовую структуру решета Эратосфена до того, как мы переведем его в реальный код.

Begin
	Declare a boolean array of size n and initialize it to true
	For all numbers i : from 2 to sqrt(n)
     		IF bool value of i is true THEN
         			i is prime
         			For all multiples of i (i<n)
             			mark multiples of i as composite
Print all unmarked numbers
End

Решето Эратосфена C/C++ Code Пример

Ниже представлен полный C++ Реализация решета Эратосфена, которая выводит все простые числа до выбранной верхней границы.

#include <iostream>
#include <cstring>
using namespace std;
void Sieve_Of_Eratosthenes(int n)
{
    // Create and initialize a boolean array
    bool primeNumber[n + 1];
    memset(primeNumber, true, sizeof(primeNumber));
    for (int j = 2; j * j <= n; j++) {
        if (primeNumber[j] == true) {
            // Update all multiples of i as false
            for (int k = j * j; k <= n; k += j)
                primeNumber[k] = false;
        }
    }
    for (int i = 2; i <= n; i++)
        if (primeNumber[i])
            cout << i << " ";
}
int main()
{
    int n = 25;
    Sieve_Of_Eratosthenes(n);
    return 0;
}

Выход:

2 3 5 7 11 13 17 19 23

Сито Эратосфена Python Пример программы

Следующие Python Программа реализует тот же алгоритм, используя логический список и цикл while.

def SieveOfEratosthenes(n):
# Create a boolean array
	primeNumber = [True for i in range(n+2)]
	i = 2
	while (i * i <= n):
		if (primeNumber[i] == True):
			# Update all multiples of i as false
			for j in range(i * i, n+1, i):
				primeNumber[j] = False
		i += 1
	for i in range(2, n):
		if primeNumber[i]:
			print(i)
n = 25
SieveOfEratosthenes(n)

Выход:

2
3
5
7
11
13
17
19
23

Сегментированное сито

Мы видели, что решето Эратосфена проходит циклом по всему диапазону чисел. Следовательно, для хранения чисел требуется O(n) объема памяти. Ситуация усложняется, когда мы пытаемся найти простые числа в огромном диапазоне, поскольку выделение такого большого блока памяти для большего n нецелесообразно.

Алгоритм может быть оптимизирован путем введения некоторых новых функций. Идея состоит в том, чтобы разделить диапазон чисел на более мелкие сегменты и вычислить простые числа в этих сегментах одно за другим. Это эффективный способ уменьшить сложность пространства. Этот метод называется сегментированное сито.

Оптимизация может быть достигнута следующим образом:

  1. С помощью простого сита найдите простые числа от 2 до Сегментированное сито и сохранить их в массиве.
  2. Разделите диапазон [0…n-1] на несколько сегментов размером не более Сегментированное сито.
  3. Для каждого сегмента пройдитесь по нему и отметьте кратные простых чисел, найденных на шаге 1. Этот шаг требует O(Сегментированное сито) на максимуме.

Обычное сито требует O(n) вспомогательной памяти, тогда как сегментированное сито требует O(Сегментированное сито), что является существенным улучшением для больших n. У этого метода есть и недостаток, поскольку он не улучшает временную сложность.

Анализ сложности

Понимание пространственной и временной сложности помогает выбрать между обычным и сегментированным ситом для задачи заданного размера.

Космическая сложность:

Простой алгоритм решета Эратосфена требует O(n) памяти. Сегментированное решето требует O(n)Анализ сложности) вспомогательное пространство.

Сложность времени:

Временная сложность обычного алгоритма решета Эратосфена составляет O(n*log(log(n))). Причины такой сложности обсуждаются ниже.

Для заданного числа n время, необходимое для обозначения составного числа (то есть не простого числа), является постоянным. Следовательно, количество запусков цикла равно:

n/2 + n/3 + n/5 + n/7 + ……∞

= n * (1/2 + 1/3 + 1/5 + 1/7 +…….∞)

Гармоническую прогрессию суммы простых чисел можно вывести как log(log(n)):

(1/2 + 1/3 + 1/5 + 1/7 +…….∞) = log(log(n))

Таким образом, временная сложность составит:

T(n) = n * (1/2 + 1/3 + 1/5 + 1/7 + ……∞)

= n * журнал(журнал(n))

Таким образом, временная сложность составляет O(n * log(log(n))).

Далее вы узнаете о Треугольник Паскаля.

Часто задаваемые вопросы (FAQ)

Любое составное число n можно записать как произведение двух множителей, причём по крайней мере один из них должен быть меньше или равен квадратному корню из n. Отмечать кратные числа после этой точки нет необходимости, поскольку каждое составное число уже исключено.

Обычное решето выделяет O(n) памяти для маркировки каждого числа, в то время как сегментированное решето разбивает диапазон на блоки размером √n и повторно использует память. Сегментированная версия предпочтительнее, когда n очень велико, а объем оперативной памяти ограничен.

Он работает за время O(n log log n), что близко к линейному. Генерация всех простых чисел меньше десяти миллионов занимает лишь доли секунды на современном ноутбуке, что делает решето самым быстрым практическим вариантом для малых и средних диапазонов.

Современные ускорители ИИ ускоряют поиск простых чисел в больших массивах за счет распараллеливания алгоритмов сита на графических и тензорных процессорах. Модели машинного обучения также помогают прогнозировать перспективные диапазоны кандидатов, снижая нагрузку на проверку Миллера-Рабина и другие проверки на простоту, используемые при генерации ключей RSA.

Да. Искусственный интеллект-репетиторы генерируют пошаговые инструкции. tracОни позволяют визуализировать метод исключения составных элементов, предлагают варианты оптимизации, такие как факторизация колеса, и интерактивно объясняют доказательства. Они помогают учащимся развить интуитивное понимание границ гармонических рядов и аргументов сложности, лежащих в основе метода решета.

Подведем итог этой публикации следующим образом: