Подтвердить что ты не робот

Лучшее параллельное сито с простыми числами

Посмотрев на ситовый код с простыми числами и посмотрев, как Совместная структура работает, я нашел ее чрезвычайно элегантной. Однако он также крайне неэффективен, и IIRC, что эквивалентно O (n ^ 2), проверяющая делимость числа m на деля его на каждое число меньше, чем m. Я полагаю, что я мог бы вместо этого измените его, чтобы использовать операцию O (n ^ 1.5) проверки делимости of m, разделив его на каждое число, меньшее или равное sqrt (m). Однако это оказалось намного сложнее, чем я ожидал.

Я знаю, что это скорее вопрос алгоритмики, но он также один чрезвычайно важна для concurrency. Как реализовать O (n ^ 1.5) версия алгоритма?

4b9b3361

Ответ 2

Элегантные, но неэффективные простые ситовые реализации уже хорошо известны сообществу функционального программирования. Этот paper от Melissa ONeill дает хороший обзор ленивых "потоковых" основных сит, а также представляет эффективные альтернативы. (Он использует Haskell, но должен хорошо читать)

Ответ 3

Решетка Eratosthenes идентифицирует простой p_i на итерации я и вырезает все кратные p_i из рассмотрения в последовательных итерациях. Учитывая, что единственное, что вы можете здесь рассчитать, - это операция обрезки. Это может быть вызвано только постоянным фактором, поэтому вы не сможете изменить алгоритм большого числа O этого алгоритма.