某积性函数前缀和算法的复杂度分析

\newcommand{\lpf}{\textnormal{lpf}} \newcommand{\eps}{\varepsilon} 之前做 PE 的时候看到一个很有用的数论技巧:令 lpf(x)\lpf(x) 表示 xx 的最大质因数,我们考虑把 [n][n] 分成按照 xlpf(x)\frac{x}{\lpf(x)} 来分类,即 Sk={x:x/lpf(x)=k}S_k = \{x: x / \lpf(x) = k\},然后每一个 StS_t 单独处理。举个例子,假设我们要求一个积性函数 ff 的前缀和 F(x):=n=1xf(n)F(x) := \sum\limits_{n=1}^x f(n),那么对于一个 SkS_k,它里面的数的函数和为:

nx:n/lpf(n)=kf(n)=f(klpf(k))+lpf(k)<px/kf(kp)=f(klpf(k))+f(k)lpf(k)<px/kf(p).\sum_{n \leq x: n / \lpf(n) = k} f(n) = f(k \lpf(k)) + \sum_{\lpf(k) < p \leq x / k} f(kp) = f(k \lpf(k)) + f(k) \sum_{\lpf(k) < p \leq x / k} f(p).

后者只要知道形如 F~(x):=pxf(p)\tilde F(x) := \sum\limits_{p \leq x} f(p) 这样的和就可以了,而这个是有经典解法的。这个算法的更详细的介绍请参考 The prefix-sum of multiplicative function: the black algorithm关于一种积性函数前缀和的通用筛法的时间复杂度证明 - 知乎

显然,这个算法的整体复杂度取决于 F~\tilde F 的计算复杂度和有多少个不同的 kk。由于每个问题的 ff 性质不同,F~\tilde F 的复杂度会有不同,但是后者相对独立。这里我们就开始研究有多少个不同的 kk,即 Qx:=#{n/lpf(n):nx}=#{k:klpf(k)x}Q_x := \#\{n / \lpf(n): n \leq x\} = \#\{k: k \lpf(k) \leq x\} 的大小。

遇到这种不会做的题,第一反应是打个表:这里我就直接用了 baihacker 的结果了:

1e5     1.89e+03                    1894        0:00:00:00.000
1e6     9.11e+03                    9108        0:00:00:00.000
1e7     4.49e+04                   44948        0:00:00:00.000
1e8     2.28e+05                  228102        0:00:00:00.000
1e9     1.19e+06                 1185818        0:00:00:00.001
1e10    6.30e+06                 6298637        0:00:00:00.006
1e11    3.41e+07                34113193        0:00:00:00.036
1e12    1.88e+08               188014195        0:00:00:00.222
1e13    1.05e+09              1052806860        0:00:00:01.194
1e14    5.98e+09              5981038282        0:00:00:06.885
1e15    3.44e+10             34430179518        0:00:00:39.958
1e16    2.01e+11            200620098564        0:00:03:52.337

之后怎么办?当然是查万能的 OEIS 啦!可惜的是,OEIS 上并没有这类序列。我们再回去看之前那篇知乎文章。它里面的定理 11 用这里的语言可以表述为:

对于任意常数 α<1\alpha < 1,我们有 Qx=Ω(xα)Q_x = \Omega(x^\alpha).

……似乎陷入僵局。但是我们再看看 baihacker 的表,这数字也差的太多了吧……也就是说,Ω(xα)\Omega(x^\alpha) 里的常数取决于 α\alpha,但是随着 α\alpha 的增加,这个常数可以非常小,例如当 n=1016,α=0.99n = 10^{16}, \alpha = 0.99 时,藏在 Ω(nα)\Omega(n^\alpha) 里的常数最大也不过 2.9e-5,在这个 nn 的范围上都不能看成是常数了……于是我就想能不能搞一个紧一点的 bound,而且最好是一个上界,因为我更关心这个算法实际中有多快。

然后开始查文献……令 Ψ(x,y)\Psi(x, y) 表示 [x][x] 中有多少个最大质因子不超过 yy 的数。我们能得到一个 trivial bound:

Qxxy+Ψ(x,y).Q_x \leq \frac{x}{y} + \Psi(x, y).

剩下的问题就是怎么 bound Ψ(x,y)\Psi(x, y) 以及取一个合适的 yy 了。

