Meissel-Lehmer算法 学习笔记

定义\(\pi_k(n)\)为质数的\(k\)次幂前缀和函数,即\(\pi_k(n)=\sum_{1\leq i\leq \pi(n)}p^k\)。特别地,\(\pi_0(n)=\pi(n)\),为质数计数函数。求\(\pi_k(n)\)

解法

(若无特殊说明,下文中单独出现的\(p\)\(q\)均为质数)

定义

  • \(\delta(x)\)\(x\)的最小质因子,\(\gamma(x)\)\(x\)的最大质因子。

  • \(cnt(x)\)\(x\)的质因子个数。

  • \(S_k(n)\)为自然数幂和函数。\(S_k(n)=\sum_{1\leq i\leq n}i^k\)

  • \(\phi_k\)为部分筛函数。\(\phi_k(n,a)=\sum_{\substack{1\leq x\leq n\\ \delta(x)> p_a}}x^k\)

  • \(P_{s,k}(n,a)=\sum_{\substack{1\leq x\leq n\\ \delta(x)> p_a\\ cnt(x)=s}}x^k\)

那么

\[\phi_k(n,a)=\sum_{s\geq 0}P_{s,k}(n,a) \]

考虑素数\(B=p_a\),当\(n^\frac{1}{3}\leq B\leq n^\frac{1}{2}\)时,有

\[\phi_k(n,a)=P_{0,k}(n,a)+P_{1,k}(n,a)+P_{2,k}(n,a)=1+\pi_k(n)-\pi_k(p_a)+P_{2,k}(n,a) \]

于是

\[\pi_k(n)=\phi_k(n)-P_{2,k}(n,a)+\pi_k(p_a)-1 \]

故只需要分别计算\(\pi_k(p_a)\)\(P_{2,k}(n,a)\)\(\phi_k(n,a)\)即可。

对于\(\pi_k(p_a)\)。线性筛即可。时间复杂度\(O(B)\)

对于\(P_{2,k}(n,a)\)。根据定义有

\[P_{2,k}(n,a)=\sum_{\substack{p_a< p\leq q\\ pq\leq n}}(pq)^k \]

注意到\(B< p\leq q< \left\lfloor\frac{n}{B}\right\rfloor\),于是线性筛预处理,然后枚举\(p\)计算所有可行的\(q\)的贡献,为

\[P_{2,k}(n,a)=\sum_{p_a< p\leq \sqrt{n}}p^k\left(\pi_k\left(\left\lfloor\frac{n}{p}\right\rfloor\right)-\pi_k(p-1)\right) \]

时间复杂度\(O(\frac{n}{B})\)

对于\(\phi_k(n,a)\)。根据容斥,容易得到递推式

\[\phi_k(n,a)=\phi_k(n,a-1)-p_a^k\phi\left(\left\lfloor\frac{n}{p_a}\right\rfloor,a-1\right) \]

边界条件为

\[\phi_k(n,0)=S_k(n) \]

考虑DFS计算该式。

若每次都递推到边界,有

\[\phi_k(n,a)=\sum_{\gamma(x)\leq p_a}\mu(x)x^kS_k\left(\left\lfloor\frac{n}{x}\right\rfloor\right) \]

复杂度难以接受,考虑剪枝。

加入\(x> B\)时停止递归的剪枝,有

\[\phi_k(n,a)=\sum_{x\leq B}\mu(n)x^kS_k\left(\left\lfloor\frac{n}{x}\right\rfloor\right)+\sum_{\frac{x}{\delta(x)}\leq B< x}\mu(x)x^k\phi_k\left(\left\lfloor\frac{n}{x}\right\rfloor,\pi(\delta(x))-1\right) \]

\[\mathcal{S_0}=\sum_{x\leq B}\mu(n)x^kS_k\left(\left\lfloor\frac{n}{x}\right\rfloor\right) \]

\[\mathcal{S}=\sum_{\frac{x}{\delta(x)}\leq B< x}\mu(x)x^k\phi_k\left(\left\lfloor\frac{n}{x}\right\rfloor,\pi(\delta(x))-1\right) \]

那么

\[\phi_k(n,a)=\mathcal{S_0}+\mathcal{S} \]

对于\(\mathcal{S_0}\),线性筛预处理后\(O(B)\)计算即可。

对于

\[\mathcal{S}=-\sum_{p\leq B}\sum_{\substack{\delta(x)> p\\ x\leq B< xp}}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac{n}{xp}\right\rfloor,\pi(p)-1\right) \]

分块计算。

\[\mathcal{S_1}=-\sum_{n^\frac{1}{3}< p\leq B}\sum_{\substack{\delta(x)> p\\ x\leq B< xp}}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac{n}{xp}\right\rfloor,\pi(p)-1\right) \]

\[\mathcal{S_2}=-\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}\sum_{\substack{\delta(x)> p\\ x\leq B< xp}}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac{n}{xp}\right\rfloor,\pi(p)-1\right) \]

