Что такое решето эратосфена

Решето Эратосфена, попытка минимизировать память

Введение

Одним из алгоритмов для поиска простых чисел является Решето Эратосфена предложенное еще древнегреческим математиком.

Картинка из википедии:

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

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

Одна из проблем при поиске решетом это объем памяти который надо выделить под фильтруемые числа. Вычеркнутые непростые удаляются уменьшая память, но изначально объем требуется большой.

Для решения используется сегментация (когда память выделяется по кускам) и другие ухищрения (см. тут).

Реализация алгоритма

Алгоритм внизу (написан на java) предполагает минимальный объем памяти — по сути для каждого найденного простого числа мы храним еще одно число — последнее зачеркнутое (наибольшее). Если я правильно оцениваю объем памяти ln(n) — число найденных простых.

Суть алгоритма:

Допустим мы имеем несколько уже найденных простых чисел отсортированных по возрастанию. (Алгоритм стартует с [2,3]). Для каждого из них храним последнее (наибольшее) зачеркнутое число. Инициализируем самими простыми числами.

Выбираем кандидата в простые например наибольшее найденное простое число +1 (в алгоритме внизу перескакиваем четные как заведомо не простые).

Кандидат сравнивается с последним зачеркнутым текущего простого. Пока текущее зачеркнутое меньше кандидата увеличиваем его на текущее простое. Если текущее зачеркнутое равно кандидату, то кандидат не простое число. Выбираем следующего кандидата.

В случае если текущее зачеркнутое больше кандидата, проверяем кандидата на следующем простом числе.

Если добрались до конца списка простых чисел (то есть все зачеркнутые больше кандидата) мы нашли очередное простое число.

Добавляем его в список и инициализируем последнее зачеркнутое найденным простым.

Код на java

Тот же код на питоне:

Вся логика традиционных алгоритмов с колесами может быть применена при выборе следующего кандидата.

Возможно это очередное изобретение велосипеда. Готов выслушать замечания.

Источник

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

Определение. Целое положительное число называется простым, если оно имеет ровно два различных натуральных делителя — единицу и самого себя. Единица простым числом не считается.

Самая простая реализация может выглядеть так:

Время работы

Довольно легко показать, что асимптотическое время работы алгоритма хотя бы не хуже, чем \(O(n \log n)\) : даже если бы мы входили в цикл вычёркиваний для каждого числа, не проверяя его сначала на простоту, суммарно итераций было бы

\[ \sum_k \frac = \frac <2>+ \frac <3>+ \frac <4>+ \ldots + \frac = O(n \log n) \]

Здесь мы воспользовались асимптотикой гармонического ряда.

У исходного алгоритма асимптотика должна быть ещё лучше. Чтобы найти её точнее, нам понадобятся два факта про простые числа:

\[ \sum_k \frac<1> <\ln k>\frac \approx n \int \frac<1> = n \ln \ln k \Big |_2^n = O(n \log \log n) \]

Линейное решето

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

Алгоритм

Изначально массив \(d\) заполним нулями, что означает, что все числа предполагаются простыми. В ходе работы алгортима этот массив будет постепенно заполняться. Помимо этого, будем поддерживать список \(p\) всех найденных на текущий момент простых чисел.

Применения

Массив \(d\) он позволяет искать факторизацию любого числа \(k\) за время порядка размера этой факторизации:

\[ factor(k) = \ \cup factor(k / d(k)) \]

Знание факторизации всех чисел — очень полезная информация для некоторых задач. Ленейное решето интересно не своим временем работы, а именно этим массивом минимальных простых делителей.

Источник

Еще раз о поиске простых чисел

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфенаВ заметке обсуждаются алгоритмы решета для поиска простых чисел. Мы подробно рассмотрим классическое решето Эратосфена, особенности его реализации на популярных языках программирования, параллелизацию и оптимизацию, а затем опишем более современное и быстрое решето Аткина. Если материал о решете Эратосфена предназначен в первую очередь уберечь новичков от регулярного хождения по граблям, то алгоритм решета Аткина ранее на Хабрахабре не описывался.

На снимке — скульптура абстрактного экспрессиониста Марка Ди Суверо «Решето Эратосфена», установленная в кампусе Стэнфорского университета