这里有一篇 survey Integers without large prime factors 来讲怎么 bound Ψ(x,y)\Psi(x, y) 的,其中提到 A. Hildebrand 在 On the number of positive integers <= x and free of prime factors > y 里给出了某个范围内最好的估计:

对于任何常数 ε\eps,且 x3,1ulogx/(loglogx)5/3+εx \geq 3, 1 \leq u \leq \log x / (\log \log x)^{5/3 + \eps},有

Ψ(x,x1/u)=xρ(u)(1+Oε(ulog(u+1)logx)),\Psi(x, x^{1/u}) = x \rho(u) \left( 1 + O_\eps\left( \frac{u \log (u + 1)}{\log x} \right) \right),

其中 ρ(u)=exp((1+o(1))ulogu)\rho(u) = \exp(-(1 + o(1))u \log u)Dickman 函数

带入回之前的 bound,有:

Qxx/x1/u+Ψ(x,x1/u)=xexp(u1logx)+xexp((1+o(1))ulogu).Q_x \leq x / x^{1/u} + \Psi(x, x^{1/u}) = x \exp\left(- u^{-1}\log x \right) + x \exp(-(1 + o(1)) u\log u).

聪明的同学可以看出来,这里取 u=2logx/loglogxu = \sqrt{2 \log x / \log \log x} 就有:

Qxxexp((1+o(1))2logxloglogx).Q_x \leq x \exp\left( - (1 + o(1)) \sqrt{2 \log x \log \log x} \right).

本来故事到这里就差不多结束了,但是我突然灵机一动,转换了一下思路。聪明的同学已经发现了,如果 QxQx1Q_x \neq Q_{x - 1},那么就意味着 lpf(x)2x\lpf(x)^2 | x。于是我们就把所有满足 lpf(x)2x\lpf(x)^2 | x 的数列出来,看这个序列的增长速度就可以了:

4,8,9,16,18,25,27,32,4, 8, 9, 16, 18, 25, 27, 32, \dots

这个序列我们就能在 OEIS 上找到了,为 A070003 - OEIS,上面还提到 Erdos 证明了

Qx=xexp((1+o(1))logxloglogx).Q_x = x \exp\left(-\left(1 + o(1) \right)\sqrt{\log x \log \log x} \right).

好了,直接撞人家枪口上了,比我小一个常数 2\sqrt{2}……我去看了一下论文 On products of factorials,里面只轻飘飘提到一句:

An old result of one of the authors states that the number of bad’ n<xn < x is

xe(1+o(1))(logxloglogx)1/2.x e^{-(1 + o(1)) (\log x \log \log x)^{1/2}}.

怎么连引用了哪篇都不说……

我试了一下,这个 bound 其实挺紧的:我们画出了 QxQ_xQ^x=xexp(logxloglogx)\hat Q_x = x \exp(- \sqrt{\log x \log \log x}),两者之间的比例,以及 (logxlogQx)/logxloglogx1(\log x - \log Q_x) / {\sqrt{\log x \log \log x}} - 1:(代码


我在查文献 On sums involving reciprocals of the largest prime factor of an integer 的时候还看到这么一个有趣的结果:

nx1/lpf(n)=xexp(2logxloglogx+O(logxlogloglogx)).\sum_{n \leq x} 1 / \lpf(n) = x \exp\left( -\sqrt{2 \log x \log \log x} + O\left(\sqrt{\log x \log \log \log x} \right) \right).

聪明的同学已经看出来了,这和我们估计的 QxQ_x 一模一样啊……事实上,我们想要的就是

Qx=pΨ(x/p2,p)pp1Ψ(x/p,p),Q_x = \sum_p \Psi(x/p^2, p) \leq \sum_{p} p^{-1} \Psi(x / p, p),

所以得到类似的结果也不奇怪 →_→ 我稍微看了一下其证明思路,感觉可以用来证明 Erdos 的那个更紧的 bound,大概就是:

nx1/lpf(n)=1+pp1Ψ(x/p,p),\sum_{n \leq x} 1 / \lpf(n) = 1 + \sum_{p} p^{-1} \Psi(x/p, p),

然后也去 bound Ψ(x/p,p)\Psi(x / p, p)

顺便一提,Erdos 1929-1989 内所有的 paper 都在 renyi.hu/~p_erdos/Erdos.html,各位有兴趣可以读读 →_→ 以及还有一篇更新的关于 Ψ(x,y)\Psi(x, y) 的 survey Integers without large prime factors: from Ramanujan to de Bruijn