定义
设正整数$N$按照算术基本定理分解质因数为$N=p_1^{c_1}p_2^{c_2} cdots P_m^{c_m}$,定义函数:
$$mu(N)= left{egin{matrix}
0 c_i geq 1 \
1 mequiv 0(mod 2)), c_i=1 \
-1 mequiv 0(mod 2)), c_i=1
end{matrix}
ight.$$
称$mu(N)$为Mobius函数(莫比乌斯函数).
通俗地讲,当$N$包含相等的质因子时,$mu(N)=0$。当$N$的所有质因子各不相同时,若$N$有偶数个质因子,$mu(N)=1$,若$N$有奇数个,$mu(N)=-1$.
实现
若只求一项Mobius函数,则分解质因数即可。若求$1 sim N$的每一项Mobius函数,可以利用$Eratosthenes$筛法。把所有$mu$初始化为1。接下来,对于筛出的每个质数$p$,令$mu(p)=-1$,并扫描$p$的倍数 $x=2p, 3p, cdots,left lfloor n/p ight floor * p$,检查$x$能否被$p^2$整除。若能,则令$mu(x)=0$,否则令$mu(x) = - mu(x)$.
1 void getmiu(int n) 2 { 3 for(int i=1;i <= n;i++) miu[i]=1, vis[i]; 4 for(int i=2;i <= n;i++) 5 { 6 if(vis[i]) continue; 7 miu[i] = -1; //i没有被访问,说明i是素数 8 for(int j = 2*i; j <= n;j += i) 9 { 10 vis[j] = 1; 11 if(j % (i*i) == 0) miu[j] = 0; //含有平方因子 12 else miu[j] *= -1; 13 } 14 } 15 }