[日常摸鱼]一些素数筛法(暴力筛/埃氏筛/欧拉筛)与复杂度证明

昨天晚上突然发现不会证埃氏筛的复杂度,去研究了一下就有了这篇博客。

首先最朴素的筛法,对每个\(i=1,\dots,n\),再枚举一个\(j=1,\dots,\lfloor\frac{n}{i}\rfloor\),去筛掉\(i*j\),这样是一个\(O(n\log n)\)的复杂度。

接着是埃氏筛,每次只对素数\(i\),把\(i\times pri[j]\)筛一遍,复杂度于是\(\begin{aligned}\sum_{1\leq p\leq n (p\in prime)} \frac{1}{p}\end{aligned}\),级别的,可以证明这个式子是\(O(n\log \log n)\)的:

\(f(x)\)是一个在\([l,r]\)连续可微的函数,\(A(n)=\sum_{i\leq n}a_i\),类似分部积分的操作,\(A_{i}f_{i}-A_{i-1}f_{i-1}=(A_i-A_{i-1})f_i+A_{i-1}(f_{i}-f_{i-1})=a_{i}f_i+A_{i-1}(f_{i}-f_{i-1})\),两边求和得到:\(\begin{aligned}A_rf_r-A_l f_l=\sum_{i=l+1}^ra_if_i+\sum_{i=l+1}^r A_{i-1}(f_i-f_{i-1})\end{aligned}\)

为了方便,后面那个\(\sum\)经常还能换成积分:\(=\begin{aligned}\sum_{i=l+1}^r A_i \int_{i-1}^{i}f'(t)dt=\int_l^r A_t f'(t)dt\end{aligned}\),于是有:\(\begin{aligned}\sum_{i=l+1}^r a_i f_i=A_r f_r-A_l f_l -\int_l^r A_t f'(t)dt\end{aligned}\),接着在这里,我们令\(a_i\)表示\(i\)是不是素数(是的话为1,否则为0),于是\(A(n)=\pi(n)\),再取\(f_i=\frac{1}{i}\),取\(l=2\)开始求和,就得到了素数倒数和\(\begin{aligned}\sum_{p\leq n}\frac{1}{p}=\frac{\pi(n)}{n}+\int_2^n\frac{\pi(t)}{t^2}dt\end{aligned}\),接着我们近似地用\(\pi (x)\sim \frac{x}{\ln x}\)来算积分,就得到了\(O(n\log \log n)\)这个结果啦

欧拉筛则是考虑对每个数\(i\)枚举比他小素数\(j\),把\(i\times j\)筛掉,与此同时,一旦发现\(j|i\)就结束这一轮\(j\)的枚举,这样就能保证每个数字最多只被筛一次,复杂度是严格的\(O(n)\)的。

同时我们说这种方法能用来筛一些像是莫比乌斯函数/欧拉函数这样的积性函数(即\(n,m\)互质时,符合\(f(nm)=f(n)f(m)\)的一类函数)。

posted @ 2021-04-02 15:18  yoshinow2001  阅读(224)  评论(0编辑  收藏  举报