Найти в Дзене

Алгоритмы на языке Python. Простые числа и Решето Эратосфена

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Алгоритмы на Python | programmer's notes (python and more) | Дзен
Численная математика и алгоритмы на Python | programmer's notes (python and more) | Дзен
Базовый курс программирования на Python | programmer's notes (python and more) | Дзен

Алгоритмы реализации поиска простых чисел на Python

Что такое простое число вы все, наверное знаете. Это натуральное число, у которого только два делителя 1 и само это число. Алгоритм определения, является ли это число целым не сложен. Нужно поискать его делители. Если их нет (кроме указанных выше), то число простое.

Общая постановка задачи будет такой: нужно найти все простые числа от 2 до заданного числа n.

Рассмотрим в начале программу, представленную на рисунке 1. Она ищет простые числа от a до b.

Рисунок 1. Поиск простых числе от до n. Текст программы см. ниже по ссылке
Рисунок 1. Поиск простых числе от до n. Текст программы см. ниже по ссылке
primer380.py

Пояснения к программе

Центральной в программе является функция prime(). Она возвращает True, если число простое и False, если число составное (не простое). Проверка делимости идёт до корня квадратного из из самого числа (math.sqrt(n)). Это и понятно, множители большие этого значения, имеют пару меньшую этого значения. Так зачем же проверять делимость на второй возможный парный множитель.

Не много изменим программу на рисунке 1. По сути не меняем алгоритм, а вынесем вывод вывод простых чисел в конец программы. Для этого будем запоминать простые числа в списке (см. Рисунок 2).

Рисунок 2. Несколько усовершенствованный алгоритм, представленный на рисунке 1. Текст программы см. по ссылке
Рисунок 2. Несколько усовершенствованный алгоритм, представленный на рисунке 1. Текст программы см. по ссылке
primer381.py

Пояснение к программе

Алгоритм, как я уже сказал не изменился. Честно говоря оптимизация оказалась не слишком эффективной. Улучшение не значительное. Однако есть.

Можно ли улучшить последний алгоритм? Можно, если учесть, что лишне учитывать чётные числа, так как они заведомо не простые. Другими словами можно просматривать числа с шагом 2 (см. Рисунок 3).

Рисунок 3. Улучшенный вариант алгоритма из рисунка 2 поиска простых чисел. Текст программы см. ниже по ссылке
Рисунок 3. Улучшенный вариант алгоритма из рисунка 2 поиска простых чисел. Текст программы см. ниже по ссылке
primer383.py

Пояснение к программе из рисунка 3

Поиск начинается с 3 и далее с шагом 2. Таким образом мы избегаем чётных чисел и уменьшаем количество шагов. Прирост производительности уже более существенен.

Решето Эратосфена

Ну и наконец программа (рисунок 4), реализующая алгоритм Решето Эратосфена, реализующий так называемое Решето Эратосфена. В чём суть алгоритма.

Начинаем с числа i=2, а затем "вычеркиваем все числа" вида m*i, при этом, конечно m*i <=b. Потом переходим к i=3 и т.д., пропуская, конечно, вычеркнутые.

Рисунок 4. Реализация "решета Эратосфена" на Python. Текст программы см. ниже по ссылке
Рисунок 4. Реализация "решета Эратосфена" на Python. Текст программы см. ниже по ссылке
primer382.py

Пояснение к программе

В программе самое интересное, как реализовать вычёркивание. Я реализовал очень просто. Все вычеркнутые числа помещаю в множество и каждый раз проверяю, попадает ли выбранное число в вычеркнутые. Оказалось, что данный подход эффективен. Алгоритм работает значительно быстрее предыдущих (для указанного количества раза в два быстрее). Но, как это обычно бывает, для увеличения скорости выполнения требуется больше памяти. Ну, такова жизнь.

Замечание 1.
Понятно, что подходы представленные на рисунках 1, 2 и 3 универсальны. Можно искать простые числа в любых промежутках. А решето Эратосфена работает от 2 до n.

Замечание 2.
Существуют и другие критерии проверки на простоту, но они не точные. Они дают точный результат, если число не простое, а если простое, то результат верен с некоторой высокой, но вероятностью. Может мы в будущем о них поговорим.

Замечание 3.
В Python есть библиотеки, где есть инструменты для проверки того, является число простым или нет. Но я всегда предпочитаю по возможности делать всё своими руками. Зачем? - спросите вы. Ну как зачем, удовольствие получить. Но в одной из статей, я с такими библиотеками всё таки вас познакомлю.

Ну и, наконец, в заключении приведу пример, усовершенствованной программы из рисунка 3 на случай, когда промежуток [a, b] произволен.

Рисунок 5. Программа поиска простых чисел в произвольном промежутке [a, b]. Текст программы см. ниже по ссылке.
Рисунок 5. Программа поиска простых чисел в произвольном промежутке [a, b]. Текст программы см. ниже по ссылке.
primer384.py

Пояснение к программе

Усовершенствование просто меняет начало промежутка на 1, если a чётное число или 2.

Статья о библиотеке primePy.

Ну, пока всё!

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

"С потолка он строит дом, носит воду решетом." Но у меня всё без воды
"С потолка он строит дом, носит воду решетом." Но у меня всё без воды