莫比乌斯函数介绍&&基础

定义

设正整数$N$按照算术基本定理分解质因数为$N=p_1^{c_1}p_2^{c_2} \cdots P_m^{c_m}$,定义函数:

$$\mu(N)= \left\{\begin{matrix}
0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ c_i \geq 1  \\
1 \ \ \ \ \ \ \  m\equiv 0(mod 2)), c_i=1 \\
-1\ \ \ \  \ m\equiv 0(mod 2)), c_i=1
\end{matrix}\right.$$

称$\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 \right \rfloor * 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 }

 

posted @ 2019-07-12 11:40  Rogn  阅读(1134)  评论(0编辑  收藏  举报