zoukankan      html  css  js  c++  java
  • 莫比乌斯反演

     莫比乌斯反演在许多情况下可以简化运算。

    定理: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)
    PEACE
  • 相关阅读:
    序列化注意事项
    HTML5的新结构标签
    MVC模型
    CSS选择器权重计算规则
    HTML常用布局
    盒模型
    Spring Security 学习笔记-session并发控制
    java实例之随机点名
    java之方法重载
    java之方法
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/7197410.html
Copyright © 2011-2022 走看看