狄利克雷卷积和积性函数
数论函数#
数论函数指定义域为正整数,值域是一个数集且满足 的函数。我们可以将数论函数看作一个数列。
设有 两个数论函数,有几种常见运算:
- 加法:
- 数乘:
- 乘法:
- 复合:
此外,加法、数乘和乘法运算满足交换律、结合律、分配律和消去律。
狄利克雷卷积(Dirichlet)#
定义#
对于两个数论函数 ,他们的狄利克雷卷积也是一个数论函数,我们记为 ,则 。
定义为:
狄利克雷卷积符合交换律、结合律和分配律:
- 交换律:
- 结合律:
- 分配律:
单位元:单位函数 是狄利克雷卷积运算中的单位元,即对于任何数论函数 ,都有 。
逆元:对于任何一个满足 的数论函数,如果有另一个数论函数 满足 ,则称 是 的逆元,逆元是唯一的。
重要结论#
两个积性函数的狄利克雷卷积也是积性函数#
证明: 设两个积性函数为 和 ,再记 。
设 ,则:
所以:
证毕。
积性函数的逆元也是积性函数#
几个常见数论函数的例子:
积性函数#
定义#
若函数 满足 且 都有 ,则 为积性函数。
若函数 满足 且 都有 ,则 为完全积性函数。
性质#
若 和 均为积性函数,则有:
均为积性函数。
若 为积性函数,则有 ;若 为完全积性函数,则有 。
常见积性函数#
- 单位函数(元函数):。
- 欧拉函数:,表示小于 的正整数中与 互质的数的个数。
- 幂函数:,特别的,,。
- 除数函数:,特别的,。
- 莫比乌斯函数:,其中 表示 的本质不同的质因子个数。 是一个加性函数。这里指数论中的加性函数,对于 ,有 。
筛法求积性函数#
容易发现,这些积性函数的自变量取值为质数时,都可以简单地 求出,那我们可以利用积性函数的性质求出函数值。
欧拉函数#
首先我们知道,当 为质数时,显然有
欧拉函数有一种计算方法
- 考虑 ,那么 就已经包含了 的所有质因子。
- 考虑 ,此时 与 是互质的,有“
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;
}
}
}
}
莫比乌斯函数#
当 为质数时,它只有 一个质因数,所以 。
当 为合数时:
- 若 ,那么 一定含有不只一个 ,所以 ;
- 若 ,那么 就是 的新质因数,本质不同的质因数数量增加,所以 。
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 ;
}
约数个数()#
记 为 的约数个数, 为 的最小质因子出现的次数。
约数个数定理#
若 ,则有 。
我们知道 的约数有 共 个,根据乘法原理, 的约数个数为 。
实现#
若当前数为质数,
若 :#
此时 中已经存在 这个质因子,且 也一定是 的最小质因子,所以
那么如何从 转移呢?
也需要转移
若 :#
那么 原本一定不包含 这个质因数,所以约数个数要加上 产生的贡献。
一定是 的最小质因子,所以有
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 ;
}
约数和()#
记 表示 的约数和。
由算数基本定理可得
约数和定理:
的约数有 个,
一般积性函数#
对于一般积性函数 ,我们考虑如何筛。
- 考虑素数部分;
- 以 和 两种分类求出非素数部分。
我们知道 一定是 的最小质因子,又因为对于 有算术基本定理可以得到 。
有以下两种情况(即上面写的两种讨论分类):
- ,即
i % prime[j] == 0
- ,即
i % prime[j] != 0
对于第一种情况, 的质因子与 的质因子相同,最小质因子的指数比 大 ,即 ;
对于第二种情况,因为 ,所以 与 一定互质。则有 。
(以上只是大概的模板总结,实际情况具体分析)
参考资料#
作者:白简
出处:https://www.cnblogs.com/baijian0212/p/17641981.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异