莫比乌斯反演

莫比乌斯反演在数论中占有重要的地位,许多情况下能大大简化运算,特别是对于求解gcd的问题。

在学习莫比乌斯反演之前,我们先了解下积性函数。

积性函数

定义:定义域为N+ 的函数 f,对于任意两个互质的正整数a, b: gcd(a, b) = 1,均满足f(ab) = f(a) ∗ f(b),则函数f 被称为积性函数。假如对于任意两个正整数a, b 均有f(ab) = f(a) ∗ f(b),则称f 为完全积性函数。

欧拉函数是积性函数,但不是完全积性函数。

积性函数的性质

• f(1) = 1

• 考虑一个大于1 的正整数N,设N = piai ,其中 pi 为互不相同的质数,那么对于一个积性函数 f, f(N) = f(piai) =  f(piai) , 如果f 还满足完全积性,则 f(N) =  f(pi)ai

• 若 f(n), g(n) 均为积性函数,则函数h(n) = f(n)g(n) 也为积性函数。

• 若 f(n) 为积性函数,则函数F(n) = Σd|n f(d) 也是积性函数,反之亦然。

 

莫比乌斯反演

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

这是莫比乌斯反演的一般描述,即:

而在算法竞赛中,我们常用的是它的另一种描述:

 

 

其中为莫比乌斯函数,它的定义如下:

(1)若,那么

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

(3)其它情况下

 

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

(1)对任意正整数

                        

证明
① 当n == 1 时显然
② 当n ! = 1 时,将 n 分解可以得到 

在 n 的所有因子中,µ值不为零的只有所有质因子次数都为1的因子,其中质因数个数为 r 个的因子有
那么显然有:

只需证明    即可

二项式定理:

令  x = 1 , y = -1,代入即可得证。

 

(2)对任意正整数

         

证明

只需要令,代入莫比乌斯反演的公式即可

由欧拉函数的性质可得,结论得证。

 

现在我们来证明莫比乌斯反演定理。

证明

这里我们利用了  这条性质。

 

线性筛选求莫比乌斯反演函数:

 

 1 int vis[maxn];
 2 int prime[maxn];
 3 int cnt;
 4 int mu[maxn];
 5 
 6 void init()
 7 {
 8     memset(vis,0,sizeof(vis));
 9     cnt=0;
10     mu[1]=1;
11     for(int i=2;i<maxn;i++)
12     {
13         if(!vis[i])
14         {
15             prime[cnt++]=i;
16             mu[i]=-1;
17         }
18         for(int j=0;j<cnt&&i*prime[j]<maxn;j++)
19         {
20             vis[i*prime[j]]=1;
21             if(i%prime[j])
22                 mu[i*prime[j]]=-mu[i];
23             else
24             {
25                 mu[i*prime[j]]=0;
26                 break;
27             }
28         }
29     }
30 }

 

posted @ 2016-11-03 22:21  邀月独斟  阅读(291)  评论(0编辑  收藏  举报