狄利克雷卷积和积性函数
数论函数
数论函数指定义域为正整数,值域是一个数集且满足 \(f(1) \neq 0\) 的函数。我们可以将数论函数看作一个数列。
设有 \(f(n),g(n)\) 两个数论函数,有几种常见运算:
- 加法:\((f+ g)(n)=f(n)+g(n)\)
- 数乘:\((af)(n)=a \cdot f(n)\)
- 乘法:\((f \cdot g)(n)=f(n) \cdot g(n)\)
- 复合:\(f(g)(n)=f(g(n))\)
此外,加法、数乘和乘法运算满足交换律、结合律、分配律和消去律。
狄利克雷卷积(Dirichlet)
定义
对于两个数论函数 \(f,g\),他们的狄利克雷卷积也是一个数论函数,我们记为 \(h\),则 \(h=f * g\)。
\(h\) 定义为:
狄利克雷卷积符合交换律、结合律和分配律:
- 交换律:
- 结合律:
- 分配律:
单位元:单位函数 \(\epsilon\) 是狄利克雷卷积运算中的单位元,即对于任何数论函数 \(f\),都有 \(f * \epsilon=f\)。
逆元:对于任何一个满足 \(f(x)\neq 0\) 的数论函数,如果有另一个数论函数 \(g(n)\) 满足 \(f * g = \epsilon\),则称 \(g(n)\) 是 \(f(n)\) 的逆元,逆元是唯一的。
重要结论
两个积性函数的狄利克雷卷积也是积性函数
证明: 设两个积性函数为 \(f(x)\) 和 \(g(x)\),再记 \(h=f*g\)。
设 \(\gcd(a,b)=1\),则:
所以:
证毕。
积性函数的逆元也是积性函数
几个常见数论函数的例子:
积性函数
定义
若函数 \(f(n)\) 满足 \(f(1)=1\) 且 \(\forall x,y\in\mathbf{N}^+,\gcd(x,y)=1\) 都有 \(f(xy)=f(x)f(y)\),则 \(f(n)\) 为积性函数。
若函数 \(f(n)\) 满足 \(f(1)=1\) 且 \(\forall x,y\in\mathbf{N}^+\) 都有 \(f(xy)=f(x)f(y)\),则 \(f(n)\) 为完全积性函数。
性质
若 \(f(x)\) 和 \(g(x)\) 均为积性函数,则有:
- \(h(x)=f(x^p)\)
- \(h(x)=f^p(x)\)
- \(h(x)=f(x)g(x)\)
- \(h(x)=\sum_{d\mid x}f(d)g\left(\dfrac{x}{d}\right)\)
均为积性函数。
若 \(f(x)\) 为积性函数,则有 \(f(x)=\prod f(p_i^{k_i})\);若 \(f(x)\) 为完全积性函数,则有 \(f(x)=\prod f(p_i)^{k_i}\)。
常见积性函数
- 单位函数(元函数):\(\epsilon(n)=[n=1]\)。
- 欧拉函数:\(\varphi(n)\),表示小于 \(n\) 的正整数中与 \(n\) 互质的数的个数。
- 幂函数:\(\operatorname{id}_k(n)=x^k\),特别的,\(\operatorname{1}(x)=1\),\(\operatorname{id}(x)=x\)。
- 除数函数:\(\sigma_k(x)=\sum_{d \mid x}d^k\),特别的,\(\sigma(x)=\sum_{d \mid x}d\)。
- 莫比乌斯函数:\(\mu(n)=\begin{cases}1&n=1\\0&\exists d>1,d^{2}\mid n\\(-1)^{\omega(n)}&\text{otherwise}\end{cases}\),其中 \(\omega(n)\) 表示 \(n\) 的本质不同的质因子个数。\(\omega(n)\) 是一个加性函数。这里指数论中的加性函数,对于 \(\gcd(a,b)=1\),有 \(f(ab) = f(a)+f(b)\)。
筛法求积性函数
容易发现,这些积性函数的自变量取值为质数时,都可以简单地 \(\operatorname{O}(1)\) 求出,那我们可以利用积性函数的性质求出函数值。
欧拉函数
首先我们知道,当 \(p\) 为质数时,显然有
欧拉函数有一种计算方法
- 考虑 \(p \mid n'\),那么 \(n'\) 就已经包含了 \(n\) 的所有质因子。
- 考虑 \(p \nmid n'\),此时 \(n'\) 与 \(p\) 是互质的,有“
void Eular()// 线性筛求欧拉函数
{
for(int i = 1;i <= MAXN; i++)
isprime[i] = 1;
isprime[1] = 0;
phi[1] = 1;
for(int i = 2;i <= MAXN; i++) {
if(isprime[i]) {
prime[++cnt] = i;
phi[i] = i - 1;
}
for(int j = 1;j <= cnt and i * prime[j] <= MAXN; j++) {
isprime[i * prime[j]] = 0;
if(i % prime[j] != 0)
phi[i * prime[j]] = phi[i] * phi[prime[j]];
else {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
}
莫比乌斯函数
当 \(x\) 为质数时,它只有 \(x\) 一个质因数,所以 \(\mu(x)=-1\)。
当 \(x\) 为合数时:
- 若 \(p \mid x\),那么 \(p \times i\) 一定含有不只一个 \(p\),所以 \(\mu(i \times p)=0\);
- 若 \(p \nmid x\),那么 \(p\) 就是 \(p \times i\) 的新质因数,本质不同的质因数数量增加,所以 \(\mu(p \times i)=-\mu(i)\)。
void GetMu() {
p[1] = 1;
mu[1] = 1;
for(int i = 2;i < N; i++) {
if(p[i] == 0) {
pri[++cnt] = i;
mu[i] = -1;
}
for(int j = 1;j <= cnt && i * pri[j] < N; j++) {
p[i * pri[j]] = 1;
if(i % pri[j] == 0)
break;
mu[i * pri[j]] = -mu[i];
}
}
return ;
}
约数个数(\(\sigma_0\))
记 \(d_i\) 为 \(i\) 的约数个数,\(num_i\) 为 \(i\) 的最小质因子出现的次数。
约数个数定理
若 \(n=\prod^{m}_{i=1}p_i^{c_i}\),则有 \(d_i=\prod^m_{i=1}(c_i+1)\)。
我们知道 \(p_i^{c_i}\) 的约数有 \(p_i^0,p_i^1,\dots,p_i^{c_i}\) 共 \(c_i+1\) 个,根据乘法原理,\(n\) 的约数个数为 \(\prod^m_{i=1}(c_i+1)\)。
实现
若当前数为质数,
若 \(prime_j \mid i\):
此时 \(i \times prime_j\) 中已经存在 \(prime_j\) 这个质因子,且 \(prime_j\) 也一定是 \(i \times prime_j\) 的最小质因子,所以
那么如何从 \(d_i\) 转移呢?
\(num\) 也需要转移
若 \(prime_j \nmid i\):
那么 \(i \times prime_j\) 原本一定不包含 \(prime_j\) 这个质因数,所以约数个数要加上 \(prime_j\) 产生的贡献。
\(prime_j\) 一定是 \(i \times prime_j\) 的最小质因子,所以有
void Seive(int M) {
d[1] = 1;
for(int i = 2;i <= M; i++) {
if(!p[i]) {
cnt ++;
prime[cnt] = i;
d[i] = 2;
num[i] = 1;
}
for(int j = 1;j <= cnt && i * prime[j] <= M; j++) {
p[i * prime[j]] = 1;
if(i % prime[j] == 0) {
num[i * prime[j]] = num[i] + 1;
d[i * prime[j]] = d[i] / num[i * prime[j]] * (num[i * prime[j]] + 1);
break;
}
num[i * prime[j]] = 1;
d[i * prime[j]] = d[i] * 2;
}
}
return ;
}
约数和(\(\sigma_1\))
记 \(sigma_n\) 表示 \(n\) 的约数和。
由算数基本定理可得
约数和定理:
\[sigma_n=(p_1^0+p_1^1+\cdots +p_1^{c_1})\cdot (p_2^0+p_2^1+\cdots +p_2^{c_2}) \cdots(p_k^0+p_k^1+\cdots+p_k^{c_k}) \]
\(p_1^{c_1}\) 的约数有 \(c_1+1\) 个,
一般积性函数
对于一般积性函数 \(f\),我们考虑如何筛。
- 考虑素数部分;
- 以 \(p \mid x\) 和 \(p \nmid x\) 两种分类求出非素数部分。
我们知道 \(prime_j\) 一定是 \(i \times prime_j\) 的最小质因子,又因为对于 \(i\) 有算术基本定理可以得到 \(i=p_1^{k_1}p_2^{k_2} \dots p_n^{k_n}\)。
有以下两种情况(即上面写的两种讨论分类):
- \(prime_j=p_1\),即
i % prime[j] == 0
- \(prime_j < p_1\),即
i % prime[j] != 0
对于第一种情况,\(i \times prime_j\) 的质因子与 \(i\) 的质因子相同,最小质因子的指数比 \(i\) 大 \(1\),即 \(p_1(i \times prime_j)=p_1(i) +1\);
对于第二种情况,因为 \(prime_j < p_1\),所以 \(prime_j\) 与 \(i\) 一定互质。则有 \(f(i \times prime_j)=f(i) \cdot f(prime_j)\)。
(以上只是大概的模板总结,实际情况具体分析)