• 欧拉函数线性求解以及莫比乌斯反演(Mobius)


    前言

    咕咕了好久终于来学习莫反了
    要不是不让在机房谁会发现数学一本通上有这么神奇的东西
    就是没有性质的证明
    然后花了两节数学课证明了一遍
    舒服~
    前置知识:欧拉函数,二项式定理(组合数)
    会欧拉函数的可以直接看(Mobius)

    欧拉函数

    含义

    (phi (n)) 表示比(n)小的数中与(n)互质的数的个数

    引理1

    • (n)为质数,(phi(n) = n - 1)
    • (n=a*b)((a, b) = 1),则(phi(n) = phi(a) * phi(b))
    • 对于一个质数(n)(a)次方 (phi(n^a) = (n - 1) * n^{a-1})

    现对于第三条性质给出证明

    • (n^a)小的数有(n^a - 1)
    • 其中能整除的表示为(n* t (t = 1, 2, ... n ^{a-1}-1))
    • 总计有(n^{a-1}-1)个数能被整除
    • 则与其互质的数的个数为(phi(p^a) = (p^a-1) - (p^{a-1}-1) = p^a - p^{a-1} = (p-1) * p^{a-1})

    引理2

    对于质数(n),唯一分解定理 (n = {p_1}^{c_1} * {p_2} ^{c_2}...{p_k}^{c_k})
    (phi(n) = n * (1- frac 1 {p_1}) * (1- frac 1 {p_2}) ... (1- frac 1 {p_k}))
    (a)(m)互质,(a^{phi(m)} equiv 1 (mod ; m))

    线性筛

    根据上述性质,推出

    • (p)为质数,(phi (p) = p - 1)
    • (if(i \% p == 0) : phi(i*p)=p*phi(i))
    • (if(i \% p ; != 0) : phi(i*p)=phi(i)*(p -1))

    code

    inline void pre(int n){
    	phi[1] = 1;
    	for(int i = 2; i <= n; i++){
    		if(!vis[i]){
    			prime[++cnt] = i;
    			phi[i] = i - 1;
    		}
    		for(int j = 1; j <= cnt && i * prime[j] <= n; j++){
    			vis[i * prime[j]] = 1;
    			if(i % prime[j] == 0){
    				phi[i * prime[j]] = phi[i] * prime[j];
    				break;
    			}
    			else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
    		}
    	}
    }
    

    莫比乌斯反演(Mobius)

    定义

    对于非负整数集合上的两个函数(F(n))(f(n)),若满足条件(F(n)=sum_{d|n}f(d))
    $$f(n)=sum_{d|n}mu(d)F(frac n d)$$

    (mu)函数

    定义如下

    • (d=1)(mu(d)=1)
    • (d=p_1p_2p_3...p_k)均为互异质数,则(mu(d)=(-1)^k)
    • 其他情况(mu(d)=0)

    性质一

    [ sum_{d|n}mu(d) = egin{cases} 1, & ext n=1 \ 0, & ext n>1 end{cases} ]

    证明:
    (n)为质数,显然(sum=0)
    (n)为合数,根据唯一分解定理

    [n = {p_1}^{c_1} * {p_2} ^{c_2}...{p_k}^{c_k} ]

    (n)的因子(d)只能是(p_1p_2,p_1p_3,p_3p_k)诸如此类
    可以发现(d)的构造来自于(k)个质因子中选取了(i)

    • (k)为奇数即(n)中包含奇数个质因子
      (k)中选出奇数个因子,(mu)值为-1,对答案贡献为(-sum_{i=1}^kC_k^i(i+=2))
      (k)中选出偶数个因子,(mu)值为1,对答案贡献为(sum_{i=2}^{k-1}C_k^i(i+=2))
      两种情况加和化简得(-C_k^k=-1)
      (sum = -1 + mu(1)=-1+1=0)
      得证
    • k为偶数即(n)中包含偶数个质因子
      同理可得(sum=0)

    性质二

    [ sum_{d|n} frac {mu(d)} {d} = frac {phi(n)} {n} ]

    证明:
    同上将(n)质因数分解,同时将等号右侧

    [frac {phi(n)} n = (1- frac 1 {p_1}) * (1- frac 1 {p_2}) ... (1- frac 1 {p_k}) ]

    [= frac {(p_1-1)(p_2-1)...(p_k-1)} {p_1p_2...p_k} ]

    同样的,对(k)的奇偶性分类讨论

    • (k)为奇数
      • 从分子中选取奇数个质因子组成类似于(p_1p_2p_3)
        由于剩下了奇数-奇数=偶数个括号,那么在多项式展开式中该项的常数项(不包含其他质因子)系数一定为(1)
        与分母约分得到(frac {1}{ ext {偶数个质因子的积}})
        根据(mu)函数的性质可以知道,该化简式等于(frac {mu( ext 分母)} { ext 分母})
      • 同理,从中选取偶数个质因子得到的化简结果为
        (frac {1}{ ext {奇数个质因子的积}})
        该化简式也等于(frac {mu( ext 分母)} { ext 分母})
      • 当然,分子展开式当中必包含一项(p_1p_2...p_k= ext 分母)
        约分结果显然为(1=mu(1)/1)

    综上所述$$frac {phi(n)}{n}= (1- frac 1 {p_1}) * (1- frac 1 {p_2}) ... (1- frac 1 {p_k})$$

    [=frac {(p_1-1)(p_2-1)...(p_k-1)} {p_1p_2...p_k} ]

    [=1+frac {mu(d)} {d}(d eq 1,d|n) ]

    [=frac {mu(1)}{1} +frac {mu(d)} {d}(d eq 1,d|n) ]

    [= sum_{d|n} frac {mu(d)}{d} ]

    原命题得证

    • (k)为偶数
      同理即可证明

    [frac {phi(n)}{n}= (1- frac 1 {p_1}) * (1- frac 1 {p_2}) ... (1- frac 1 {p_k})= sum_{d|n} frac {mu(d)}{d} ]

    原命题得证

    反演证明

    目标性质$$f(n)=sum_{d|n}mu(d)F(frac n d)$$
    证明:
    (F(n))(f(n))的关系(F(n)=sum_{d|n}f(d))将等式推导:

    [sum_{d|n}mu(d)F(frac n d)=sum_{d|n}mu(d)sum_{d'|frac n d}f(d') ]

    [=sum_{d|n}sum_{d'|frac n d}mu(d)f(d') ]

    可见只有满足((d*d')|n)时,函数对答案有贡献
    那么不妨交换(d)(d')的位置(理解成范围也行)

    [=sum_{d'|n}sum_{d|frac n {d'}}mu(d)f(d') ]

    [=sum_{d|frac n {d'}}mu(d)sum_{d'|n}f(d') ]

    再观察式子,根据(mu(d))(1)(0)的性质,来考虑(d')为何值时对答案有贡献
    可见当且仅当(d'=n)(d=frac {n}{d'}=1)时,(mu(d)=1)该式不为(0)
    否则式子值为(0)对答案无贡献

    [=1*sum_{n|n}f(n) ]

    [=f(n) ]

    综上所述

    [sum_{d|n}mu(d)F(frac n d)=f(n) ]

    原命题得证!

    小结

    关于(Mobius)的性质纸上推导了两天,建议多手模
    思维量不小~

  • 相关阅读:
    【Python】【文件】查找指定路径中是否存在目标文件(含此路径下的子文件夹)
    时隔一年的2020noip
    nacos 笔记
    webflux 小例子
    spring Initializr 笔记
    临时~spring启动过程
    Mac通过crontab设置定时任务报错Operation not permitted
    Isolation Forest Implementation(孤立森林)
    let arr=['a'] JSON.stringify(arr) 输出:“['a']” let arr2 = “['a']” JSON.parse(arr2) 输出: ['a']
    js对象中key值加引号和不加引号的区别
  • 原文地址:https://www.cnblogs.com/rui-4825/p/13751184.html
Copyright © 2020-2023  润新知