Дальнейшее ускорение ситового метода Эратосфена для поиска простых чисел - PullRequest
1 голос
/ 06 октября 2011

Я видел этот код c использования метода Эратосфена Sieve для поиска простых чисел, но я не могу расширить его до еще больших целых чисел (например, до 1000000000 и даже больше) из-за потребления памяти для выделения таких большой массив символов.

Какими будут стратегии расширения кода до больших чисел? Любые ссылки также приветствуются.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Стандартным улучшением, которое следует применить, будет обработка каждого i-го бита как числа 2*i+1, представляющего, таким образом, только шансы , сокращая размер массивав половине.Это также повлечет за собой, для каждого нового простого числа p, начиная разметку с p*p и увеличивая на 2*p, пропуск пропусков.2 сам по себе особый случай.См. Также этот вопрос с множеством ответов.

Другая стратегия заключается в переключении на сегментированное сито .Таким образом, вам нужно только около pi(sqrt(m)) = 2*sqrt(m)/log(m) памяти (m - ваш верхний предел), выделенной для начальной последовательности простых чисел, с которой вы бы просеивали меньший массив фиксированного размера, последовательно представляя сегменты чисел.Если вам нужны только простые числа в некотором узком дальнем диапазоне [m-d,m], вы сразу перейдете к просеиванию этого диапазона после того, как собраны все необходимые простые числа, как показано, например, в этого ответа .

Согласно вашим особенностям, чтобы получить простые числа до 10 ^ 9, работа с одним непрерывным массивом все еще возможна.Используя bitarray только для шансов , вам потребуется 10 ^ 9/16 байт, т.е. около 60 МБ памяти.Проще работать по сегментам;нам нужно только 3402 простых числа, ниже 31627, чтобы просеять каждый сегментный массив ниже 10 ^ 9.

0 голосов
/ 21 октября 2011

Вы можете использовать библиотеку gmp.См. Ускорение операций с битами / битами в Python? для быстрой реализации Sieve of Eratosthenes.Должно быть относительно легко перевести предоставленные решения на C.

0 голосов
/ 06 октября 2011

Именно из-за размера требуемого массива Сито Эратосфена в какой-то момент становится непрактичным. Модифицированное сито обычно используется для поиска больших простых чисел (как объяснено в Википедии ).

...