1.莫比乌斯函数与莫比乌斯反演
O.约定
\colorboxred本blog中所有的分数,无论有无下取整符号,均默认下取整。
主要是因为我太懒了,下取整符号的LATEX表达式太长了
I.作用
设有一函数g(n)=∑d|nf(d)。
显然,如果我们知道每个f(d)的值,那么g(n)的值应该是很容易得到的废话,不就按照定义瞎递推一下吗
那么如果我们知道每个g(n)的值,又应该如何求出f(d)来呢?
II.定义
我们引出莫比乌斯函数μ(x)。
定义:
设x可以被质因数分解成n∏i=1(ai)pi,则
μ(x)={0(∃i∈[1,n],pi>1)(−1)n(∀i∈[1,n],pi=1)
换句话说,如果这个x包含某一个质数的平方或更高次数项,则μ(x)=0;否则,如果它包含偶数个质因数,μ(x)=1;否则,即它包含奇数个质因数,μ(x)=−1。
这个形式诡异的函数有什么用吗?
III.性质
1.μ(x)是积性函数。即,
∀gcd(i,j)=1,μ(i∗j)=μ(i)∗μ(j)
因此,我们可以采用欧拉筛线性求它。
就是按照它的定义来求,因为积性函数都可以在线性筛时顺便求出。
int mu[N],pri[N];
void getmu(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!pri[i])pri[++pri[0]]=i,mu[i]=-1;
for(int j=1;i*pri[j]<=n&&j<=pri[0];j++){
pri[i*pri[j]]=true;
if(!(i%pri[j]))break;
mu[i*pri[j]]=-mu[i];
}
}
}
2.(最重要)
∑d|xμ(d)={1(x=1)0(x≠1)
证:
当x=1时,由定义,显然成立。
否则,设x=n∏i=1(ai)pi。
对于它的每一个因数d,只有当d=n∏i=1(ai)pi,pi∈{0,1}时,才有μ(d)≠0。
如果d包含m个质因数,则μ(d)=(−1)m。在所有x的因数中,共有Cmn个这样的d。
也就是说,∑d|xμ(d)=n∑m=0(−1)mCmn
依据某奇妙的二项式定理,这个东西有n∑m=0(−1)mCmn=(1−1)n=0。
证毕。
IV.反演
正片开始。
回到我们一开始的说法。莫比乌斯反演对于g(n)=∑d|nf(d)的函数f和g,假使我们知道每个g(n)的值,我们就可以反推出f(d)的值。
反演定理I:
如果g(n)=∑d|nf(d),那么f(x)=∑d|ng(d)μ(nd)
证:
如果f(x)=∑d|ng(d)μ(nd),
则一定有f(x)=∑d|ng(nd)μ(d)
在∑d|ng(nd)μ(d)中代入g(x)的定义g(x)=∑d|nf(d),
得∑d|ng(nd)μ(d)=∑d|n(∑i|ndf(i))μ(d)=∑d|n(∑i∗d|nf(i))μ(d)
我们将μ(d)乘进括号,得
∑d|ng(nd)μ(d)=∑d|n(∑i∗d|nf(i)μ(d))
然后发现这个实际上的意思就是枚举所有的i和d,求f(i)μ(d)的和。
因此有∑d|ng(nd)μ(d)=∑i|n(∑i∗d|nf(i)μ(d))=∑i|nf(i)(∑i∗d|nμ(d))
看一下后面的∑i∗d|nμ(d),有∑i∗d|nμ(d)=∑d|niμ(d)。
是不是很熟悉?当ni=1,即i=n时,该式值为1;否则,值为0。
则∑i|nf(i)(∑i∗d|nμ(d))=f(n)。因为i≠n时后面的东西都是0。
证毕。
反演定理II:
如果g(n)=∑n|df(d),那么f(x)=∑n|dg(d)μ(dn)。
证法类似,也是把g(d)暴力代回去得证。留给读者自证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?