莫比乌斯函数与莫比乌斯反演
以下笔记整理自:《算法设计编程实验》吴永辉
1.结论
1.1 莫比乌斯函数:莫比乌斯函数可以看做一个辅助函数,它在莫比乌斯反演公式中用到。
1.2 莫比乌斯反演:莫比乌斯反演公式是 根据和函数来求算数函数的一个公式。
1.3 算数函数:所有在正整数上运算的函数称为算数函数。
1.4 和函数:设 f 是算数函数,f 的和函数为。其中d为n的约数,所以 f 的和函数F(n)就是n的所有约数的算数函数之和。
1.5 总结:如果我们已知和函数,想求其对应的算数函数,那么我们可以根据和函数的定义来反推其算数函数,反推出的公式叫莫比乌斯反演公式。又因为莫比乌斯反演公式具有普适性与抽象性(即对求每个算数函数,该公式都适用),为了达到这种普适性,需要一个辅助函数,就叫做莫比乌斯函数,它本质上是和函数的系数。
2.前置概念
2.1 欧拉函数:定义自寻。设n的欧拉函数为phi(n)。
2.2 积性函数:定义自寻。欧拉函数是积性函数,但不是完全积性函数。
2.3 欧拉函数公式:
- 如果p是一个素数,且k是正整数,则phi(p^k) = p^k - p^(k-1)。
- 如果m和n是互素的正整数,则phi(mn) = phi(m)*phi(n)。
2.4 唯一分解定理:即任意一个自然数n都可以分解为若干个素数之积(没说不同素数啊)。
3.莫比乌斯函数
3.1 莫比乌斯函数的作用:见1.1。
3.2 莫比乌斯函数的定义:
如果n有平方因子,则;如果n没有平方因子,并且分解后有奇数个素因子,则
;如果n没有平方因子,且分解后有偶数个素因子,则
。
3.3 莫比乌斯函数求法(伪代码):
3.4 代码实例:
#include<cstdio>
const int maxn = 1e5;
int v[maxn],miu[maxn];
void mobius(int n){
for(int i = 1;i <= n;i++) miu[i] = 1,v[i] = 0;
for(int i = 1;i <= n;i++){
if(v[i]) continue;
miu[i] = -1;
for(int j = 2*i;j <= n;j += i){
v[j] = 1;
if((j/i)%i == 0) miu[j] = 0;
else miu[j] *= -1;
}
}
}
int main(){
mobius(maxn);
}
4.莫比乌斯反演公式
4.1 莫比乌斯反演公式:设f是算数函数,F是f的和函数,,则
,其中n是正整数。
4.2