• 莫比乌斯函数与莫比乌斯反演学习笔记


    1.莫比乌斯函数与莫比乌斯反演

    O.约定

    \(\color{white}\colorbox{red}{本blog中所有的分数,无论有无下取整符号,均默认下取整。}\)

    主要是因为我太懒了,下取整符号的\(\LaTeX\)表达式太长了

    I.作用

    设有一函数\(g(n)=\sum\limits_{d|n}f(d)\)

    显然,如果我们知道每个\(f(d)\)的值,那么\(g(n)\)的值应该是很容易得到的废话,不就按照定义瞎递推一下吗

    那么如果我们知道每个\(g(n)\)的值,又应该如何求出\(f(d)\)来呢?

    II.定义

    我们引出莫比乌斯函数\(\mu(x)\)

    定义:

    \(x\)可以被质因数分解成\(\prod\limits_{i=1}^n(a_i)^{p_i}\),则

    \(\boxed{\mu(x)=\begin{cases}0(\exists i\in[1,n],p_i>1)\\(-1)^n(\forall i \in[1,n],p_i=1)\end{cases}}\)

    换句话说,如果这个\(x\)包含某一个质数的平方或更高次数项,则\(\mu(x)=0\);否则,如果它包含偶数个质因数,\(\mu(x)=1\);否则,即它包含奇数个质因数,\(\mu(x)=-1\)

    这个形式诡异的函数有什么用吗?

    III.性质

    1.\(\mu(x)\)是积性函数。即,

    \(\boxed{\forall \gcd(i,j)=1,\mu(i*j)=\mu(i)*\mu(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.(最重要)

    \(\boxed{\sum\limits_{d|x}\mu(d)=\begin{cases}1(x=1)\\0(x\neq1)\end{cases}}\)

    证:

    \(x=1\)时,由定义,显然成立。

    否则,设\(x=\prod\limits_{i=1}^n(a_i)^{p_i}\)

    对于它的每一个因数\(d\),只有当\(d=\prod\limits_{i=1}^n(a_i)^{p_i},p_i\in\{0,1\}\)时,才有\(\mu(d)\neq 0\)

    如果\(d\)包含\(m\)个质因数,则\(\mu(d)=(-1)^m\)。在所有\(x\)的因数中,共有\(C_n^m\)个这样的\(d\)

    也就是说,\(\sum\limits_{d|x}\mu(d)=\sum\limits_{m=0}^n(-1)^mC_n^m\)

    依据某奇妙的二项式定理,这个东西有\(\sum\limits_{m=0}^n(-1)^mC_n^m=(1-1)^n=0\)

    证毕。

    IV.反演

    正片开始。

    回到我们一开始的说法。莫比乌斯反演对于\(g(n)=\sum\limits_{d|n}f(d)\)的函数\(f\)\(g\),假使我们知道每个\(g(n)\)的值,我们就可以反推出\(f(d)\)的值。

    反演定理I:

    \(\boxed{\text{如果}g(n)=\sum\limits_{d|n}f(d), \text{那么}f(x)=\sum\limits_{d|n}g(d)\mu(\dfrac{n}{d})}\)

    证:

    如果\(f(x)=\sum\limits_{d|n}g(d)\mu(\dfrac{n}{d})\)

    则一定有\(f(x)=\sum\limits_{d|n}g(\dfrac{n}{d})\mu(d)\)

    \(\sum\limits_{d|n}g(\dfrac{n}{d})\mu(d)\)中代入\(g(x)\)的定义\(g(x)=\sum\limits_{d|n}f(d)\)

    \(\sum\limits_{d|n}g(\dfrac{n}{d})\mu(d)=\sum\limits_{d|n}(\sum\limits_{i|\frac{n}{d}}f(i))\mu(d)=\sum\limits_{d|n}(\sum\limits_{i*d|n}f(i))\mu(d)\)

    我们将\(\mu(d)\)乘进括号,得

    \(\sum\limits_{d|n}g(\dfrac{n}{d})\mu(d)=\sum\limits_{d|n}(\sum\limits_{i*d|n}f(i)\mu(d))\)

    然后发现这个实际上的意思就是枚举所有的\(i\)\(d\),求\(f(i)\mu(d)\)的和。

    因此有\(\sum\limits_{d|n}g(\dfrac{n}{d})\mu(d)=\sum\limits_{i|n}(\sum\limits_{i*d|n}f(i)\mu(d))=\sum\limits_{i|n}f(i)(\sum\limits_{i*d|n}\mu(d))\)

    看一下后面的\(\sum\limits_{i*d|n}\mu(d)\),有\(\sum\limits_{i*d|n}\mu(d)=\sum\limits_{d|\frac{n}{i}}\mu(d)\)

    是不是很熟悉?当\(\frac{n}{i}=1\),即\(i=n\)时,该式值为\(1\);否则,值为\(0\)

    \(\sum\limits_{i|n}f(i)(\sum\limits_{i*d|n}\mu(d))=f(n)\)。因为\(i\neq n\)时后面的东西都是\(0\)

    证毕。

    反演定理II:

    \(\boxed{\text{如果}g(n)=\sum\limits_{n|d}f(d),\text{那么}f(x)=\sum\limits_{n|d}g(d)\mu(\dfrac{d}{n})}\)

    证法类似,也是把\(g(d)\)暴力代回去得证。留给读者自证。

  • 相关阅读:
    Javascript的私有变量和方法、共有变量和方法以及特权方法、构造器、静态共有属性和静态共有方法
    Spring4整合Hibernate4出现的错误的解决
    Javascript类的创建
    Kettle学习总结(一)
    Kettle Excel导入数据到数据库
    Python 爬虫 2 (转)
    Js仿腾讯微博效果
    飘雪效果
    列表获取对应图片
    飞入购物车
  • 原文地址:https://www.cnblogs.com/Troverld/p/14619478.html
Copyright © 2020-2023  润新知