复杂度分析:积性函数的狄利克雷卷积

根据狄利克雷卷积的基本概念,我们可以知道,对于两个积性函数 f(n)g(n) 和他们的卷积 h=f*g ,当 \gcd(a,b)=1 时,

\begin{eqnarray} h(ab) & = & \sum_{cd|ab} f(cd)g(\frac{ab}{cd}) \\ & = & \sum_{c|a}f(c)g(\frac a c) \sum_{d|b}f(d)g(\frac b d) \\ & = & h(a)h(b) \end{eqnarray}

所以我们可以通过积性函数的方法计算在1~n内的函数值,程序化一点就有

h(n) = \left\{ \begin{array}{clclc} 1 & \text{if} & n = 1 \\ \sum_{d=0}^{k} f(p^d) g(p^{k-d}) & \text{if} & n = p^k \\ h(p^k)h(m) & \text{else let} & n = p^k m & \text{where} & \gcd(p^k, m) = 1 \end{array} \right.

第1部分是平凡的,第3部分可以在Euler筛法的时候处理且总代价是 \Theta(n) 的,重点是第2部分的花销。


按照这个计算方法,对于 p^k 的函数值会额外造成 \Theta(k) 次计算。我们可以依次列出总时间复杂度的式子:

\begin{eqnarray} T(n) & = & \sum_{x=1}^{\log_2 n} x\pi \left( \left\lfloor \sqrt[x]n \right\rfloor \right) \\ & \approx & \sum_{x=1}^{\log_2 n} \frac {x\sqrt[x]n} {\ln {\sqrt[x]n}} \\ & = & \frac 1{\ln n}\sum_{x=1}^{\log_2 n} x^2 \sqrt[x]n \end{eqnarray}

这里用到了 \lim_{n \rightarrow +\infty} \frac{\pi(n)}{n/\ln n} = 1 的素数分布函数的极限。

这个式子怎么判断它的界呢?我们尝试找一下 x^2 \sqrt[x]n 的极值。

\newcommand{\diff}{\mathrm{d}} \begin{eqnarray} \frac{\diff}{\diff x} \, x^2 \sqrt[x]n & = & 2x\sqrt[x]n -x^2 \sqrt[x]n \frac 1 {x^2} \ln n \\ & = & \sqrt[x]n (2x - \ln n) \end{eqnarray}

可以看到原函数是单峰且凹的函数,极值在两边取得,是 x=1 时得 n

用最大值的界可得:

\begin{eqnarray*} T(n) & \leq & \frac{\log_2 n}{\ln n} n \\ T(n) & = & \mathcal O(n) \end{eqnarray*}


因此,计算两个积性函数的狄利克雷卷积的复杂度是 \Theta(n) 的。

编辑于 2018-01-14