\[\mathcal{S_3}=-\sum_{p\leq n^\frac{1}{4}}\sum_{\substack{\delta(x)> p\\ x\leq B< xp}}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac{n}{xp}\right\rfloor,\pi(p)-1\right) \]

那么

\[\mathcal{S}=\mathcal{S_1}+\mathcal{S_2}+\mathcal{S_3} \]

对于\(\mathcal{S_1},\mathcal{S_2}\),注意到\(\delta(x)> p> n^\frac{1}{4}\)\(x\leq B\leq n^\frac{1}{2}\)。于是\(x\)只能为质数。

于是

\[\mathcal{S_1}=\sum_{n^\frac{1}{3}< p\leq B}\sum_{p< q\leq B}p^kq^k\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right) \]

\[\mathcal{S_2}=\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}\sum_{p< q\leq B}p^kq^k\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right) \]

对于\(\mathcal{S_1}\)。由于\(\left\lfloor\frac{n}{pq}\right\rfloor< n^\frac{1}{3}< p\),所以\(\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right)=1\)

于是

\[\mathcal{S_1}=\sum_{n^\frac{1}{3}< p\leq B}\sum_{p< q\leq B}p^kq^k=\sum_{n^\frac{1}{3}< p\leq B}p^k(\pi_k(B)-\pi_k(p)) \]

时间复杂度\(O(B)\)

对于\(\mathcal{S_2}\),考虑分成两个部分计算。令

\[\mathcal{U}=\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}\sum_{\substack{p< q\leq B\\ q> \frac{n}{p^2}}}p^kq^k\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right) \]

\[\mathcal{V}=\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}\sum_{\substack{p< q\leq B\\ q\leq \frac{n}{p^2}}}p^kq^k\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right) \]

那么\(\mathcal{S_2}=\mathcal{U}+\mathcal{V}\)

对于\(\mathcal{U}\),因为\(q> \frac{n}{p^2}\),所以有\(p> \sqrt{\frac{n}{q}}\geq \sqrt{\frac{n}{B}}\)。同时,由于\(\left\lfloor\frac{n}{pq}\right\rfloor<p\),所以\(\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right)=1\)

于是

\[\mathcal{U}=\sum_{\sqrt{\frac{n}{B}}< p\leq n^\frac{1}{3}}\sum_{\substack{p< q\leq B\\ q> \frac{n}{p^2}}}p^kq^k=\sum_{\sqrt{\frac{n}{B}}< p\leq n^\frac{1}{3}}p^k\left(\pi_k(B)-\pi_k\left(\min\left\{p,\left\lfloor\frac{n}{p^2}\right\rfloor\right\}\right)\right) \]

时间复杂度\(O(B)\)

对于\(\mathcal{V}\),我们有\(p\leq \frac{n}{pq}< \sqrt{n}< p^2\),所以\(\phi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor,\pi(p)-1\right)=1+\pi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor\right)-\pi_k(p)+p^k\)

于是把\(\mathcal{V}\)分成两个部分计算。令

\[\mathcal{V_1}=\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}p^k(1-\pi_k(p)+p^k)\sum_{\substack{p< q\leq B\\ q\leq \frac{n}{p^2}}}q^k \]

\[\mathcal{V_2}=\sum_{n^\frac{1}{4}< p\leq n^\frac{1}{3}}p^k\sum_{\substack{p< q\leq B\\ q\leq \frac{n}{p^2}}}q^k\pi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor\right) \]

那么\(\mathcal{V}=\mathcal{V_1}+\mathcal{V_2}\)

对于\(\mathcal{V_1}\),直接枚举\(p\)计算即可。

对于\(\mathcal{V_2}\),用类似数论分块的方法计算。枚举\(p\),对于所有\(\pi_k\left(\left\lfloor\frac{n}{pq}\right\rfloor\right)\)相同的\(q\)一起统计贡献,可以证明最多只有\(\pi\left(\left\lfloor\frac{n}{p^2}\right\rfloor\right)\),个状态。于是时间复杂度为\(O\left(\frac{n^\frac{2}{3}}{\log n}\right)\)

对于\(\mathcal{S_3}\),枚举\(p\),用树状数组统计其对所有有用的\(\phi_k\)的贡献。时间复杂度为\(O\left(\frac{n}{B}\log n\right)\)

时间复杂度

\(B=O(n^\frac{1}{3}\log^2 n)\)时总复杂度达到最优,为\(O\left(\frac{n^\frac{2}{3}}{\log n}\right)\)

(将\(\mathcal{V_2}\)分成5个部分计算可进一步将时间复杂度优化至\(O\left(\frac{n^\frac{2}{3}}{\log^2 n}\right)\),在此不过多叙述)。

(实际上由于常数原因,在\(n\leq 10^{11}\)范围内跑得不如\(O\left(\frac{n^\frac{3}{4}}{\log n}\right)\)的递推做法或\(O(n^\frac{2}{3})\)的树状数组优化做法快)。

代码咕咕咕

参考文献:

posted @ 2020-08-22 20:49  Y25t  阅读(1106)  评论(2编辑  收藏  举报