函数的定义
莫比乌斯函数 μ ( n ) \mu(n) μ(n)的定义为:
情况 | 函数值 |
---|---|
n = 1 n=1 n=1 | 1 1 1 |
n = p 1 × p 2 × p 3 … … × p m n=p_1\times p_2\times p_3……\times p_m n=p1×p2×p3……×pm | ( − 1 ) r (-1)^r (−1)r |
其他 | 0 |
其中
p
1
p_1
p1,
p
2
p_2
p2,
p
3
p_3
p3,
…
…
p
m
……p_m
……pm指的是
n
n
n的
m
m
m个质因数。
注意:这里的
p
1
p_1
p1,
p
2
p_2
p2,
p
3
p_3
p3,
…
…
p
m
……p_m
……pm指数都是只有
1
1
1的,也就是说每个质因数在
n
n
n中只有一个,只要出现了第二个,那么情况就是其他。
定理
对于莫比乌斯函数的和函数在整数
n
n
n处的值
F
(
n
)
=
F(n)=
F(n)=∑
d
∣
n
μ
(
d
)
_{d|n}\mu(d)
d∣nμ(d),满足
∑
d
∣
n
μ
(
d
)
=
{
1
,
n
=
1
0
,
n
>
1
\sum_{d|n}\mu(d) = \begin{cases}1,&n=1 \\0,&n>1\end{cases}
∑d∣nμ(d)={1,0,n=1n>1
证明
n
=
1
n=1
n=1时,显然有
F
(
1
)
=
F(1)=
F(1)=∑
d
∣
n
μ
(
1
)
=
1
_{d|n}\mu(1)=1
d∣nμ(1)=1
n
>
1
n>1
n>1时,根据积性函数的定义,有
F
(
n
)
=
F
(
p
1
a
1
)
F
(
p
2
a
2
)
…
F
(
p
t
a
t
)
F(n)=F(p_1^{a_1})F(p_2^{a_2}) \dots F(p_t^{a_t})
F(n)=F(p1a1)F(p2a2)…F(ptat),其中,
n
=
p
1
a
1
p
2
a
2
…
…
p
t
a
t
n=p_1^{a_1}p_2^{a_2}……p_t^{a_t}
n=p1a1p2a2……ptat 是质因数分解。如果能证明
F
(
p
k
)
=
0
F(p^k)=0
F(pk)=0,即有
F
(
n
)
=
0
F(n)=0
F(n)=0.因为当
i
≥
2
i \ge 2
i≥2时,
μ
(
p
i
)
=
0
\mu(p^i) = 0
μ(pi)=0,故有
F ( p k ) = F(p^k)= F(pk)=∑ d ∣ p k μ ( d ) = μ ( 1 ) + μ ( p ) + μ ( p 2 ) + ⋯ + μ ( p k ) = 1 + ( − 1 ) + 0 + 0 + … … + 0 = 0 _{d|p^k}\mu(d) = \mu(1)+\mu(p)+\mu(p^2)+\dots+\mu(p^k)=1+(-1)+0+0+……+0 = 0 d∣pkμ(d)=μ(1)+μ(p)+μ(p2)+⋯+μ(pk)=1+(−1)+0+0+……+0=0
单个计算
int mobius_function(int n){
if(n==1)return 1;
int ans=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
n/=i;
ans++;
}
while(n%i==0)return 0;
}
ans+=(n!=1);
return pow(-1,ans);
}
筛法(线性筛)
void mobius(int n){
vis[1]=1;
mob[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){//质数情况
p[++cnt]=i;
mob[i]=-1;
}
for(int j=1;j<=cnt&&p[j]*i<=n;j++){
vis[p[j]*i]=1;
mob[i*p[j]]=(i%p[j]?-mob[i]:0);
if(i%p[j]==0)break;
}
}
}