Введение

Напомним, что число называется простым, если оно имеет ровно два различных делителя: единицу и самого себя. Числа, имеющие большее число делителей, называются составными. Таким образом, если мы умеем раскладывать числа на множители, то мы умеем и проверять числа на простоту. Например, как-то так:
(Здесь и далее, если не оговорено иное, приводится JavaScript-подобный псевдокод)
Время работы такого теста, очевидно, есть O(n ½ ), т. е. растет экспоненциально относительно битовой длины n. Этот тест называется проверкой перебором делителей.

Довольно неожиданно, что существует ряд способов проверить простоту числа, не находя его делителей. Если полиномиальный алгоритм разложения на множители пока остается недостижимой мечтой (на чем и основана стойкость шифрования RSA), то разработанный в 2004 году тест на простоту AKS [1] отрабатывает за полиномиальное время. С различными эффективными тестами на простоту можно ознакомиться по [2].

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

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

Древнегреческий математик Эратосфен предложил следующий алгоритм для нахождения всех простых, не превосходящих данного числа n. Возьмем массив S длины n и заполним его единицами (пометим как невычеркнутые). Теперь будем последовательно просматривать элементы S[k], начиная с k = 2. Если S[k] = 1, то заполним нулями (вычеркнем или высеем) все последующие ячейки, номера которых кратны k. В результате получим массив, в котором ячейки содержат 1 тогда и только тогда, когда номер ячейки — простое число.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Реализация примет следующий вид:

Эффективность решета Эратосфена вызвана крайней простотой внутреннего цикла: он не содержит условных переходов, а также «тяжелых» операций вроде деления и умножения.

Оценим сложность алгоритма. Первое вычеркивание требует n/2 действий, второе — n/3, третье — n/5 и т. д. По формуле Мертенса

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

так что для решета Эратосфена потребуется O(n log log n) операций. Потребление памяти же составит O(n).

Оптимизация и параллелизация

Первую оптимизацию решета предложил сам Эратосфен: раз из всех четных чисел простым является только 2, то давайте сэкономим половину памяти и времени и будем выписывать и высеивать только нечетные числа. Реализация такой модификации алгоритма потребует лишь косметических изменений (код).

Наращивая шаг прогрессии и количество решет (например, при шаге прогрессии 210 нам понадобится 48 решет, что сэкономит еще 4% ресурсов) параллельно росту n, удается увеличить скорость алгоритма в log log n раз.

Сегментация

Не надо делать ситечки слишком маленькими, меньше тех же O(n ½-ε ) элементов. Так вы ничего не выиграете в асимптотике потребления памяти, но из-за накладных расходов начнете все сильнее терять в производительности.

Решето Эратосфена и однострочники

На Хабрахабре ранее публиковалась большая подборка алгоритмов Эратосфена в одну строчку на разных языках программирования (однострочники №10). Интересно, что все они на самом деле решетом Эратосфена не являются и реализуют намного более медленные алгоритмы.

Дело в том, что фильтрация множества по условию (например, на Ruby) или использование генераторных списков aka list comprehensions (например, на Haskell) вызывают как раз то, избежать чего призван алгоритм решета, а именно поэлементную проверку делимости. В результате сложность алгоритма возрастает по крайней мере до Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена(это число фильтраций), умноженного на Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена(минимальное число элементов фильтруемого множества), где Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена— число простых, не превосходящих n, т. е. до O(n 3/2-ε ) действий.

Однострочник на Scala ближе к алгоритму Эратосфена тем, что избегает проверки на делимость. Однако сложность построения разности множеств пропорциональна размеру большего из них, так что в результате получаются те же O(n 3/2-ε ) операций.

Вообще решето Эратосфена тяжело эффективно реализовать в рамках функциональной парадигмы неизменяемых переменных. В случае, если функциональный язык (например, OСaml) позволяет, стоит нарушить нормы и завести изменяемый массив. В [3] обсуждается, как грамотно реализовать решето Эратосфена на Haskell при помощи техники ленивых вычеркиваний.

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

Запишем алгоритм Эратосфена на PHP. Получится примерно следующее:

Для решения этих проблем достаточно выбрать более подходящий тип данных — строку!

