引言:
莫比乌斯函数是为解决容斥原理问题而定义的数论函数,但其功能远远超出容斥原理的范围,可以通过由该函数衍生出的莫比乌斯反演化简很多复杂的式子,降低运算复杂度。但莫比乌斯反演需要一定的数学知识和推导能力,于是我在此介绍莫比乌斯函数及其应用。
摘要:
莫比乌斯函数与其他数论函数以狄利克雷卷积为纽带相互联系相互转化,构成莫比乌斯反演算法,可实现快速计算复杂和式。
正文:
莫比乌斯函数形式化的定义是:
通俗来讲,就是若含有平方因子,函数值为零;否则若有偶数个因子值为一,奇数为负一。这显然是一个积性函数。既然是积性函数,在互质时便可由已知函数值的集合导出位置的函数值,不断将位置集合的元素纳出已知集合,实现求解;而在非互质时便可由定义直接将函数值赋为0。结合线性筛法,可以在线性时间内计算 1~N 之间的所有函数值。多数数论函数都满足积性函数的性质,且在非互质时可使用特殊的方法快速求解,因此使用线性筛成为了计算许多数论函数值的手段。另外,如果只求单点函数值,直接分解质因数就行。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int v[N],p[N];
int mu[N],cnt;
inline void isprime(int maxV) {
mu[1]=1;
for(int i=2;i<=maxV;i++) {
if(!v[i])
v[i]=i,p[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt;j++) {
if(p[j]>v[i]||p[j]>maxV/i) break;
v[i*p[j]]=p[j];
if(i%p[j]) mu[i*p[j]]=-mu[i];
else mu[i*p[j]]=0;
}
}
for(int i=1;i<=maxV;i++)
printf("%d\n",mu[i]);
return;
}
int main(void)
{
isprime(1e3+7);
return 0;
}
当然只有这些是远远不够的,反演才是重中之重。首先介绍一个概念:狄利克雷卷积。其形式化的内容是:如果定义在自然数上的函数 满足
则可以推出
由此可以得到一些常用结论:
这就意味着莫比乌斯函数与其他数论函数,以及其他数论函数之间都可以以狄利克雷卷积为纽带相互转化。而迪利克雷卷积可实现将根号级复杂度向常数级的转变,这就是莫比乌斯反演可降低计算复杂度的原因所在。仔细考虑可以发现卷积满足交换结合律。
例题:
解析:
题目要求 ,显然可以转化为
。这不就是
函数吗?于是根据这个思路,进行反演。根据卷积公式,可以得到:
所以带入可得: