本文是一篇长文,尚未完成。
一
算法竞赛中常见一类计数问题:
函数 $g : \mathbb Z_{\ge 1} \to \mathbb Z_{\ge 0}$ 已知。函数 $f : \mathbb Z_{\ge 1} \to \mathbb Z_{\ge 0}$, $f(n) := \sum_{d | n} g(d) $ 。求 $f$ 的前缀和。
分析:
将 $f$ 的前缀和记作 $F$ 。有
\begin{aligned}
F(n) &:= \sum_{i = 1}^{n} f(i) = \sum_{i=1}^{n} \sum_{d | i} g(d) = \sum_{d = 1} ^ {n} \floor{ n / d} g(d)
\end{aligned}
记 $g$ 的前缀和为 $G$,有
\begin{aligned}
F(n) = \sum_{d = 1} ^ {n} \floor{ n / d} g(d) = \sum_{i = 1}^n G(\floor{n / i})
\end{aligned}
证明:和式 $\sum_{i = 1}^n G(\floor{n / i}) $ 中,$g(k)$ 被累加的次数恰为 $\floor{ n / i} $ 取值大于等于 $k$ 的次数。$\floor{ n / i } \ge k \iff n / i \ge k \iff i \le n / k $,因此 $ g(k) $ 恰被累加了 $ \floor{ n / k} $ 次。
二
引理 1
$\forall n, m \in \mathbb Z_{\ge 1}$,若 $m \le \sqrt{n}$,则 $\lfloor n / \lfloor n/m \rfloor \rfloor = m$ 。
证明
令 $k = \floor{n/m}$,则 $mk \le n < m(k + 1)$,那么 $m \le n / k < m(k + 1) / k$ 。若要 $ \floor{n / k} = m$ 成立,即要 $ m \le n/ k < m + 1$ 成立,而 $m + 1 \ge m (k + 1) / k$ 是 $m \le n/ k < m + 1$ 成立的充分条件;$m + 1 \ge m (k + 1) / k$ 即 $ k \ge m$,即 $ \floor{ n / m} \ge m$,这等价于 $ m^2 \le n$,即 $m \le \sqrt{n}$ 。
推论
对于 $1 \le i \le \floor{\sqrt{n}}$,$ i \mapsto \floor{n/i} $ 是单射。
定理 1
$2 \floor{\sqrt{n}} - 1 \le | \{ \floor{n / i} : 1 \le i \le n \} | \le 2 \floor{ \sqrt{n} } $。
证明
若 $ 1\le x < y \le \floor{\sqrt{n}} $,则 $ n / x - n / y \ge n /(y-1) - n / y = n / (y(y-1)) > 1$ ,故有 $\floor{ n / x} > \floor{n / y}$ 。所以,当 $ i \le \floor{\sqrt{n}}$ 时,$n / i$ 恰产生 $ \floor{\sqrt{n}} $ 个不同的值,并且这些值都不小于 $ \floor{\sqrt{n}} $ 。若 $ i > \floor{\sqrt{n}} $ 则 $ 1 \le \floor{ n / i } \le \floor{n / (\floor{\sqrt{n}} + 1)} $ 。容易验证 $ \floor{\sqrt{n}} - 1 <n / (\floor{\sqrt{n}} + 1) < \floor{\sqrt{n}} + 1$,故有 $\color{blue}{\floor{\sqrt{n}} - 1 \le \floor{n / (\floor{\sqrt{n}} + 1)} \le \floor{\sqrt{n}} }$ 。又从引理 $1$ 可以推知,在 $i$ 从 $ \floor{\sqrt{n}} + 1 $ 变化到 $n$ 的过程中,$ \floor{ n / i } $ 能取到 $1$ 到 $\floor{n / (\floor{\sqrt{n}} + 1)} $ 之间的每一个整数。因此 $ 2 \floor{\sqrt{n}} - 1 \le | \{ \floor{n / i} : 1 \le i \le n \} | \le 2 \floor{ \sqrt{n} } $ 。
三
设 $f$ 是定义在 $(0, \infty)$ 上的严格单调递减的函数。对于任意 $ t \in \mathbb Z_{\ge 1}$,使等式 $ \floor{f(x)} = \floor{f(t)} $ 成立的最大整数 $x = \floor{ f^{-1}(\floor{f(t)}) } $ 。
设 $f$ 是定义在 $(0, \infty)$ 上的严格单调递增的函数。对于任意 $ t \in \mathbb Z_{\ge 1}$,使等式 $ \floor{f(x)} = \floor{f(t)} $ 成立的最小整数 $x = \ceil{ f^{-1}(\floor{f(t)}) } $ 。
一些概念
数论函数
数论函数是指定义域为正整数集,陪域为复数域的函数。
Read more here.
积性函数
积性函数是一类特殊的数论函数。设 $f$ 是数论函数。若 $f(1) = 1$ 且对于任意两个互质的正整数 $a,b$,都有 $f(ab) = f(a)f(b)$,则 $f$ 是积性函数。
为何要求 $f(1) = 1$?根据定义,积性函数 $f$ 必满足 $f(1)^2 = f(1)$,即 $f(1) = 0$ 或 $f(1)=1$ 。若 $f(1) = 0$ 则 $f(n) = f(1) \times f(n) = 0$,即 $f$ 恒为零,这种情形没有意义,因此要求 $f(1) = 1$ 。
设 $f$ 是积性函数,若对任意正整数 $a, b$ 都有 $f(ab) = f(a) f(b)$,则称 $f$ 为完全积性函数。
数论函数的狄利克雷卷积
设 $f$,$g$ 是数论函数。数论函数 $ \sum_{d\mid n} f(d) g(n/d) $ 称为 $f$ 和 $g$ 的狄利克雷卷积,记作 $f * g$ 。
容易证明狄利克雷卷积满足交换律与结合律。
定理 2
所有满足 $f(1) \ne 0$ 的数论函数关于狄利克雷卷积构成交换群。
证明
取单位元为 $e(n) = [n = 1]$ 。容易验证任意数论函数 $f$ 都满足 $f * e = e * f = f $ 。
下面来考虑 $f$ 在狄利克雷卷积意义下的逆元 $f^{-1}$ 。实际上,根据 $f * f^{-1} = e$ 可以递推出 $f^{-1}$ 。
$ e(1) = f(1) f^{-1}(1) = 1 \iff f^{-1}(1) = 1/ f(1) $
对于 $n \ge 2$,
$$
e(n) = \sum_{d | n} f(d) f^{-1}( n / d) = 0 \iff f^{-1}(n) = - \frac{ \sum_{\substack{ d|n \\ d \ge 2}} f(d) f^{-1}(n/d) } {f(1)}
$$
据此立得逆元的存在性和唯一性。
以下假设所讨论的数论函数都满足 $f(1) \ne 0$ 。若未特别说明,以下所谓逆元皆指狄利克雷卷积意义下的逆元。
莫比乌斯函数
将取值恒为 $1$ 的函数记作 $\dsone$ 。$\dsone$ 的逆元称作莫比乌斯函数,记作 $\mu$。根据定义有,$\mu * \dsone = e$ 。
莫比乌斯函数的另一种等价定义是
$\mu(1) = 1$ 。对于 $n \ge 2$,若 $n$ 是 $k$ 个不同质数的乘积,则 $\mu(n) = (-1)^k$,否则 $\mu(n) = 0$ 。
下面我们证明这两种定义等价。我们只要证明,按第二种定义仍有 $ \mu * \dsone = e$ 。
证明
以 $P(n)$ 表示正整数 $n$ 的素因子集合。特别地,$P(1) = \emptyset$ 。
\begin{aligned}
\mu * \dsone = \sum_{d \mid n} \mu(d) &= \sum_{k = 0}^{|P(n)|} \binom{|P(n)|}{k} (-1)^k \\
&= [|P(n)| = 1] \\
&= [n = 1] \\
&= e
\end{aligned}
引子中提到的函数 $f(n) := \sum_{d | n} g(d)$ 可写成 $ f = \dsone * g $,易见这蕴含着 $ g = \mu * f $。
$ f = \dsone * g \iff g = \mu * f$ 这个结论通常称作莫比乌斯反演。其实这只是一般意义下的莫比乌斯反演的一个特例。
从这一小节的讨论中,我们可以看出,莫比乌斯函数的定义域其实不必是全体正整数。取全体质数的一个子集 $S$($S$ 可以是空集),定义由 $S$ 所导出的正整数子集 $N(S)$ 为 $ N(S) := \{ n \in \mathbb{Z}_{\ge 1} : P(n) \sse S \} $ 。若把莫比乌斯函数定义在 $N(S)$ 上,上述诸结论仍然成立。更进一步,我们可以把数论函数的定义域取为 $N(S)$,诸结论一样成立。这也就是说,以 $N(S)$ 作为 $\mathbb Z_{\ge 1}$ 的推广是合适的。例如,可以把数论函数定义在全体奇数上。
莫比乌斯函数的应用
莫比乌斯函数的性质 $\mu * \dsone = e$ 可以简化计算。下面举一例。
求 $\sum_{x = 1}^{n} \sum_{y = 1}^{m} [\gcd(x, y) = 1]$ 。其中,$ n \le m$ 。
\begin{aligned}
\sum_{ x = 1} ^{n} \sum_{y = 1} ^{m} [\gcd(x, y) = 1] &= \sum_{ x = 1} ^{n} \sum_{y = 1} ^{m} e(\gcd(x, y)) \\
&= \sum_{ x = 1} ^{n} \sum_{y = 1} ^{m} (\mu * \dsone) (\gcd(x, y)) \\
&= \sum_{x = 1} ^ {n} \sum_{y = 1} ^{m} \sum_{ d \mid \gcd(x, y) } \mu(d) \\
&= \sum_{d = 1}^{n} \mu(d) \sum_{x = 1} ^ {n} \sum_{y = 1} ^{m} [d \mid \gcd(x, y)] \\
&= \sum_{d = 1}^{n} \mu(d) \sum_{x = 1} ^ {n} [d \mid x] \sum_{y = 1} ^{m} [d \mid y] \\
&= \sum_{d = 1}^{n} \mu(d) \floor{ n / d } \floor{m / d}
\end{aligned}
下面讨论莫比乌斯反演的一个推广。回顾前面提到的莫比乌斯反演,设 $f, g$ 是两数论函数,有 $ f = \dsone * g \iff g = \mu * f $ 。此性质可稍加推广。设 $f, g$ 是两数论函数,函数 $t: \mathbb Z_{\ge 1} \to \mathbb Z_{\ge 1}$ 是完全积性函数。我们有
$$ f(n) = \sum_{t(d) \mid n} g(n / t(d)) \iff g(n) = \sum_{t(d) \mid n} \mu(d) f(n / t(d)) $$
证明
先证 $ \implies $ 。
\begin{aligned}
& \sum_{t(d) \mid n} \mu(d) f(n / t(d)) \\
&= \sum_{t(d) \mid n} \mu(d) \sum_{t(x) \mid n/t(d) } g(n / (t(d) t(x))) \\
&= \sum_{t(d) \mid n} \mu(d) \sum_{t(dx) \mid n } g(n / t(dx)) \\
&= \sum_{t(k) \mid n} g(n/ t(k)) \sum_{d \mid k} \mu(d) \\
&= g(n)
\end{aligned}
再证 $ \impliedby $ 。
\begin{aligned}
& \sum_{t(d) \mid n} g(n / t(d)) \\
&= \sum_{t(d) \mid n} \sum_{ t(x) \mid n/t(d) } \mu(x) f(n / (t(d) t(x))) \\
&= \sum_{t(d) \mid n} \sum_{ t(dx) \mid n } \mu(x) f(n / t(dx)) \\
&= \sum_{t(k) \mid n} f(n / t(k)) \sum_{ x \mid k } \mu(x) \\
&= f(n)
\end{aligned}
容斥原理
定理 3
Let $f$ and $g$ be two functions defined on the subsets of a finite set $S$ such that $f(A) = \sum_{B \subseteq A} g(B)$. Then $g(A) = \sum_{B\subseteq A} (-1)^{|A-B|} f(B)$.
证明
We have
\begin{align*}
\sum_{B \subseteq A} (-1)^{|A-B|} f(B) &= \sum_{\substack{B \subseteq A \\ C \subseteq B}} (-1)^{|A-B|} g(C) \\
&= \sum_{C \sse A} g(C) \sum_{C \sse B \sse A} (-1)^{ |A-B| } = g(A). \qed
\end{align*}
A dual form of inclusion-exclusion may be proved the same way as above:
$$ f(A) = \sum_{ S \spe B \spe A} g(B) \iff g(A) = \sum_{S \spe B \spe A} (-1)^{|B-A|} f(B).$$
注:定理 3 及其证明引自 Handbook of Combinatorics vol 2 p.p. 1049。这本书的讲法比 Enumerative Combinatorics vol 1 second edition, 第 2.1 节的讲法更简洁。
[Note: 这一小节内容有错误,需要更改。
从容斥原理的角度理解莫比乌斯反演
以 $D(n)$ 表示 $n$ 的素因子的集合。
根据容斥原理我们有
$$
f(D(n)) = \sum_{\substack{x | n\\ x \text{ 无平方因子}}} g(D(x)) \iff g(D(n)) = \sum_{\substack{x | n\\ x \text{ 无平方因子}}} (-1)^{|D(n) - D(x)|} f(D(x))
$$
亦即
$$
f(D(n)) = \sum_{x | n} g(D(x)) \iff g(D(n)) = \sum_{x | n} \mu(n/x) f(D(x))
$$
于是我们可以把莫比乌斯函数看做是为了应用容斥原理而有意“设计”出来的一个函数。从这个角度看,莫比乌斯反演不过是“穿了马甲”的容斥原理。
令 $f$, $g$ 为两数论函数,我们有
$$ f(n) = \sum_{ d | n} g(d) \iff g(n) = \sum_{d | n} \mu(n/d) f(d) $$
及其对偶形式
$$ f(n) = \sum_{i = 1}^{m} g(in) \iff g(n) = \sum_{i=1}^{m} \mu(i) f(in) $$
其中 $m$ 是常数。- end note]
数论函数的前缀和
杜教筛
设 $f$ 是数论函数,令 $F(n) = \sum_{i=1}^{n} f(i)$,即 $F$ 为 $f$ 的前缀和 。又设 $g$ 为数论函数,令 $h$ 为 $f$ 与 $g$ 的狄利克雷卷积,$H(n) := \sum_{i=1}^{n} h(n)$ 。我们有
\begin{aligned}
H(n) &= \sum_{i=1}^{n} \sum_{d\mid i} f(d) g(i/d) \\
&= \sum_{\frac id = 1}^{n} \sum_{d =1}^{\lfloor n/(\frac id)\rfloor} f(d) g(i/d) \\
&= \sum_{i = 1}^{n} \sum_{d =1}^{\lfloor n/i \rfloor} f(d) g(i)
\end{aligned}
即
\begin{equation}
H(n) = \sum_{i = 1}^{n} g(i) F(\floor{ n/i }) \label{E:1}
\end{equation}
从而
\begin{equation}
g(1)F(n) = H(n) - \sum_{i =2}^{n} g(i) F(\floor{n/i}) \label{E:2}
\end{equation}
若 $g(1) \ne 0$ ,则有
\begin{equation}
F(n) = \frac{1}{g(1)} \left( H(n) - \sum_{i = 2}^{n} g(i) F(\floor{n/i}) \right) \label{E:3}
\end{equation}
\eqref{E:3} 可以看做 $F(n)$ 的递推式。
注意到在求和式 $\sum_{i = 2}^{n} g(i) F(\lfloor n/i \rfloor)$ 中,$\lfloor n/i \rfloor$ 的取值不超过 $2\sqrt{n}$ 种,我们可以将 $2$ 到 $n$ 之间的整数按 $\lfloor n/i \rfloor$ 的取值分成若干段,满足 $\lfloor n/i \rfloor = k$ 的 $i$ 的范围是 $(n/(k+1), n/k]$ 。
对于数论函数 $f$,如果能找到数论函数 $g$ 满足 $g$ 和 $f*g$ 的前缀和都比较容易求出,那么(用哈希表记忆化)递归地计算 $F(n)$ 的复杂度就可能比较低。当然这只是初步观察之后所做的猜想,复杂度究竟如何尚需仔细分析才能知道。
上述算法在国内 OI 界一般称作杜教筛。
杜教筛的复杂度分析
以下论证取自 riteme,略作调整。
假设 $h$,$g$ 的前缀和可以 $O(1)$ 求出。以 $Q(n)$ 表示 $n$ 除以 $2$ 到 $n$ 之间的整数所得诸商的集合,即 $Q(n) := \{\lfloor n/k \rfloor : 2 \le k \le n, k \in \mathbb Z \}$ 。
定理 2 $\quad \forall n \in \mathbb Z_{\ge 2}$,记 $ r = \lfloor \sqrt{n} \rfloor $,$A = \{1, 2, 3, \dots, r \}$,$B = \{ \lfloor n/2 \rfloor, \lfloor n/3 \rfloor, \dots, \lfloor n/r \rfloor\}$,则 $Q(n) = A \cup B$ 并且 $ |Q(n)| = 2 \sqrt{n} + \Theta(1)$ 。
证明 $\quad$ 首先证明,当 $n \ge 2$ 时,$\forall x \in A$,$\floor{ n / x } \ge 2$ 。容易验证当 $n = 2$ 或 $n = 3$ 成立;当 $n \ge 4$ 时,$\forall x \in A$, 有 $\floor{n /x} \ge \floor{\sqrt{n}} \ge 2$ ;又根据引理 1,$ \forall x \in A $,$\floor{ n / \floor{n / x}} = x$,所以 $ x \in Q(n)$。另一方面,若 $\floor{n / k} > r$ 即 $ n / k \ge r + 1$,那么 $ k \le n / (r + 1) \le r$。因此 $Q(n) \setminus A \subseteq B$。根据 $B$ 的定义,$B \subseteq Q(n)$,由此可得 $Q(n) = A \cup B$ 。
对于 $1 \le x < y \le r$,$n / x - n / y \ge n /(y - 1) - n / y = n /(y(y-1)) > 1$,所以 $\floor{n/x} \ne \floor{n/y}$,即 $|B| = r - 1$ 。又 $\floor{n/s} \ge s$,故 $2r - 2 \le |Q(n)| \le 2r - 1$,所以 $|Q(n)| = 2 \sqrt{n} + \Theta(1)$ 。
引理 2 $\quad$ 取常数 $a, b \in \mathbb Z_{\ge 1}$ 。对于任意正整数 $x$,有 $\floor{\floor{x/a}/b} = \floor{x /(ab)}$ 。
证明 $\quad$ 设 $x = kab + y$ 且 $ 0 \le y < ab$,即 $\floor{x / (ab) } = k$,那么 $\floor{x / a} = kb + \floor{y / a}$,从而 $ \floor{\floor{ x / a} / b} = k + \floor{\floor{y / a} / b} \le k + \floor{(y / a) / b)} = k$,所以 $\floor{\floor{x/a}/b} = k$ 。
定理 3 $\quad$ 对于任意正整数 $n$,任意 $m \in Q(n)$,有 $Q(m) \subseteq Q(n)$ 。
证明 $\quad$ 因为 $m \in Q(n)$,故可设 $m = \floor{n/a}$。对于 $z \in Q(m)$,有 $ z = \floor{m /b}$,根据引理 2,$z = \floor{ n/ (ab)}$ 。因为 $a, b > 1$,且 $a \le n$,$b \le n / a$,所以 $1 < ab \le n$,所以 $ z \in Q(n)$ 。
定理 3 揭示了递归式 \eqref{E:3} 的巧妙之所在:在递归计算 $F(n)$ 的整个过程中,需要计算的 $F(\cdot)$ 只有 $|Q(n)| + 1$ 种(即 $Q(n) \cup \{n\}$)。计算 $F(x)$ 的时间开销是枚举 $Q(x)$ 中的元素 $k$,查哈希表看 $F(k)$ 是否已经算好,没算好就递归调用 $F(k)$;枚举次数是 $|Q(x)| < 2\sqrt{x}$ 。因此,总的枚举次数的上界为
\begin{aligned}
&2\left(\sqrt{n} + \sum_{k = 1}^{\floor{\sqrt{n}}} \sqrt{k} + \sum_{k = 2}^{\floor{\sqrt{n}}}\left(\sqrt{n/k}\right)\right) \\
&= 2\left( \sum_{k = 1}^{\floor{\sqrt{n}}} \sqrt{k} + \sum_{k = 1}^{\floor{\sqrt{n}}}\left(\sqrt{n/k}\right)\right) \\
&= \Theta\left( \int_1 ^{\sqrt{n}} \left(\sqrt{x} + \sqrt{n/x} \right) \dif x \right) \\
&= \Theta\left( n^{3/4} \right)
\end{aligned}
根据上面的分析,易见空间复杂度是 $\Theta(\sqrt{n})$ 。
假设我们可以在线性时间内预处理出 $F(\cdot)$ 的前若干项,算法的时间复杂度还可以更优。为了便于分析,假设在线性时间内预处理出了前 $m$ 项,且 $m \ge \floor{\sqrt{n}}$,则时间复杂度变为
$$
\Theta\left( m + \sum_{k=1}^{\floor{n / m}} \sqrt{n/k} \right) = \Theta \left( m + \int_{1}^{n/m} \sqrt{n/x} \dif x \right) = \Theta\left( m + n/\sqrt{m} \right)
$$
取 $m = n^{2/3}$ 可得最优时间复杂度 $\Theta \left( n^{2/3} \right)$ 。此时空间复杂度也是 $\Theta \left( n^{2/3} \right)$ 。值得指出的是,
若预处理至少前 $ \floor{\sqrt{n}} $ 项,对于未预处理的项 $ f(x) $,必有 $ x > \floor{\sqrt{n}} $,根据定理 1,此时 $x$ 和 $\floor{ n / x}$ 一一对应,因此我们可以用数组代替哈希表来存储 $f(x) $,把 $f(x)$ 存到数组中下标为 $\floor{ n / x}$ 的位置即可。
关于杜教筛的复杂度,其实任之洲在他的集训队论文《积性函数求和的几种方法》中也给出了类似于 riteme 的论证,不过没有这么细致,只是一笔带过
根据引理 4.2 和引理 5.1,在递推计算 $S(n)$ 的整个过程中,需要被计算的 $S(\floor{n /i })$ 只有 $O(\sqrt{n})$ 种。
任之洲论文里的引理 4.2 类似于上面的引理 1,引理 5.1 类似于上面的引理 2。
总结
不难看出,杜教筛其实并不要求 $f$ 是积性函数,关键是找到适当的函数 $g$ 来跟 $f$ 搭配。不过值得指出的是,对于上面提到的那个预处理优化,若 $f$ 是积性函数且 $f(p^k)$ 可以 $O(1)$ 求出,则可以用线性筛在线性时间内求出 $f$ 的若干项;一般的数论函数 $f$ 未必具有这样的好性质。任之洲在其集训队论文中是如此评论杜教筛的
…… 一种高效的数论函数求和方法,这个算法在国内信息学竞赛中一般被称为杜教筛,一种利用 Dirichlet 卷积进行构造的算法,虽然和积性没有很大联系,且需要被计算函数本身拥有特殊的性质,使用条件略为苛刻,但可以给我们很多启发。
积性函数的前缀和
todo