В алгоритме пробного деления большая часть работы, которая может потребоваться для определения того, является ли число n
простым, - это проверка делимости на простые числа примерно до sqrt(n)
.
Этот наихудший случай встречается, когда n
- простое число или произведение двух простых чисел почти одинакового размера (включая квадраты простых чисел). Если n
имеет более двух простых факторов или два простых фактора очень разных размеров, то по крайней мере один из них намного меньше, чем sqrt(n)
, поэтому даже накопленная работа, необходимая для всех этих чисел (которые составляют подавляющее большинство все числа до N
, для достаточно больших N
) относительно незначительны, я буду игнорировать это и работать с фикцией, что составные числа определяются без какой-либо работы (произведений двух приблизительно равных простых чисел немного, поэтому, хотя по отдельности они стоят столько же, сколько простое число одинакового размера, в целом это незначительный объем работы).
Итак, сколько работы занимает тестирование простых чисел до N
?
По теореме о простых числах число простых чисел <= n
равно (для достаточно большого n
) примерно n/log n
(это n/log n + lower order terms
). И наоборот, это означает, что k -ое простое число (для k не слишком мало) около k*log k
(+ члены более низкого порядка).
Следовательно, тестирование k -ого простого числа требует пробного деления на pi(sqrt(p_k))
, приблизительно 2*sqrt(k/log k)
, простых чисел. Суммируя, что для k <= pi(N) ~ N/log N
получается примерно 4/3*N^(3/2)/(log N)^2
делений. Таким образом, игнорируя композиты, мы обнаружили, что нахождение простых чисел до N
путем пробного деления (с использованием только простых чисел) составляет Omega(N^1.5 / (log N)^2)
. Более тщательный анализ композитов показывает, что это Theta(N^1.5 / (log N)^2)
. Использование колеса уменьшает постоянные факторы, но не меняет сложность.
В сите, с другой стороны, каждый композит вычеркивается как кратное по крайней мере одно простое число. В зависимости от того, начнете ли вы вычеркивание в 2*p
или в p*p
, составное число вычеркивается столько раз, сколько у него есть отдельные простые факторы или различные простые факторы <= sqrt(n)
. Поскольку любое число имеет не более одного простого множителя, превышающего sqrt(n)
, разница не так велика, это не влияет на сложность, но существует множество чисел, имеющих только два простых множителя (или три с одним, превышающим * 1041). *), таким образом, это делает заметную разницу во времени выполнения. В любом случае, число n > 0
имеет только несколько различных простых факторов, тривиальная оценка показывает, что число различных простых факторов ограничено lg n
(логарифм с основанием 2), поэтому верхняя граница для числа вычетов сито это N*lg N
.
Подсчитав не то, как часто каждое сложное число вычеркивается, а сколько множителей каждого простого числа вычеркнуто, как уже сделал IVlad, легко обнаружить, что число вычетов на самом деле составляет Theta(N*log log N)
. Опять же, использование колеса не меняет сложности, но уменьшает постоянные факторы. Однако здесь это оказывает большее влияние, чем на пробное разделение, поэтому, по крайней мере, следует пропустить четные события (помимо сокращения работы, это также уменьшает размер хранилища, что улучшает локальность кэша).
Таким образом, даже несмотря на то, что деление обходится дороже, чем сложение и умножение, мы видим, что количество операций, которые требует сито, намного меньше, чем количество операций, необходимых для пробного деления (если предел не слишком мал).
Подведение итогов:
Разделение проб выполняет бесполезную работу, разделяя простые числа, сито выполняет бесполезную работу, многократно вычеркивая композиты. Простых чисел относительно немного, но много композитов, поэтому можно подумать, что пробное деление тратит меньше усилий.
Но: композиты имеют только несколько различных простых факторов, в то время как ниже простых чисел sqrt(p)
.