质数·积性函数·筛法
质数
定义
大于 1 的、只被 1 和它本身整除的正整数
唯一分解定理
对于正整数 n,我们一定可以将其写为若干个质数的幂的乘积形式
即
其中pipi是质数
同时该分解是唯一的
积性函数
数论函数
若有函数f(n)f(n) 的定义域为正整数,值域为复数,称为数论函数
积性函数
若数论函数f(n)f(n)满足:对于互质的p、qp、q,有 f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q)称为积性函数
进一步地,若数论函数 f(n)f(n) 满足:对于任意 p、qp、q,有 f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q)称为完全积性函数
积性函数f(1)=1f(1)=1
积性函数的乘积也是积性函数
常见的积性函数
除数函数σk(n)σk(n),表示n的约数的k次幂和
约数和函数σ1(n)σ1(n),或σ(n)σ(n)
约数个数函数τ(n)τ(n),一般也写为d(n)d(n)
欧拉函数φ(n)φ(n)
莫比乌斯函数μ(n)μ(n)
元函数ee,这是一个由命题映射到N的特殊函数,e[P]=1当且仅当P为真,否则e[P]=0
狄利克雷卷积单位函数
常函数1(n)=11(n)=1
单位函数id(n)=nid(n)=n
加粗为完全积性函数
欧拉函数
若
则
两个重要的结论
- ∑d|nφ(d)=n∑d|nφ(d)=n
- 在[1,n][1,n]中,满足gcd(x,n)=ndgcd(x,n)=nd的xx有个
- ∑(d,n)=1d=n⋅φ(n)2∑(d,n)=1d=n⋅φ(n)2
- 除φ(1)φ(1),欧拉函数都是偶数
- 若(x,n)=1(x,n)=1,那么(n−x,n)=1(n−x,n)=1
莫比乌斯函数
重要结论
∑d|nμ(d)=ε(n)∑d|nμ(d)=ε(n)
证明:
- n=1,显然成立
n>1
首先不需要考虑含有平方因子的d
- 也就是说,如果n=∏pdiin=∏pidi,那么相当于n=∏pin=∏pi
- ∑d|nμ(d)=(−1)∑ki=1&i%2=1Cin+1∑ki=0&i%2=0Cin=0∑d|nμ(d)=(−1)∑i=1&i%2=1kCni+1∑i=0&i%2=0kCni=0
- 当n>1时,ε(n)=0ε(n)=0
Dirichlet卷积
简单来说,就是一种运算
h(n)h(n)即为f,g两个函数狄利克雷卷积后得到的新函数
性质
1.积性函数的狄利克雷卷积仍然满足积性
2.完全积性函数的狄利克雷卷积不一定满足完全积性
3.Dirichlet 卷积同时也具有交换律、分配律
4.Dirichlet 卷积运算存在单位元:f⋅ε=ε⋅f=ff⋅ε=ε⋅f=f
h(n)=∑d|nf(d)ε(nd)=f(n)h(n)=∑d|nf(d)ε(nd)=f(n)
筛法
筛法的重点不是筛什么,而是筛的顺序
比如埃氏筛和线性筛虽然大部分情况用于筛素数
但是其思想可以被运用到更广的领域
一些题会需要你在可以接受的复杂度内筛出需要的函数
这就需要筛法的思想
埃拉托斯特尼筛
筛素数
for(int i=2;i<=e;++i)
if(!vis[i])
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
复杂度O(nloglogn)O(nloglogn)
以下证明其复杂度不超过O(nln(n))O(nln(n))
∑ni=1ni=n∑ni=11i∑i=1nni=n∑i=1n1i
Hn=∑i=11iHn=∑i=11i
Hn∼ln(n)Hn∼ln(n)
∴∑ni=1ni≤nln(n)∴∑i=1nni≤nln(n)
形如埃氏筛的循环方式的复杂度O(nln(n))O(nln(n))
筛欧拉函数
void euler(){
for(int i=1;i<=n;++i) phi[i]=i;
for(int i=2;i<=n;++i)
if(phi[i]==i)
for(int j=i;j<=n;j+=i) //必须从i开始
phi[j]=phi[j]/i*(i-1);
}
与筛素数的区别在于,一个数只要被标记一次即可认定它不是素数
而欧拉函数的计算必须考虑n的所有质因子的贡献
线性筛
一种复杂度O(n)O(n),基于积性函数的筛法
用处非常多,需要在理解的基础上记忆代码
筛素数
for(int i=2;i<=n;++i){
if(!vis[i]) p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=n;++j){
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
所以为什么是O(n)O(n)的?
每个数只会被其最小的质因子筛掉
break的原因:如果此时已经有i%p[j]==0,那么p[j+1],p[j+2]…就不可能再是i*p[j+1],i *p[j+2]的最小质因子
筛欧拉函数
phi[1]=1;
for(int i=2;i<=N;++i){
if(!vis[i]){
pri[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&1ll*i*pri[j]<=N;++j){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
phi,pri不要手残打反QWQ
解释一下第九行
此时的pri[j]pri[j]一定是i⋅pri[j]i⋅pri[j]的最小质因子
φ(i)=n⋅∏(1−1pj)φ(i)=n⋅∏(1−1pj)
1−1pri[j]1−1pri[j]已经计算过
∴φ(i⋅phi[j])=phi[j]⋅φ(i)∴φ(i⋅phi[j])=phi[j]⋅φ(i)
筛莫比乌斯函数
mu[1]=1;
for(int i=2;i<=N;++i){
if(!vis[i]){
pri[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot&&1ll*i*pri[j]<=N;++j){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
}
基本上来说,线性筛积性函数只需要关注三个地方
质数怎么办,枚举到最小质因子怎么办,互质怎么办
莫比乌斯反演
还记得∑d|nμ(d)=ε(n)∑d|nμ(d)=ε(n)吗
另外,f⋅ε=ff⋅ε=f
⋅⋅表示狄利克雷卷积(未必准确)
利用这些结论,如何证明:
若已知g(m)=∑d|mf(d)g(m)=∑d|mf(d),如何推出f(m)=∑d|mg(d)μ(md)f(m)=∑d|mg(d)μ(md)
- ∑d|mg(d)μ(md)=∑d|mμ(d)g(md)=∑d|mμ(d)∑d′|(m/d)f(d′)=∑d′|mf(d′)∑d|(m/d′)μ(d)=∑d′|mf(d′)⋅e[m/d′=1]=f(m)∑d|mg(d)μ(md)=∑d|mμ(d)g(md)=∑d|mμ(d)∑d′|(m/d)f(d′)=∑d′|mf(d′)∑d|(m/d′)μ(d)=∑d′|mf(d′)⋅e[m/d′=1]=f(m)
若已知f(m)=∑d|mg(d)μ(md)f(m)=∑d|mg(d)μ(md),如何推出g(m)=∑d|mf(d)g(m)=∑d|mf(d)
∑d|mf(d)=∑d|m∑d′|dg(d′)μ(dd′)=∑d′|mg(d′)∑d|(m/d′)μ(d)=∑d′|mg(d′)⋅e[m/d′=1]=g(m)∑d|mf(d)=∑d|m∑d′|dg(d′)μ(dd′)=∑d′|mg(d′)∑d|(m/d′)μ(d)=∑d′|mg(d′)⋅e[m/d′=1]=g(m)
以上便是莫比乌斯反演定理
即
当然,利用μ⋅1=ϵμ⋅1=ϵ可以简单的推导:
若f⋅1=g若f⋅1=g
∴f⋅1⋅μ=g⋅μ∴f⋅1⋅μ=g⋅μ
∴f=g⋅μ∴f=g⋅μ
若g⋅μ=f若g⋅μ=f
∴g⋅μ⋅1=f⋅1∴g⋅μ⋅1=f⋅1
∴f⋅1=g∴f⋅1=g
比如现在有∑d|nφ(d)=n∑d|nφ(d)=n
可以表示成∑d|nφ(d)⋅1(n/d)=id(n)∑d|nφ(d)⋅1(n/d)=id(n)
可以得出φ(n)=∑d|nμ(d)id(nd)φ(n)=∑d|nμ(d)id(nd)
另一个角度理解这个式子
尝试理解其实际含义,就像理解组合恒等式的实际意义
φ(12)=12φ(1)+6φ(2)+4φ(3)+3φ(4)+2φ(6)+1φ(12)φ(12)=12φ(1)+6φ(2)+4φ(3)+3φ(4)+2φ(6)+1φ(12)
=12−6−4+0+2+0=4=12−6−4+0+2+0=4
对于一个数m=∏ki=1pim=∏i=1kpi
其中∀pi∀pi是n的质因子
m对φ(n)φ(n)的贡献为:
−C1k+C2k−C3k⋯=−C0k=−1−Ck1+Ck2−Ck3⋯=−Ck0=−1
而这个数确实不是与n互质的数
莫比乌斯函数是与容斥原理有关的
有些题目同时可以从反演和容斥两个角度思考