首页 > 代码库 > 莫比乌斯反演
莫比乌斯反演
莫比乌斯反演在许多情况下可以简化运算。
定理:F(n)和f(n)是定义在非负整数集合上的两个函数,并且满足条件F(n)=∑d|n f(d)。
附:∑d|n 的意思是对所有n的因子d求和。
那么,我们得到结论:
f(n)=∑d|n μ(d)F(n/d)
在上面的公式中有一个μ(d)函数(莫比乌斯函数),它的定义如下:
(1) 若d==1,那么μ(d)=1;
(2) 若d=p1p2p3...pk,pi均为互异素数,那么μ(d)=(-1)k次方;
(3) 其他情况下μ(d)=0;
对于μ(d)函数,它有如下常见性质:
(1) 对任意正整数n有:∑d|n μ(d)= 1 if(n==1) else if(n>1) =0
(2) 对任意正整数n有:∑d|n μ(d)/d = φ(n)/n
用线性筛法求莫比乌斯函数的代码:
bool vis[10045];//标记数组,是否是素数 int n,cnt,prime[10045],mu[10045];//n是范围,cnt是素数个数,prime是素数数组,mu是该数的莫比乌斯函数 void init() { mu[1]=1;//1的莫比乌斯函数是1 for(int i=2;i<=n;i++) { if(!vis[i])//如果是素数 { mu[i]=-1;//k=1,所以该数的莫比乌斯函数是-1 prime[++cnt]=i;//记录素数 } for(int j=1;j<=cnt&&i*prime[j]<=n;j++)//遍历之前的素数,并且i*prime[j]在n的范围内 { vis[i*prime[j]]=1;//合数 if(i%prime[j])//如果i是素数 mu[i*prime[j]]=-mu[i];//k+1,所以莫比乌斯函数取相反数 else { mu[i*prime[j]]=0;//其他情况莫比乌斯函数为0 break; } } } }
接下来是莫比乌斯反演定理的证明:
恒等变形得:
f(n)=∑d|nμ(d)F(nd)=∑d|nμ(d)∑k|ndf(k)=∑k|nf(k)∑d|nkμ(d)
因为之前证明的这个定理:
∑d|nμ(d)={10n==1n>1
所以当且仅当nk=1,即n=k时,∑d|nkμ(d)=1,其余时候等于0。
故
∑k|nf(k)∑d|nkμ(d)=f(n)
莫比乌斯反演
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。