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


    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)\)暴力代回去得证。留给读者自证。

  • 相关阅读:
    背包问题
    基本TCP套接字编程
    P中值选址问题的整数规划求解
    Leapms + cplex解决 混合整数规划问题
    如何用整数规划求解NP完全问题
    用Leapms建摸 / 用 CPLEX 求解 旅行商问题 整数规划问题
    用线性规划建模(确定参数)关键路径法
    流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模
    Wolsey "强整数规划“ 建模的+Leapms实践——无产能批量问题
    Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题
  • 原文地址:https://www.cnblogs.com/Troverld/p/14619478.html
Copyright © 2020-2023  润新知