莫比乌斯反演
莫比乌斯反演在数论中占有重要的地位,许多情况下能大大简化运算,特别是对于求解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 }