Теперь каждый элемент занимает ровно 1 байт, а время работы уменьшилось примерно втрое. Скрипт для измерения скорости.

Решето Аткина

В 1999 году Аткин и Бернштейн предложили новый метод высеивания составных чисел, получивший название решета Аткина. Он основан на следующей теореме.

Из элементарной теории чисел следует, что все простые, большие 3, имеют вид 12k+1 (случай 1), 12k+5 (снова 1), 12k+7 (случай 2) или 12k+11 (случай 3).

Для инициализации алгоритма заполним решето S нулями. Теперь для каждой пары (x, y), где Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена, инкрементируем значения в ячейках S[4x 2 +y 2 ], S[3x 2 +y 2 ], а также, если x > y, то и в S[3x 2 −y 2 ]. В конце вычислений номера ячеек вида 6k±1, содержащие нечетные числа, — это или простые, или делятся на квадраты простых.

В качестве заключительного этапа пройдемся по предположительно простым номерам последовательно и вычеркнем кратные их квадратам.

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

Авторская, оптимизированная реализация на Си представлена в виде primegen, упрощенная версия — в Википедии. На Хабрахабре публиковалось решето Аткина на C#.

Как и в решете Эратосфена, при помощи wheel factorization и сегментации, можно снизить асимптотическую сложность в log log n раз, а потребление памяти — до O(n ½+o(1) ).

О логарифме логарифма

На самом деле множитель log log n растет крайне. медленно. Например, log log 10 10000 ≈ 10. Поэтому с практической точки зрения его можно полагать константой, а сложность алгоритма Эратосфена — линейной. Если только поиск простых не является ключевой функцией в вашем проекте, можно использовать базовый вариант решета Эратосфена (разве что сэкономьте на четных числах) и не комплексовать по этому поводу. Однако при поиске простых на больших интервалах (от 2 32 ) игра стоит свеч, оптимизации и решето Аткина могут ощутимо повысить производительность.

P. S. В комментариях напомнили про решето Сундарама. К сожалению, оно является лишь математической диковинкой и всегда уступает либо решетам Эратосфена и Аткина, либо проверке перебором делителей.

Источник

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

Содержание

Пример для n = 20

Запишем натуральные числа начиная от 2 до 20 в ряд:

Первое число в списке 2 — простое. Пройдём по ряду чисел, вычёркивая все числа кратные 2 (каждое второе, начиная с 2 2 = 4 ):

Следующее невычеркнутое число 3 — простое. Пройдём по ряду чисел, вычёркивая все числа кратные 3 (каждое третье, начиная с 3 2 = 9 ):

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Следующее невычеркнутое число 5 — простое. Пройдём по ряду чисел, вычёркивая все числа кратные 5 (каждое пятое, начиная с 5 2 = 25 ). И т. д.

См. также

Примеры реализации

Turbo Pascal

Полезное

Смотреть что такое «Эратосфена решето» в других словарях:

Эратосфена решето — метод в теории чисел, назван по имени Эратосфена, заключающийся в отсеивании (например, путём зачёркивания) тех целых чисел заданной последовательности а1, a2. aN (например, натурального ряда чисел), которые делятся хотя бы на одно из … Большая советская энциклопедия

ЭРАТОСФЕНА РЕШЕТО — метод, разработанный Эратосфеном (3 в. до н. э.) и позволяющий отсеивать составные числа из натурального ряда. Сущность Э. р. заключается в следующем. Зачеркивается единица. Число 2 простое. Зачеркиваются все натуральные числа, делящиеся на 2.… … Математическая энциклопедия

Решето Аткина — В математике решето Аткина быстрый современный алгоритм нахождения всех простых чисел до заданного целого числа N. Основная идея алгоритма состоит в использовании неприводимых квадратичных форм (представление чисел в виде ax²+by²).… … Википедия

Решето Эратосфена — алгоритм нахождения всех простых чисел до некоторого целого числа n, который приписывают древнегреческому математику Эратосфену Киренскому. Содержание 1 Алгоритм … Википедия

