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

редактировать
Древний алгоритм для генерации простых чисел Решето Эратосфена: шаги алгоритма для простых чисел меньше 121 (включая оптимизацию начала с простых чисел

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

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

Самое раннее известное упоминание сита (Древнегреческий : κόσκινον Ἐρατοσθένους, kóskinon Eratosthénous) находится в Никомахе Герасинском Введение в арифметику, в котором это описывается и приписывается Эратосфену Киренскому, Греческий математик.

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

Содержание
  • 1 Обзор
    • 1.1 Пример
  • 2 Алгоритм и варианты
    • 2.1 Псевдокод
    • 2.2 Сегментированное решето
    • 2.3 Инкрементальное решето
  • 3 Вычислительный анализ
  • 4 Алгоритмическая сложность
  • 5 Решето Эйлера
  • 6 См. также
  • 7 Ссылки
  • 8 Внешние ссылки
Обзор
Рассеиваем двойки и просеиваем тройки,. Решето Эратосфена.. Когда кратные возвышаются,. Остающиеся числа являются простыми.

Анонимное

A простое число - это натуральное число, которое имеет ровно два различных натуральных числа делителей : число 1 и само себя.

Чтобы найти все простые числа, меньшие или равные заданному целому числу n методом Эратосфена:

  1. Создайте список последовательных целых чисел от 2 до n: (2, 3, 4,..., n).
  2. Изначально пусть p равно 2, наименьшему простому числу.
  3. Перечислить кратные p, считая с шагом p от 2p до n, и отметить их в списке (это будут 2p, 3p, 4p,...; сам p не должен быть отмечен).
  4. Найдите наименьшее число в списке больше p, которое не отмечено. Если такого числа не было, остановись. В противном случае позвольте p теперь равняться этому новому числу (которое является следующим простым числом) и повторите, начиная с шага 3.
  5. Когда алгоритм завершается, все числа, не отмеченные в списке, становятся простыми числами ниже n.

Основная идея здесь в том, что каждое значение, присвоенное p, будет простым, потому что, если бы оно было составным, оно было бы помечено как кратное некоторому другому, меньшему простому числу. Обратите внимание, что некоторые числа могут быть отмечены более одного раза (например, 15 будет помечено как для 3, так и для 5).

В качестве уточнения достаточно отметить числа на шаге 3, начиная с p, так как все меньшие, кратные p, уже будут отмечены в этой точке. Это означает, что алгоритму разрешено завершиться на шаге 4, когда p больше n.

Еще одно усовершенствование состоит в том, чтобы сначала перечислить только нечетные числа (3, 5,..., n) и считать в приращения 2p от p на шаге 3, таким образом отмечая только нечетные кратные p. Это действительно присутствует в исходном алгоритме. Это можно обобщить с помощью факторизации колеса, формируя начальный список только из чисел , взаимно простых с первыми несколькими простыми числами, а не только из шансов (т. Е. Чисел, взаимно простых с 2), и считая соответствующим образом скорректированные приращения, так что генерируются только такие кратные p, которые в первую очередь взаимно просты с этими маленькими простыми числами.

Пример

Чтобы найти все простые числа, меньшие или равные 30 действуйте следующим образом.

Сначала сгенерируйте список целых чисел от 2 до 30:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Первое число в списке - 2; зачеркните каждое второе число в списке после 2, считая от 2 с шагом 2 (это будут все числа, кратные 2 в списке):

2 3 45 67 89 1011 1213 1415 1617 1819 2021 2223 2425 2627 2829 30

Следующее число в списке после 2 - 3; зачеркните каждое третье число в списке после 3, считая от 3 с шагом 3 (это будут все числа, кратные 3 в списке):

2 3 45 67 891011 1213 14151617 1819 20212223 2425 26272829 30

Следующее число, еще не зачеркнутое в списке после 3, равно 5; вычеркните каждое 5-е число в списке после 5, считая от 5 с шагом 5 (т.е. все числа, кратные 5):

2 3 45 67 891011 1213 14151617 1819 20212223 242526272829 30

Следующее число, еще не зачеркнутое в списке после 5, - 7; следующим шагом будет вычеркнуть каждое седьмое число в списке после 7, но все они уже вычеркнуты на этом этапе, поскольку эти числа (14, 21, 28) также кратны меньшим простым числам, потому что 7 × 7 больше чем 30. Номера, не зачеркнутые в этом месте в списке, представляют собой все простые числа ниже 30:

2 3 5 7 11 13 17 19 23 29
Алгоритм и варианты

Псевдокод

Решето Эратосфена может быть выражено в псевдокоде следующим образом:

алгоритм Сито Эратосфена isвход : целое число n>1. вывод : все простые числа от 2 до n. пусть A будет массивом Boolean значений, проиндексированных целым числом s от 2 до n, изначально все установлены на истина . для i = 2, 3, 4,..., не более √n doifA [i] isистиннодля j = i, i + i, i + 2i, i + 3i,..., не более n do A [j]: = falseвернуть все i такие, что A [ i] istrue .

Этот алгоритм производит все простые числа не больше n. Он включает в себя общую оптимизацию, которая заключается в том, чтобы начать перечисление кратных каждого простого числа i от i. Временная сложность этого алгоритма составляет O (n log log n), при условии, что обновление массива является операцией O (1), как это обычно бывает.

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

Как отмечает Соренсон, проблема с ситом Эратосфена не в количестве выполняемых им операций, а скорее в его потребностях в памяти. При большом n диапазон простых чисел может не умещаться в памяти; хуже того, даже для умеренного n, его cache использование крайне неоптимально. Алгоритм проходит по всему массиву A, почти не демонстрируя локальности ссылки.

. Решение этих проблем предлагают сегментированные сита, в которых за раз просеиваются только части диапазона. Они известны с 1970-х годов и работают следующим образом:

  1. Разделите диапазон от 2 до n на сегменты некоторого размера Δ ≤ √n.
  2. Найдите простые числа в первом (то есть самом нижнем) сегменте, используя обычное сито.
  3. Для каждого из следующих сегментов в порядке возрастания, где m является самым верхним значением сегмента, найдите в нем простые числа следующим образом:
    1. Установите логический массив размера Δ, и
    2. Отметить как непростые позиции в массиве, соответствующие кратным числам каждого простого числа p ≤ √m, найденного до сих пор, путем вычисления наименьшего кратного числа p между m - Δ и m, и перечисление его кратных с шагом p, как обычно. Остальные позиции соответствуют простым числам в сегменте, поскольку квадрат простого числа в сегменте не находится в сегменте (при k ≥ 1, (k Δ + 1) 2>(k + 1) Δ {\ displaystyle (k \ Delta +1) ^ {2}>(k + 1) \ Delta}{\displaystyle (k\Delta +1)^{2}>(k + 1) \ Delta} ).

Если Δ выбрано равным √n, пространственная сложность алгоритма будет O (√n), а временная сложность такая же, как у обычного сита.

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

Инкрементное сито

Инкрементальная формулировка сита генерирует простые числа на неопределенный срок (т. е. без верхней границы) путем чередования генерации простых чисел с генерацией их кратных (так что pr imes можно найти в промежутках между кратными), где кратные каждого простого числа p генерируются непосредственно путем отсчета от квадрата простого числа с приращениями p (или 2p для нечетных простых чисел). Генерация должна запускаться только при достижении основного квадрата, чтобы избежать отрицательного воздействия на эффективность. Это может быть выражено символически в парадигме потока данных как

primes = [2, 3,...] \ [[p², p² + p,...] для p в простых числах ],

с использованием представления списка нотации с \, обозначающей вычитание множества из арифметических последовательностей чисел.

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

При проверке каждого простого числа алгоритм оптимального пробного деления использует все простые числа, не превышающие его квадратный корень, тогда как сито Эратосфена производит каждую композицию только из ее простых множителей и получает простые числа «бесплатно» между композициями. Широко известный код 1975 функционального сита, созданный Дэвидом Тернером, часто представляется как пример сита Эратосфена, но на самом деле он является субоптимальным ситом пробного деления.

Вычислительный анализ

Работа, выполняемая этим алгоритмом, почти полностью состоит из операций по выбору представлений составных чисел, которые для базовой неоптимизированной версии представляют собой сумму диапазона, деленного на каждое из простых чисел до этого диапазона или

n ∑ p ≤ n 1 p, {\ displaystyle n \ sum _ {p \ leq n} {\ frac {1} {p}},}{\ displaystyle n \ sum _ {p \ leq n} {\ frac {1} {p}},}

где n - диапазон просеивания в этом и во всех последующих анализ.

Путем перестановки второй теоремы Мертенса это равно n (log log n + M), когда n приближается к бесконечности, где M - константа Мейсселя – Мертенса примерно 0,26149...

Оптимизация, начинающаяся с квадрата каждого простого числа и отбраковка только для простых чисел, меньших квадратного корня, изменяет "n" в приведенном выше выражении на √n (или n), а не отсев до тех пор, пока квадрат не будет означать, что сумма базовых простых чисел за вычетом двух вычитается из операций. Поскольку сумма первых x простых чисел равна 1 / 2x log x, а теорема о простых числах говорит, что x приблизительно равно x / log x, тогда сумма простых чисел до n равна n / 2 log n, и поэтому сумма базовых простых чисел для √n равна 1 / log n, выраженная как коэффициент n. Дополнительное смещение в два на базовое простое число равно 2π (√n), где π - функция подсчета простых чисел в данном случае, или 4√n / log n; выражая это как множитель n, как и другие члены, это 4 / √n log n. Объединив все это, выражение для количества оптимизированных операций без факторизации колеса:

журнал ⁡ журнал ⁡ n - 1 журнал ⁡ n (1-4 n) + M - журнал ⁡ 2. {\ displaystyle \ log \ log n - {\ frac {1} {\ log n}} \ left (1 - {\ frac {4} {\ sqrt {n}}} \ right) + M- \ log 2.}{\ displaystyle \ log \ log n - {\ frac {1} {\ log n}} \ left (1 - {\ frac {4} {\ sqrt {n}}} \ right) + M- \ log 2.}

Для колеса случаев факторизации, есть дальнейшее смещение невыполненных операций

∑ p ≤ x 1 p {\ displaystyle \ sum _ {p \ leq x} {\ frac {1} {p}}}\ sum _ {p \ leq x} {\ frac {1} {p}}

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

∏ p ≤ xp {\ displaystyle \ prod _ {p \ leq x} p}\ prod _ {p \ leq x} p

, и легко определить, что этот коэффициент колеса равен

∏ p ≤ xp - 1 p { \ displaystyle \ prod _ {p \ leq x} {\ frac {p-1} {p}}}\ prod _ {p \ leq x} {\ frac {p-1} {p}}

, поскольку p - 1 / p - это доля оставшихся кандидатов на высшее простое число колеса, x, и каждого последующего меньшее простое число оставляет соответствующую ему дробь предыдущей объединенной дроби.

Объединяя весь вышеприведенный анализ, общее количество операций для диапазона просеивания до n, включая факторизацию колеса для простых чисел до x, составляет приблизительно

∏ p ≤ xp - 1 p (log ⁡ log ⁡ n - 1 журнал ⁡ N (1-4 n) + M - журнал ⁡ 2 - ∑ p ≤ x 1 p) {\ displaystyle \ prod _ {p \ leq x} {\ frac {p-1} {p}} \ left (\ log \ log n - {\ frac {1} {\ log n}} \ left (1 - {\ frac {4} {\ sqrt {n}}} \ right) + M- \ log 2- \ sum _ {p \ leq x} {\ frac {1} {p}} \ right)}{\ displaystyle \ prod _ {p \ leq x} {\ frac {p-1} {p}} \ left (\ log \ log n - {\ frac {1} {\ log n}} \ left (1 - {\ frac {4} {\ sqrt {n}}} \ right) + M- \ log 2- \ сумма _ {p \ leq x} {\ frac {1} {p}} \ right)} .

Чтобы показать, что приведенное выше выражение является хорошим приближением к количеству операций выборки составных чисел, выполняемых алгоритмом, следуя представляет собой таблицу, показывающую фактически измеренное количество операций для практической реализации сита Эратосфена по сравнению с количеством операций, предсказанных из приведенного выше выражения, причем оба значения выражены в виде доли диапазона (с округлением до четырех знаков после запятой) для различных сит диапазоны и факторизации колес (обратите внимание, что последний столбец - это максимальное практическое колесо в отношении размера колесных зазоров Таблица поиска - почти 10 миллионов значений):

nбез колесашансы2/3/5 колеса2/3/5/7 колеса2/3/5/7/11/13/17/19 колесо
101.40901,37450,45100,43720,10000,09090,05800,04530,0060
101,69621,68440,59720,59220,17640,17360,11760,11610,04730,0391
101,92991,92610,71480,71300,23880,23810,17190,17140,07990,0805
102,12182,12200,81090,81100,29020,29030,21610,21620,11340,1140
102,28502,28630,89250,89320,33370,33410,25340,25380,14190,1421
102,42572,42760,96280,96380,37130,37180,28560,28600,16600,1662

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

Алгоритмическая сложность

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

битовая сложность алгоритма составляет O (n (log n) (log log n)) битовые операции с требованиями к памяти of O (n).

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

Особо редко, если когда-либо, реализуемая сегментированная версия сито Эратосфена с базовой оптимизацией использует O (n) операций и O (√nlog log n / log n)бит памяти.

Чтобы показать, что приведенное выше приближение по сложности не очень точная даже для практически такого большого диапазона, ниже приводится таблица расчетного количества операций как доли диапазона, округленного до четырех разрядов, расчетное соотношение для коэффициента десяти чан ge в диапазоне, основанном на этой оценке, и коэффициент, основанный на оценке log log n для различных диапазонов и факторизации колес (в столбце combo используется часто используемый на практике предварительный выбор путем максимальной факторизации колеса, но только 2/3/5 / 7 для коэффициента колеса, так как полную факторизацию сложно эффективно реализовать для сегментации страниц):

nбез колесашансы2/3/5 колесаКолесо 2/3/5/7колесо комбоКолесо 2/3/5/7/11/13/17/19
102.1221.1021.0750.8111.1371.0750.29031.221.0750,21621,2611,0750,15241,4161,0750,1141.4161.075
102.28631.0771.0590.89321.1011.0590.33411.1511.0590,25371.1741.0590,18991,2461,0590,14211,2461. 059
102.42761.0621.0480.96381.0791.0480.37181.1131.0480.2861.1271.0480,22221,171.0480.16621.171.048
102.55141.0511.041.02571.0641.040.40481.0891.040,31431.0991.040.25051.1271.040.18741.1271.04
102.66151.0431.0351.08081.0541.0350.43421.0731.0350.33951.081.0350.27571.1011.0350.20631.1011.035
102.76081.0371.031.13041.0461.030.46071.0611.030.36221.0671.030.29841.0821.030,22321.0821.03
102.85111.0331.0271.17551.041.0270.48471.0521.0270.38281.0571.0270,3191.0691.0270.23871.0691.027
102.93391.0291.0241.2171.0351.0240.50681.0461.0240.40181.0491.0240.33791.0591.0240,25281.0591.024
103.01041.0261.0221.25521.0311.0220,52721,041,0220,41931.0441,0220,35541.0521.0220.26591.0521.022
103.08151.0241.021.29071.0281.020.54621.0361.020,43551.0391.020.37171.04 61.020.27811.0461.02
103.14781.0221.0181.32391.0261.0180.56391.0321.0180.45071.0351.0180.38681.0411.0180.28941.0411.018

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

Следует также отметить, что при использовании вычисленных соотношений операций к диапазону сит оно должно быть меньше примерно 0,2587, чтобы быть быстрее, чем часто сравниваемое сито Аткина, если операции занимает примерно одинаковое время в тактовых циклах ЦП, что является разумным предположением для алгоритма одного огромного битового массива. Используя это предположение, сито Аткина работает быстрее, чем сито Эратосфена с максимальным разложением по колесу только для диапазонов более 10, и в этот момент огромному буферному массиву сита потребуется около четверти терабайта (около 250 гигабайт) оперативной памяти, даже если использовались насадки бит. Анализ сегментированных версий страниц покажет, что предположение о том, что время одной операции остается неизменным между двумя алгоритмами, не выполняется для сегментации страниц и что сито операций Аткина становится медленнее, чем сито Эратосфена, с увеличением диапазона. Таким образом, с практической точки зрения, сито Эратосфена с максимальным разложением колес быстрее, чем сито Аткина, хотя сито Аткина быстрее при меньшем количестве факторизации колес.

Использование большой нотации O также не является правильным способом для сравнения практических характеристик четных вариаций Сита Эратосфена, поскольку оно игнорирует постоянные коэффициенты и смещения, которые могут быть очень важны для практических диапазонов: Вариант сита Эратосфена, известный как сито с колесом Притчарда, имеет производительность O (n), но его базовая реализация требует либо алгоритма «один большой массив», который ограничивает его полезный диапазон объемом доступной памяти, иначе он должен быть сегментирован по страницам для уменьшения использования памяти. При реализации с сегментацией страниц для экономии памяти базовый алгоритм по-прежнему требует около O (n / log n)бит памяти (намного больше, чем требуется для базового сегментированного сита Эратосфена с использованием O (√n / log n)бит памяти). Работа Притчарда снизила требования к памяти до предела, как описано выше в таблице, но стоимость является довольно большим постоянным коэффициентом от трех до трех четвертей диапазона сита из-за сложных вычислений, необходимых для этого. Как видно из приведенной выше таблицы для базового сита Эратосфена, даже несмотря на то, что результирующее колесное сито имеет производительность O (n) и приемлемые требования к памяти, оно никогда не будет быстрее, чем базовое сито Эратосфена с разумной факторизацией колес для любого практического применения. диапазон просеивания примерно в два раза. Помимо этого, его довольно сложно реализовать, он редко реализуется на практике, потому что он все еще использует больше памяти, чем базовые реализации решета Эратосфена, описанные здесь, а также медленнее для практических диапазонов. Таким образом, это скорее интеллектуальное любопытство, чем что-то практическое.

Решето Эйлера

Доказательство Эйлера формулы дзета-произведения содержит вариант решета Эратосфена, в котором каждое составное число удаляется ровно один раз. То же самое сито было обнаружено заново и наблюдалось линейное время Gries Misra (1978). Он также начинается со списка чисел от 2 до n по порядку. На каждом шаге первый элемент идентифицируется как следующее простое число, и результаты умножения этого простого числа на каждый элемент списка отмечаются в списке для последующего удаления. Затем начальный элемент и отмеченные элементы удаляются из рабочей последовательности, и процесс повторяется:

[2] (3) 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79... [3] (5) 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55 59 61 65 67 71 73 77 79... [4] (7) 11 13 17 19 23 29 31 37 41 43 47 49 53 59 61 67 71 73 77 79... [5] (11) 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79... [...]

Здесь показан пример, начиная с разницы, после первого шага алгоритма. Таким образом, на k-м шаге все оставшиеся кратные k-го простого числа удаляются из списка, который после этого будет содержать только числа, взаимно простые с первыми k простыми числами (см. разложение колеса ), так что список будет начните со следующего простого числа, и все числа в нем ниже квадрата его первого элемента также будут простыми.

Таким образом, при генерации ограниченной последовательности простых чисел, когда следующее идентифицированное простое число превышает квадратный корень из верхнего предела, все оставшиеся числа в списке являются простыми. В приведенном выше примере это достигается при идентификации 11 в качестве следующего простого числа, что дает список всех простых чисел, меньших или равных 80.

Обратите внимание, что числа, которые будут отброшены на шаге, все еще используются при маркировке кратные на этом шаге, например, для кратных 3 это 3 × 3 = 9, 3 × 5 = 15, 3 × 7 = 21, 3 × 9 = 27,..., 3 × 15 = 45,..., поэтому с этим нужно проявлять осторожность.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-08 08:23:03
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте