January 2019

M T W T F S S
 123456
78 910111213
14 151617181920
21222324252627
28293031   

За стиль благодарить

Развернуть метки

No cut tags
Wednesday, November 28th, 2007 08:09 pm (UTC)
Вообще говоря, идею можно допилить до работоспособного состояния. Если посчитан набор простых чисел от 2 до sqrt(N) P[1..k], то количество простых чисел от 1 до N можно вычислить и так:

N + k
- N/P[1] - N/P[2] - N/P[3] - N/P[4] - ...
+ N/(P[1]*P[2]) + N/(P[1]*P[3]) + N/(P[2]*P[3]) + ...
- N/(P[1]*P[2]*P[3]) - N/(P[1]*P[2]*P[4]) - ...

То есть надо взять все наборы из P[1..k], поделить нацело N на произведение чисел набора и результат отнять от N + k (если множителей в наборе нечетное количество) или прибавить (если четное). (Лишнее k взялось оттого, что N/P[i] - это количество всех чисел, делящихся на P[i], включая само P[i].)

Звучит на первый взгляд ужасно - наборов 2^k штук; но спасает возможность не рассматривать наборы с произведением, большим N. Это позволяет довольно хорошо обстричь рекурсию, и реальное количество делений будет не таким большим - для N = 10^6 я намерил 153192 деления, при том что честное решето дает 2197837 вычеркиваний. Правда, на Питоне решето все равно по скорости оказалось быстрее в полтора раза :-).

Reply

(will be screened)
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting