一些积性函数相关的简单筛法


useless algorithm 警告…

综述

记录了一些利用筛法求积性函数的方法.

前置知识

数论函数

数论函数指定义域为正整数, 陪域为复数的函数. 下面是几个常用的数论函数.

幂函数

特别地, 当 $k = 1$ 时, 记 $\operatorname{Id} = \operatorname{Id}_1(n) = n$.

单位函数

其中 $[P]$ 在 $P$ 为真时值为 $1$, $P$ 为假时值为 $0$.

常数函数

积性函数

若数论函数 $f$ 满足

  1. $f(1) = 1$.

  2. 当 $a$ 和 $b$ 互质 (也记作 $a\perp b$), 即 $\gcd(a, b) = 1$ 时, 有 $f(ab) = f(a)\cdot f(b)$.

则称 $f$ 为积性函数. 特别地, 在此基础上如果 $f$ 还满足对于任意正整数 $a$, $b$ 均有 $f(ab) = f(a)\cdot f(b)$, 则称 $f$ 为完全积性函数.

狄利克雷卷积

对于数论函数 $f$ 与 $g$, 若数论函数 $h$ 满足

则称 $h$ 为 $f$ 与 $g$ 的狄利克雷卷积, 记作 $h = f\ast g$.

狄利克雷卷积满足结合律, 交换律以及分配律. 此外, 对于任意数论函数 $f$ 有 $f\ast\epsilon = \epsilon\ast f = f$.

埃氏筛 / 埃拉托斯特尼筛

假定现在需要得到 $1$ 到 $n$ 中的所有质数, 一个直接的筛法是从 $2$ 到 $n$ 枚举整数 $i$, 那么除去 $i$ 外的所有 $i$ 的倍数一定是合数. 如果枚举到 $i$ 时该数还没有被标记为合数, 那么 $i$ 为合数. 根据调和级数这样做的时间复杂度为 $O(n\log n)$.

如果在上述过程中只枚举质数的倍数, 就可以得到埃氏筛. 由唯一分解定理可知这样做是对的. 埃氏筛的时间复杂度为

证明可参考 https://oi-wiki.org/math/number-theory/sieve/.

1
2
3
4
5
6
7
8
9
10
11
void eratosthenes(int n) {
vector<int> npr(n), pr;
npr[1] = true;
for (int i = 2; i < n; ++i) {
if (!npr[i]) {
pr.push_back(i);
for (int j = 2 * i; j < n; j += i)
npr[j] = true;
}
}
}

后文的 min_25 筛一定程度上是埃氏筛的拓展.

欧拉筛

仍然考虑如何得到 $1$ 到 $n$ 中的所有质数. 从 $2$ 到 $n$ 枚举整数 $i$, 并依次枚举小于等于 $i$ 的所有质数 $p$. 显然 $i\cdot p$ 一定是合数. 同时, 为了避免一个数被重复标记, 此处希望 $p$ 是 $i\cdot p$ 的最小质因子, 因此当 $i \bmod p = 0$ 时就停止枚举.

这就是欧拉筛. 考虑到每个合数只会被对应的最小质因子标记一次, 欧拉筛的时间复杂度为 $O(n)$.

1
2
3
4
5
6
7
8
9
10
11
12
void euler(int n) {
vector<int> npr(n), pr;
npr[1] = true;
for (int i = 2; i < n; ++i) {
if (!npr[i]) pr.push_back(i);
for (int j = 0; j < (int) pr.size() && i * pr[j] < n; ++j) {
npr[i * pr[j]] = true;
// pr[j] 是 i * pr[j] 的最小质因子
if (i % pr[j] == 0) break;
}
}
}

一个重要的性质在于, 通过欧拉筛可以得到每个数的最小质因子. 凭借此点可以在 $O(n)$ 的时间复杂度内得到诸多积性函数前 $n$ 项的值. 譬如

约数函数

显然这一系列函数都是积性函数, 下面先来讨论 $k$ 为 $0$ 和 $1$ 的两种情况.

约数个数函数

当 $k=0$ 时, 常用 $d(n)$ 来表示 $\sigma_0(n)$. 此时 $d(n)$ 的含义是 $n$ 的约数个数.

对于正整数 $n$, 由唯一分解定理设 $n$ 可表示为

其中 $p_i$ 为质数. 那么 $d(n)$ 可表示为

这就提供了一种计算 $d(n)$ 的方法, 设 $g(n)$ 表示 $n$ 的最小质因子对 $d(n)$ 的贡献, 也就是最小质因子的相应指数再加 $1$. 考虑欧拉筛的过程, 有

  • $d(1) = 1$, $g(1) = 1$.

  • 若 $i$ 为质数, 有 $d(i) = 2$, $g(i) = 2$.

  • 若 $i$ 不为质数, 分两种情况讨论:

    • $i \bmod p_j \neq 0$

      此时 $p_j$ 为 $i\cdot p_j$ 的最小质因子, 且 $i\perp p_j$, 故有

    • $i \bmod p_j = 0$

      此时 $p_j$ 仍为 $i\cdot p_j$ 的最小质因子, 但对应的指数大于 $1$. 可以利用 $g(i)$ 来更新, 具体而言, 有 $g(i\cdot p_j) = g(i) + 1$. 根据上文的式子, $d(i)$ 和 $d(i \cdot p_j)$ 之间只有 $p_j$ 参与的部分存在不同. 因此有

另外, 有这样一个流传甚广的表格. 可以看到在 $n$ 很大的时候 $d(n)$ 并不是特别大. 其中的 $\omega(n)$ 表示 $n$ 的不同质因子的个数.

约数和函数

当 $k=1$ 时, 常用 $\sigma(n)$ 来表示 $\sigma_1(n)$. 此时 $\sigma(n)$ 的含义是 $n$ 的所有约数之和.

同 $d(n)$ 类似, 约数和 $\sigma(n)$ 可以表示为

记 $n$ 的最小质因子为 $p$, 对应指数为 $c$. 同样设 $g(n)$ 表示 $p$ 对答案的贡献. 则有

接下来的过程和 $d(n)$ 几乎相同. 同样的思路可以在 $k \ge 1$ 的情况下沿用. 实际上, 对于任意质数 $p$ 有

凭借上式以及唯一分解定理就可以解决 $k\ge 1$ 的情况.

欧拉函数

记 $\varphi(n)$ 表示小于等于 $n$ 且同 $n$ 互质的正整数的个数. 即

这个形式看不出什么性质, 接下来将进一步推导出一个同 $n$ 的质因数分解相关的形式. 考虑到对于任意质数 $p$, 有

这是很好理解的. 若一个数同 $p$ 的某个幂次 $p^k$ 不互质, 这个数一定是 $p$ 的倍数, 同时在小于等于 $p^k$ 的范围内这个倍数存在 $p^{k-1}$ 个, 故 $\varphi(p^k) = p^k-p^{k-1}$.

又因为 $\varphi(n)$ 为积性函数, 故对于正整数 $n$, 有

接下来分情况讨论就好了, 讨论过程可以参考 $d(n)$.

莫比乌斯函数

换言之, 对于 $n > 1$, 如果 $n$ 不含有平方因子, 那么 $\mu(n) = (-1)^s$, 其中 $s$ 表示 $n$ 不同质因子的个数; 如果 $n$ 含有平方因子, 那么 $\mu(n) = 0$.

同样地, 接下来分情况讨论就好了.

总而言之, 对于积性函数 $f$, 记 $n$ 的最小质因子为 $p$, 对应次数为 $c$, 且 $n \neq p^c$, 则 $p^c \perp n/p^c$, 因此 $f(n) = f(p^c)f(n/p^c)$. 借此就可以利用欧拉筛计算 $f$.

杜教筛

杜教筛借助了狄利克雷卷积的一些性质, 可以在 $O(n^{2/3})$ 的时间复杂度内计算某些积性函数的前缀和.

欧拉函数

首先有性质 $\operatorname{Id} = \varphi\ast 1$. 这是因为

考虑枚举 $1$ 到 $n$ 中每个整数 $k$ 和 $n$ 的最大公约数 $d$, 有

此外也可以利用 $(\varphi\ast 1)(p^k) = p^k$ 以及 $\operatorname{Id}_k$ 的完全积性来证明.

记 $\phi(n) = \sum_{k=1}^n \varphi(k)$. 则

因此

只需用利用 $\lfloor\frac{n}{d}\rfloor$ 的 $O(\sqrt n)$ 种不同就取值就能够计算出 $\phi(n)$, 可以用记忆化搜索来实现, 空间复杂度为 $O(\sqrt{n})$. 此外, 计算一处 $\phi(n)$ 的时间复杂度为 $O(\sqrt{n})$, 即数论分块合并答案的时间复杂度. 记总体的时间复杂度为 $T(n)$, 则

如果用欧拉筛预处理 $\phi$ 前 $S$ 项, 且 $S > \sqrt n$, 则有

取 $S = n^{2/3}$, 则 $T(n) = O(n^{2/3})$, 此时的空间复杂度也是 $O(n^{2/3})$. 更为细致的复杂度分析可参考 杜教筛的时空复杂度分析 - riteme.site.

莫比乌斯函数

对于莫比乌斯函数, 则有 $\epsilon = \mu\ast 1$. 下面分两种情况证明这个结论.

当 $n = 1$ 时, 有 $\epsilon(1) = \mu(1) = 1$.

当 $n > 1$ 时, 有 $\epsilon(n) = 0$. 设 $n$ 有 $s$ 个不同质因子, 对于 $n$ 的约数 $d$, 如果 $d$ 能对和式的值产生贡献, 即 $\mu(d) \neq 0$, 则 $d$ 一定是若干 $n$ 的质因子的乘积. 枚举选择的质因子个数 $k$, 有

综上有 $\epsilon = \mu \ast 1$.

另外, 考虑到 $\epsilon \ast f = f$, 若 $g=f\ast 1$, 则有 $g\ast\mu=f\ast 1\ast\mu = f$, 即

其实就是所谓的莫比乌斯反演.

记 $M(n) = \sum_{k=1}^n \mu(k)$, 利用

借助于分析 $\phi(n)$ 时同样的思路可以得到

约数个数函数

虽然有 $\sigma_k = \operatorname{Id}_k \ast 1$, 但是

直接数论分块就好了, 剩余部分就是正整数的 $k$ 次方和.

稍微一般的形式

对于数论函数 $f$ 与 $g$, 记 $F(n) = \sum_{k=1}^n f(k)$, 则

因此

在求 $\phi$ 与 $M$ 的过程中, $g$ 可以在 $O(1)$ 的时间复杂度内计算. 实际上, 如果 $f$, $g$, $f\ast g$ 三者的前缀和中存在两个可以在不劣于杜教筛的时间复杂度内计算, 就可以利用杜教筛计算第三个.

Powerful Number 筛

高中的时候听都没听过的东西. 以及终于不是用人名来命名了…

咕咕咕…

洲阁筛

咕咕咕…

min_25 筛

咕咕咕…

参考资料