莫比乌斯反演
莫比乌斯函数
定义
对dd进行质因数分解:d=pr11pr22pr33····prkkd=pr11pr22pr33⋅⋅⋅⋅prkk
r=max{r1,r2,r3···rk}r=max{r1,r2,r3⋅⋅⋅rk}
莫比乌斯函数的定义为
μ(d)={1d=10r>1(−1)kr=1
也就是说
- 当d=1时,μ(d)=1
- 当d质因数分解后,若质因子中的最大次数大于一,μ(d)=0
- 当d质因数分解后,质因子中的最大次数等于一,也就是d=p1p2p3···pk时,μ(d)=(−1)k,k为质因子的个数
举个栗子:
μ(1)=1μ(3)=(−1)1=−1μ(6)=(−1)2=1μ(4)=0
性质
性质1:
对于任意正整数n,有∑d∣nμ(d)=[n=1][n=1]表示当n=1的时候值为1,否则值为0。
证明(请教于wby大佬):
当n=1时,显然。
考虑n>1的情况,n=pk11ok22pk33···pkmm
根据定义显然只有当k1=k2=k3=···km=1时有贡献,否则为0。
我们就只讨论有贡献的情况;
设n的因子d中有i个质因子,μ(d)=(−1)r,因为d的质因子一定是n的质因子,从m个质因子中选出i的质因子的组合数就为Crm。
∑d∣nμ(d)=m∑r=0(−1)iCrm
然后根据二项式定理:
(x+y)m=m∑r=0Crmxm−ryr
令x=1,y=−1,可得:
m∑r=0Crm(−1)r=m∑r=0Crm(1)m−r(−1)r=(−1+1)m=0
由此得证
性质2:
对于任意正整数n均有
∑d∣nμ(d)d=ϕ(n)n
证明:
ϕ(n)=n∑i=1[gcd(i,n)==1]
这时根据性质1
ϕ(n)=n∑i=1∑d∣gcd(i,j)μ(d)
然后先枚举最大公约数
ϕ(n)=∑d∣ni≤n∑d∣i=dμ(d)=∑d∣nμ(d)i≤n∑d∣i=d1=∑d∣nμ(d)nd=∑d∣nμ(d)nd
得到
ϕ(n)n=∑d∣nμ(d)d
板子
只需要在筛法上加四句话
void shai(int n) {
mu[1] = 1; //定义mu[1]=1
for(int i = 2; i <= n; i++) {
if (!vis[i]) p[++num] = i, mu[i] = -1; //mu质数=-1
for (int j = 1; j <= num; j++) {
if (i * p[j] > n) break;
vis[i * p[j]] = 1;
if (!i % p[j]) { //i%p[j]==0说明i有p[j]这个因子,所以i*p[j]=0
mu[i * p[j]] = 0;
break;
} else mu[i * p[j]] = -mu[i]; //有多了一个质因子,所以取负
}
}
}
莫比乌斯反演
略微说明了一下莫比乌斯函数函数后,就迎来最重要的内容,莫比乌斯反演。
定义:
如果F(n),f(n)是数论函数,且满足
F(n)=∑d∣nf(d)
则有反演:
f(n)=∑d∣nμ(d)F(nd)
证明:
将F(nd)带入得
∑d∣nμ(d)F(nd)=∑d∣n(μ(d)∑k∣ndf(k))
观察后面的式子,发现要满足nd÷k=0,所以实际上就是要求
k×d=n
那我们就可以理解为对于所有的二元组(μ(d),f(k))都能被枚举到
所以我们枚举k, 式子就变成了
∑k∣n(f(k)∑k∗d∣nμ(d))
再转换一下,变成
∑k∣n(f(k)∑d∣nkμ(d))
然后根据莫比乌斯函数的性质1
只有当k=n时,∑d∣nkμ(d)=1,其余情况为0;
于是原式=f(n)
莫比乌斯反演的另一种形式:
当F(n)=∑n∣df(d)时
f(n)=∑n∣df(d)μ(dn)
如果哪里有错误或不易理解,还请不吝赐教
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!