Введение

Алгоритмы для генерации простых чисел

В вычислительной теории чисел существует множество алгоритмов, позволяющих эффективно генерировать простые числа. Они используются в различных приложениях, например, в хешировании, криптографии с открытым ключом и поиске простых множителей в больших числах. Для относительно небольших чисел можно просто применять метод последовательного деления к каждому нечетному числу. Решета для поиска простых чисел почти всегда работают быстрее. Решетование простых чисел – самый быстрый известный способ детерминированного перечисления простых чисел. Существуют известные формулы, позволяющие вычислить следующее простое число, но нет известного способа выразить следующее простое число через предыдущие простые числа. Также не существует эффективного известного общего метода манипулирования и/или расширения какого-либо математического выражения (даже включающего последующие простые числа), которое детерминированно вычисляло бы следующее простое число.

Первичные сита

Сито простых чисел — это быстрый тип алгоритма для нахождения простых чисел. Существует множество сит простых чисел. Наиболее распространены сито Эратосфена (ок. 250 г. до н.э.), сито Сундарама (1934), ещё более быстрое, но более сложное сито Аткина (2003) и различные кольцевые сита. Сито работает путём создания списка всех целых чисел до заданного предела и последовательного исключения составных чисел (которые оно непосредственно генерирует), пока не останутся только простые числа. Это наиболее эффективный способ получения большого количества простых чисел; однако, для поиска отдельных простых чисел, прямые тесты на простоту более эффективны. Кроме того, на основе принципов работы сит строятся некоторые целочисленные последовательности, которые также могут быть использованы для генерации простых чисел в определённых интервалах.

Большие простые числа

Для больших простых чисел, используемых в криптографии, доказуемые простые числа могут быть сгенерированы на основе вариантов теста простоты Поклинтона, а вероятные простые числа – с помощью вероятностных тестов простоты, таких как тест Baillie–PSW или тест Миллера – Рабина. И доказуемые, и вероятные тесты простоты основаны на возведении в степень по модулю. Для дальнейшего снижения вычислительных затрат целые числа сначала проверяются на наличие малых простых делителей с использованием сит, подобных решету Эратосфена, или непосредственного перебора делителей. Целые числа специальных форм, такие как числа Мерсенна или числа Ферма, могут быть эффективно проверены на простоту, если известно простое разложение чисел p − 1 или p + 1.

Сложность

Сито Эратосфена обычно считается самым простым в реализации, но не самым быстрым с точки зрения количества операций для заданного диапазона при больших диапазонах просеивания. В своей обычной стандартной реализации (которая может включать базовую факторизацию колесом для малых простых чисел), оно может найти все простые числа до N за время , в то время как базовые реализации сита Аткина и колесных сит работают за линейное время. Специальные версии сита Эратосфена, использующие принципы сита колес, могут иметь ту же линейную временную сложность. Особая версия сита Аткина и некоторые специальные версии колесных сит, которые могут включать просеивание с использованием методов из сита Эратосфена, могут работать с сублинейной временной сложностью. Следует отметить, что уменьшение асимптотической временной сложности алгоритма не означает, что его практическая реализация будет быстрее, чем алгоритма с большей асимптотической сложностью: если для достижения меньшей асимптотической сложности отдельные операции имеют постоянный фактор увеличения времени, который может быть во много раз больше, чем для более простого алгоритма, то в пределах практических диапазонов просеивания преимущество уменьшенного числа операций для разумно больших диапазонов может никогда не компенсировать эту дополнительную стоимость времени на операцию. Некоторые алгоритмы просеивания, такие как сито Эратосфена с большим количеством факторизации колесом, занимают гораздо меньше времени для меньших диапазонов, чем указывает их асимптотическая временная сложность, поскольку они имеют большие отрицательные постоянные смещения в своей сложности и, следовательно, не достигают этой асимптотической сложности до тех пор, пока не выйдут за пределы практических диапазонов. Например, сито Эратосфена с комбинацией факторизации колесом и предварительной отсеивания с использованием малых простых чисел до 19 использует время примерно в два раза меньше, чем предсказывается для общего диапазона для диапазона 1019, просеивание которого для лучшего из алгоритмов просеивания занимает сотни процессорных лет. Простые наивные сита типа "один большой массив" любого из этих типов сит занимают объем памяти около , что означает, что 1) они сильно ограничены в диапазонах просеивания, которые они могут обрабатывать, объемом доступной оперативной памяти (памяти), и 2) они обычно довольно медленны, поскольку скорость доступа к памяти обычно становится узким местом, ограничивающим скорость больше, чем вычислительная скорость, как только размер массива превышает размер кэша процессора. Обычно реализуемые сегментированные по страницам сита Эратосфена и Аткина занимают объем памяти плюс небольшие буферы сегментов сита, которые обычно имеют размер, достаточный для размещения в кэше процессора; сегментированные по страницам колесные сита, включая специальные вариации сита Эратосфена, обычно занимают гораздо больше места, чем это, на значительный фактор, чтобы хранить необходимые представления колеса; вариация Притчарда сита линейной временной сложности Эратосфена/колесного сита занимает объем памяти . Улучшенная по времени специальная версия сита Аткина занимает объем памяти. Соренсон показывает улучшение колесного сита, которое занимает еще меньше места – для любого . Однако, следует общее наблюдение: чем больше уменьшается объем памяти, тем больше постоянный фактор увеличения стоимости времени на операцию, даже если асимптотическая временная сложность может оставаться прежней, что означает, что версии с уменьшенным объемом памяти могут работать во много раз медленнее, чем версии без уменьшения памяти, на довольно большой фактор.