前言:之前一直没有系统的学习过积性函数相关的知识,这方面过于依赖队友,从而不知不觉降低了对自己的要求,深感惭愧,因此补上。
参考文献:国家集训队2016论文集 - 任之洲
1.定义
1.1 定义域为正整数,陪域为复数域的函数是数论函数,以下所讨论的都是数论函数。
1.2 若f(x)为数论函数,且对于任何互质数a, b,满足f(a)*f(b) = f(a*b),则f(x)为积性函数。
1.3 若f(x)为数论函数,且对于任意正整数a, b, 满足f(a)*f(b) = f(a*b),则f(x)为完全积性函数。
μ
μ
,莫比乌斯函数。
ϵ
ϵ
, 单位函数。
2. 线性筛
每个数只会被最小质因子给标记一次,考虑到这个因素,复杂度是O(n)的。
2.1 筛最小质因子
const int maxn = 11000000;
int tag[maxn], min_f[maxn];
vector<int> G;
void shai() {
for(int i = 2; i < maxn; i++) {
if(!tag[i]) G.push_back(i), min_f[i] = i;
for(int j = 0; j < G.size() && i * G[j] < maxn; j++) {
min_f[i*G[j]] = G[j];
tag[i*G[j]] = 1;
if(i % G[j] == 0) break;
}
}
}
2.2 线性筛积性函数
const int maxn = 11000000;
int tag[maxn], min_f[maxn];
vector<int> G;
void shai() {
for(int i = 2; i < maxn; i++) {
if(!tag[i]) G.push_back(i);
for(int j = 0; j < G.size() && i * G[j] < maxn; j++) {
tag[i*G[j]] = 1;
if(i % G[j] == 0) {
//G[j]与i不互质,此时利用函数性质计算
break;
}
//G[j]与i互质,此时利用积性函数性质递推
f[G[j]*i] = f[G[j]]*f[i];
}
}
}
3. 莫比乌斯反演
3.1 Dirichlet卷积
为了证明莫比乌斯反演,我们需要先清楚什么是Dirichlet卷积。
定义:对于两个数论函数f(x), g(x)的Dirichlet卷积,写作
(f∗g)(x)
(
f
∗
g
)
(
x
)
。
Dirichlet卷积满足:
1. 交换律 f∗g=g∗f f ∗ g = g ∗ f
2. 单位元 ϵ∗f=f ϵ ∗ f = f
至于我们为什么要知道这个呢?因为我们需要用到这个东西去帮助我们证明莫比乌斯反演。
3.2 莫比乌斯反演
引理:
μ∗1=ϵ
μ
∗
1
=
ϵ
,即为
Proof:设n有k种不同的质因子,因此结合莫比乌斯函数的性质,我们只需要考虑n的因子中能对答案有贡献的这部分即可。
随后把这部分二项式展开
定理:如果两个数论函数f, g满足
则他们也满足
Proof:
两侧卷上 μ μ ,由上述引理和Dirichlet卷积的交换律,单位元可得
未完待续..