Loading [MathJax]/jax/output/CommonHTML/autoload/mtable.js
Fork me on GitHub

莫比乌斯反演

莫比乌斯函数

定义

dd进行质因数分解:d=pr11pr22pr33····prkkd=pr11pr22pr33prkk
r=max{r1,r2,r3···rk}r=max{r1,r2,r3rk}
莫比乌斯函数的定义为

μ(d)={1d=10r>1(1)kr=1

也就是说

  • d=1时,μ(d)=1
  • d质因数分解后,若质因子中的最大次数大于一,μ(d)=0
  • d质因数分解后,质因子中的最大次数等于一,也就是d=p1p2p3···pk时,μ(d)=(1)kk为质因子的个数

举个栗子:
μ(1)=1μ(3)=(1)1=1μ(6)=(1)2=1μ(4)=0

性质

性质1
对于任意正整数n,有dnμ(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

dnμ(d)=mr=0(1)iCrm

然后根据二项式定理:

(x+y)m=mr=0Crmxmryr

x=1,y=1,可得:

mr=0Crm(1)r=mr=0Crm(1)mr(1)r=(1+1)m=0

由此得证


性质2
对于任意正整数n均有

dnμ(d)d=ϕ(n)n


证明:

ϕ(n)=ni=1[gcd(i,n)==1]

这时根据性质1

ϕ(n)=ni=1dgcd(i,j)μ(d)

然后先枚举最大公约数

ϕ(n)=dnindi=dμ(d)=dnμ(d)indi=d1=dnμ(d)nd=dnμ(d)nd

得到

ϕ(n)n=dnμ(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)=dnf(d)

则有反演:

f(n)=dnμ(d)F(nd)


证明:
F(nd)带入得

dnμ(d)F(nd)=dn(μ(d)kndf(k))

观察后面的式子,发现要满足nd÷k=0,所以实际上就是要求

k×d=n

那我们就可以理解为对于所有的二元组(μ(d),f(k))都能被枚举到
所以我们枚举k, 式子就变成了

kn(f(k)kdnμ(d))

再转换一下,变成

kn(f(k)dnkμ(d))

然后根据莫比乌斯函数的性质1
只有当k=n时,dnkμ(d)=1,其余情况为0
于是原式=f(n)


莫比乌斯反演的另一种形式:
F(n)=ndf(d)

f(n)=ndf(d)μ(dn)

posted @   Chrety  阅读(335)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示