Решето Эратосфена — этим именем называют следующий способ получения ряда простых чисел. Из ряда чисел 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14. вычеркивают кратные двум; 4, 6, 8, 10, 12. кратные трем: 6, 9, 12, 15. кратные пяти: 10, 15, 20, 25, 30. … … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона

БРУНА РЕШЕТО — один из решета методов в элементарной теории чисел, созданный В. Вруном [1]; является развитием Эратосфена решета. Метод Б. р. заключается в следующем: из последовательности натуральных чисел высеиваются (выбрасываются) числа с малыми простыми… … Математическая энциклопедия

Список алгоритмов — Эта страница информационный список. Основная статья: Алгоритм Ниже приводится список алгоритмов, группированный по категориям. Более детальные сведения приводятся в списке структур данных и … Википедия

Программируемые алгоритмы — Служебный список статей, созданный для координации работ по развитию темы. Данное предупреждение не устанавл … Википедия

Тест Миллера (теория чисел) — У этого термина существуют и другие значения, см. Тест Миллера. Не следует путать с «Тестом Миллера Рабина» вероятностным полиномиальным тестом простоты. Тест Миллера детерминированный полиномиальный тест простоты. В 1976 году Миллер… … Википедия

Источник

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

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

Одним из способов нахождения простых чисел, является метод, который называется «Решето Эратосфена». Онлайн разложение числа на простые множители можно провести здесь. Чтобы узнать что такое простые числа, просто прочитай эту статью.

Число называется простым, если оно делится только на 1 и само себя

Вроде бы всё просто. но недостатком является то, что нет математической формулы, которое позволяет убедиться, является число простым или нет.

Представьте число 191 587.Не существует формулы, чтобы определить, является ли оно простым!

Для этого нужно определить, есть ли в нем делители и, следовательно, составные.

Легко проверить, имеют ли первые несколько простых чисел (2, 3, 5, 7, 11) делители, используя критерии делимости. Но это не так просто для больших чисел.

Идея состоит в том, чтобы найти в таблице числа, кратные простым числам и отбросить их как составные. Числа, которые остались, будут простыми числами.

Решето Эратосфена останавливается, когда квадрат числа, которое мы тестируем, больше, чем последнее число в сетке (в нашем случае 100).

Поскольку 11 в квадрате равно 121 и 121 > 100, когда мы доберемся до числа 11, мы можем перестать смотреть.
Простые числа от 1 до 100 с решетом Эратосфена.

Начнем с размещения чисел от 1 до 100 в таблице, подобной этой.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

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

Сначала выделяем единицу, которая не является простым числом.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Далее мы ищем числа, кратные 2 и зачеркиваем их (оставляя 2, так как мы знаем, что он имеет только делители 1 и 2 и, следовательно, является простым). Все зачеркнутые числа будут составными.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Для наглядности я буду зачеркнутые составные числа делать светлым цветом.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Теперь из оставшихся чисел мы ищем кратные 3 и зачеркиваем их (кроме 3, поскольку оно простое). Простой способ сделать это, считая по три.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Делаем числа, кратные трем, светлым цветом и оставшихся чисел станет еще меньше.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Зачеркнутые числа снова делаем светлым цветом.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Давайте перейдем к коэффициентам 7 (число 6 = 2 x 3, а значит оно составное и мы уже нашли кратные 2 и 3). Мы не зачеркиваем 7, так как это простое число. Кратных семи всего в таблице осталось 3 числа — это 49, 77 и 91. Зачеркиваем их.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

И опять же для наглядности изменяю цвет зачеркнутых чисел.

Что такое решето эратосфена. Смотреть фото Что такое решето эратосфена. Смотреть картинку Что такое решето эратосфена. Картинка про Что такое решето эратосфена. Фото Что такое решето эратосфена

Должны ли мы искать кратные 8, 9 и 10? Поскольку эти числа составные и кратны числам, которые мы уже искали, мы можем перейти к цифре 11. Мы уже установили, что остановимся на цифре 11, так что это означает, что мы закончили!

Список простых чисел от 1 до 100

Поэтому мы можем определить, что числа, которые мы не зачеркнули или которые синего и красного цветов, являются простыми числами. Итак, теперь у нас есть список простых чисел от 1 до 100:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 и 97.

Видите, как легко с помощью этого метода искать простые числа!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *