Сито Аткина

редактировать

В математике решето Аткина - это современный алгоритм для поиска всех простых чисел до указанного целого числа. По сравнению с древним решетом Эратосфена, размечавшим кратные числа простых чисел, решето Аткина выполняет некоторую предварительную работу, а затем размечает квадраты, кратные квадратам простых чисел, таким образом достигая лучшей теоретической асимптотической сложности. Создан в 2003 году А. О.Л. Аткин и Дэниел Дж. Бернштейн.

Содержание
  • 1 Алгоритм
  • 2 Псевдокод
  • 3 Пояснение
  • 4 Вычислительная сложность
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Алгоритм

В алгоритме:

  • Все остатки равны по модулю - шестьдесят остатков (разделите число на 60 и верните остаток).
  • Все числа, включая x и y, являются положительными целыми числами.
  • Переворачивание записи в сетчатом списке означает изменение маркировки (простая или непростая) на противоположную. 38>
  • Это приводит к тому, что числа с нечетным числом решений соответствующего уравнения являются потенциально простыми (простыми, если они также не содержат квадратов), а числа с четным числом решений являются составными.

Алгоритм:

  1. Создайте список результатов, заполненный цифрами 2, 3 и 5.
  2. Создайте сито-список с записью для каждого положительного целого числа; все записи в этом списке должны быть изначально помечены как непростые (составные).
  3. Для каждой записи номер n в сетчатом списке с остатком по модулю шестьдесят r:
    1. Если r равно 1, 13, 17, 29, 37, 41, 49 или 53, переверните запись для каждого возможного решения на 4x + y = n. Количество операций переворачивания как отношение к диапазону просеивания для этого шага приближается к 4√π / 15 × 8/60 (цифра «8» в дроби происходит от восьми модулей, обрабатываемых этой квадратичной величиной, и 60, поскольку Аткин рассчитал это на основе на четном числе колес по модулю 60), что дает дробную часть примерно 0,1117010721276....
    2. Если r равно 7, 19, 31 или 43, переверните запись для каждого возможного решения в 3x + у = п. Число операций переворачивания как отношение к диапазону просеивания для этого шага приближается к π√0,12 × 4/60 («4» в дроби происходит от четырех модулей, обрабатываемых этой квадратичной величиной, и 60, поскольку Аткин рассчитал это на основе четное число колес по модулю 60), что дает долю примерно 0,072551974569....
    3. Если r равно 11, 23, 47 или 59, переверните запись для каждого возможного решения на 3x - y = n, когда x>y. Число операций переворачивания как отношение к диапазону просеивания для этого шага приближается к √1,92ln (√0,5 + √1,5) × 4/60 («4» во дробной части происходит от четырех модулей, обрабатываемых этой квадратичной системой, и 60 потому что Аткин рассчитал это на основе четного числа колес по модулю 60), что дает долю примерно 0,060827679704....
    4. Если r - это что-то еще, полностью игнорируйте это.
  4. Начните с наименьшего число в списке сита.
  5. Возьмите следующий номер в списке сита, все еще помеченный простым.
  6. Включите номер в список результатов.
  7. Возведите число в квадрат и отметьте все кратные этому квадрату как непростые. Обратите внимание, что кратные, которые могут быть разложены на 2, 3 или 5, не нужно отмечать, так как они будут проигнорированы при окончательном перечислении простых чисел.
  8. Повторите шаги с четвертого по седьмой. Общее количество операций для этих повторений маркировки квадратов простых чисел как отношения диапазона просеивания представляет собой сумму, обратную квадратам простых чисел, что приближается к простой дзета-функции (2) 0,45224752004... минус 1/2, 1/3 и 1/5 для тех простых чисел, которые были удалены колесом, с результатом, умноженным на 16/60 для отношения ударов колесом за диапазон; это приводит к соотношению примерно 0,01363637571....

Сложив вышеуказанные отношения операций вместе, вышеупомянутый алгоритм принимает постоянное отношение операций переворачивания / маркировки к диапазону просеивания примерно 0,2587171021...; Исходя из фактической реализации алгоритма, коэффициент составляет около 0,25 для диапазонов просеивания до 67.

Псевдокод

Ниже приводится псевдокод, который объединяет алгоритмы Аткина 3.1, 3.2 и 3.3 с использованием объединенного набора «s» всех чисел по модулю 60, за исключением тех, которые кратны простым числам 2, 3 и 5, в соответствии с алгоритмами для простой версии алгоритма , который поддерживает дополнительную битовую упаковку колеса; хотя конкретно не упоминается в упомянутой статье, этот псевдокод устраняет некоторые очевидные комбинации нечетных / четных x / y, чтобы сократить вычисления, когда эти вычисления никогда не пройдут тесты по модулю (т.е. будут давать четные числа или кратные 3 или 5):

limit ← 1000000000 // произвольный предел поиска // набор позиций "попадания" колеса для колеса 2/3/5, прокрученного дважды согласно алгоритму Аткина s ← {1,7,11,13,17, 19,23,29,31,37,41,43,47,49,53,59} // Инициализируем сито с достаточным количеством колес, чтобы включить предел: для n ← 60 × w + x, где w ∈ {0,1,..., limit ÷ 60}, x ∈ s: is_prime (n) ← false // Вставьте простые числа-кандидаты: // целые числа, которые имеют нечетное количество // представлений определенными квадратичными формами. // Шаг алгоритма 3.1: для n ≤ limit, n ← 4x² + y², где x ∈ {1,2,...} и y ∈ {1,3,...} // все x нечетные y, если n mod 60 ∈ {1,13,17,29,37,41,49,53}: is_prime (n) ← ¬is_prime (n) // переключить состояние // Шаг алгоритма 3.2: для n ≤ limit, n ← 3x² + y², где x ∈ {1,3,...} и y ∈ {2,4,...} // только нечетные x, если n mod 60 ∈ {7,19,31,43}: // и даже y is_prime ( n) ← ¬is_prime (n) // переключить состояние // Шаг алгоритма 3.3: для n ≤ limit, n ← 3x²-y², где x ∈ {2,3,...} и y ∈ {x-1, x- 3,..., 1} // все четные / нечетные, если n mod 60 ∈ {11,23,47,59}: // нечетные / четные комбинации is_prime (n) ← ¬is_prime (n) // переключить состояние / / Удалите композиты путем просеивания, только для тех вхождений на колесе: для n² ≤ limit, n ← 60 × w + x, где w ∈ {0,1,...}, x ∈ s, n ≥ 7: if is_prime ( n): // n простое число, не кратные его квадрату; // этого достаточно, потому что композиты без квадратов не могут попасть в этот список при c ≤ limit, c ← n² × (60 × w + x), где w ∈ {0,1,...}, x ∈ s: is_prime (c) ← false // одна обработка для получения последовательного списка простых чисел до предела: вывод 2, 3, 5 для 7 ≤ n ≤ limit, n ← 60 × w + x, где w ∈ {0,1,...}, x ∈ s: if is_prime (n): output n

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

Пояснение

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

Все числа n с остатком по модулю шестьдесят 1, 13, 17, 29, 37, 41, 49 или 53 имеют остаток по модулю четыре от 1. Эти числа являются простыми тогда и только тогда, когда число решений 4x + y = n нечетное, а число бесквадратное (доказано как теорема 6.1 из).

Все числа n с остатком по модулю шестьдесят 7, 19, 31 или 43 имеют остаток по модулю шесть, равный 1. Эти числа являются простыми тогда и только тогда, когда количество решений 3x + y = n равно нечетное и число бесквадратное (доказано как теорема 6.2 из).

Все числа n с остатком по модулю шестьдесят 11, 23, 47 или 59 имеют остаток по модулю двенадцать от 11. Эти числа являются простыми тогда и только тогда, когда количество решений 3x - y = n равно нечетное и число бесквадратное (доказано как теорема 6.3 из).

Ни одно из потенциальных простых чисел не делится на 2, 3 или 5, поэтому они не могут делиться на свои квадраты. Вот почему бесквадратные проверки не включают 2, 3 и 5.

Вычислительная сложность

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

Сегментированная версия страницы, реализованная авторами, имеет те же операции O (N), но снижает требования к памяти до уровня, необходимого для базовых простых чисел ниже квадратного корня из диапазона O (N / log N) бит памяти плюс минимальный буфер страницы. Это немного лучшая производительность при тех же требованиях к памяти, что и у сегментированного страницы сита Эратосфена, которое использует O (N log log N) операций и те же O (N / log N) бит памяти плюс минимальную страницу буфер. Однако такое сито не превосходит сито Эратосфена с максимальной практичной факторизацией колеса (комбинация просеивающего колеса 2/3/5/7 и предварительной отбраковки композитов в буферах страниц сегмента с использованием 2/3/5/7 / 11/13/17/19), который, хотя и имеет немного больше операций, чем Сито Аткина для очень больших, но практичных диапазонов, имеет постоянный коэффициент меньшей сложности на операцию примерно в три раза при сравнении времени на операцию между алгоритмы, реализованные Бернштейном в тактовых циклах ЦП на операцию. Основная проблема со страничным сегментированным решетом Аткина - сложность реализации последовательностей отбраковки «без простых квадратов» из-за того, что интервал между отсеиваниями быстро растет далеко за пределы диапазона буфера страницы; время, затрачиваемое на эту операцию в реализации Бернштейна, быстро увеличивается во много раз по сравнению со временем, затрачиваемым на фактические вычисления квадратного уравнения, а это означает, что линейная сложность той части, которая в противном случае была бы совершенно незначительной, становится основным потребителем времени выполнения. Таким образом, даже несмотря на то, что оптимизированная реализация может снова достичь временной сложности O (n), этот постоянный коэффициент увеличения времени на одну операцию означает, что сито Аткина работает медленнее.

Специальная модифицированная вариация «перечисления точек решетки», которая не является приведенной выше версией Решета Аткина, теоретически может вычислять простые числа до N, используя O (N / log log N) операций с N бит памяти, но этот вариант реализуется редко. Это немного лучше по производительности при очень высоких затратах памяти по сравнению как с обычной страничной сегментированной версией, так и с эквивалентной, но редко реализуемой версией сита Эратосфена, которая использует O (N) операций и O (N (log log N) / log N) бит памяти.

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

См. Также
Ссылки
  1. ^ A.O.L. Аткин, Д.Дж. Бернштейн, Первичные сита с использованием двоичных квадратичных форм, Math. Комп. 73 (2004), 1023-1030. [1]
  2. ^Причард, Пол, «Линейные сита для простых чисел: генеалогическое древо», Sci. Comput. Программирование 9 : 1 (1987), стр. 17–35.
  3. ^Пол Притчард, Сублинейное аддитивное решето для нахождения простых чисел, Сообщения ACM 24 (1981), 18–23. MR 600730
  4. ^Пол Причард, Объяснение колесного сита, Acta Informatica 17 (1982), 477–485. MR 685983
  5. ^Пол Притчард, Быстрые компактные сита для простых чисел (среди прочих), Журнал алгоритмов 4 (1983), 332–344. MR 729229
Внешние ссылки
Последняя правка сделана 2021-06-08 08:23:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте