数论 莫比乌斯反演

来源:互联网 发布:手机usb共享网络给电脑 编辑:程序博客网 时间:2024/04/29 13:03

原创:http://blog.csdn.net/acdreamers/article/details/8542292


莫比乌斯反演在数论中占有重要的地位,许多情况下能大大简化运算。那么我们先来认识莫比乌斯反演公式。

 

定理:是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论

 

     

 

在上面的公式中有一个莫比乌斯函数,它的定义如下:

 

    (1)若,那么

    (2)若均为互异素数,那么

    (3)其它情况下


或者:

           1)莫比乌斯函数μ(n)的定义域是N    

      2)μ(1)=1
     3)当n存在平方因子时,μ(n)=0;(则 n = 4, 8, 9, 12等时,μ(n)=0);
     4)当n是素数或奇数个不同素数之积时,μ(n)=-1 ; (例如2, 3, 30=2*3*5;μ(2)=μ(3)=μ(30)=0)
     5)当n是偶数个不同素数之积时,μ(n)=1;(例如6=2*3;μ(6)=1);

 

对于函数,它有如下的常见性质:

 

    (1)对任意正整数

  

                            

 

        (2)对任意正整数

 

         

 

线性筛选求莫比乌斯函数μ(n)代码。

#include<stdio.h>#include<string.h>const int N=100;int vis[N+1];int mu[N+1];int prime[N+1];void Init(){    memset(vis,0,sizeof(vis));    mu[1] = 1;    int cnt = 0;    for(int i=2; i<N; i++)    {        if(!vis[i])        {            prime[cnt++] = i;            mu[i] = -1;//素数的莫比乌斯函数值为-1        }        for(int j=0; j<cnt && i*prime[j]<N; j++)        {            vis[i*prime[j]] = 1;            if(i%prime[j]) mu[i*prime[j]] = -mu[i];            else            {                mu[i*prime[j]] = 0;                break;            }        }    }}int main(){int i;Init();for(i=1;i<100;i++){printf("%d ",mu[i]);if(i%10==0){printf("\n");}}return 0;}


有了上面的知识,现在我们来证明莫比乌斯反演定理。

 

证明

 

证明完毕!


我们知道莫比乌斯反演的一般描述为:

 

     

 

     其实它还有另一种描述,本题也是用到这种。那就是:

 

     


0 0