前言
最近学了莫比乌斯反演和一点狄利克雷卷积,感觉很难,也是看了很多博客才有点明,写一篇博客帮助自己理解。
作者当初写莫反笔记的时候,异想天开地想让没学过数论或者刚接触数论的同学学会莫比乌斯反演,于是有了这一篇博客。
这篇文章稍微有点难度的可能是积性函数部分。其他都是水货。
本篇为数论基础内容,学习过数论的可以跳过到这里。
由于数论大多基于正整数讨论,故除特殊说明外,本文所有变量都为正整数。
前置知识
模
定义
模是一种运算,与加、减、乘、除、乘方、开方同为最常用的
7
7
7种运算。
取
a
/
b
a/b
a/b的余数,称为
a
a
a模
b
b
b,一般记为
a
m
o
d
b
a\bmod b
amodb或
a
%
b
a\%b
a%b
模运算的优先度等于乘除法。
性质
1、分配律:
(
a
±
b
)
%
p
=
(
a
%
p
±
b
%
p
)
%
p
(a\pm b)\%p=(a\%p\pm b\%p)\%p
(a±b)%p=(a%p±b%p)%p
(
a
×
b
)
%
p
=
(
a
%
p
×
b
%
p
)
%
p
(a\times b)\% p=(a\%p\times b\%p)\%p
(a×b)%p=(a%p×b%p)%p
a
b
%
p
=
(
a
%
p
)
b
%
c
a^b\%p=(a\%p)^b\%c
ab%p=(a%p)b%c
分配律告诉我们,在大部分取模的题目中,每一次计算都取模是正确的。
2、放缩性:
若
a
%
p
=
b
a\%p=b
a%p=b,则
(
a
×
c
)
%
(
p
×
c
)
=
b
×
c
(a\times c)\%(p\times c)=b\times c
(a×c)%(p×c)=b×c
若
a
%
p
=
b
a\%p=b
a%p=b,
a
%
c
=
0
,
b
%
c
=
0
a\%c=0,b\%c=0
a%c=0,b%c=0,则
a
c
%
p
c
=
b
c
\dfrac a c\%\dfrac p c=\dfrac b c
ca%cp=cb
整除
定义
若自然数 n n n 和 m m m 满足 n % m = 0 n\%m=0 n%m=0,即 n n n除以 m m m的余数为 0 0 0,则称 m m m 整除 n n n,记为 m ∣ n m|n m∣n,注意其中 n n n 为被除数, m m m为除数.
性质
1、若
a
∣
b
,
b
∣
c
a|b,b|c
a∣b,b∣c,则
a
∣
c
a|c
a∣c
证明:
基础。设
k
1
a
=
b
,
k
2
b
=
c
k_1a=b,k_2b=c
k1a=b,k2b=c,则
k
2
⋅
k
1
a
=
c
k_2\cdot k_1a=c
k2⋅k1a=c,即
a
∣
c
a|c
a∣c.
这是整除证明中的大部分思路,将整除关系转化为倍数关系证明。
2、若
a
∣
b
,
a
∣
c
a|b,a|c
a∣b,a∣c,则
a
∣
b
c
a|bc
a∣bc
3、若
a
∣
c
,
b
∣
c
a|c,b|c
a∣c,b∣c 且
a
a
a与
b
b
b互质,则
a
b
∣
c
ab|c
ab∣c
4、若
a
∣
b
,
b
∣
a
a|b,b|a
a∣b,b∣a,则
a
=
b
a=b
a=b
同余
定义
若 n % p = m % p n\%p=m\%p n%p=m%p,即 n , m n,m n,m除以 p p p的余数相等,称 n , m n,m n,m在模 p p p意义下同余,记为 n ≡ m m o d p n\equiv m\mod p n≡mmodp.
性质
1、
a
≡
a
m
o
d
p
a\equiv a\mod p
a≡amodp
2、若
a
≡
b
m
o
d
p
a\equiv b\mod p
a≡bmodp,则
b
≡
a
m
o
d
p
b\equiv a\mod p
b≡amodp
3、若
n
≡
m
m
o
d
p
n\equiv m\mod p
n≡mmodp,
n
+
a
1
p
≡
m
+
a
2
p
≡
n
≡
m
m
o
d
p
n+a_1p\equiv m+a_2p\equiv n\equiv m\mod p
n+a1p≡m+a2p≡n≡mmodp
证明:
n
=
k
1
p
+
q
,
m
=
k
2
p
+
q
n=k_1p+q,m=k_2p+q
n=k1p+q,m=k2p+q,
n
+
a
1
p
=
(
k
1
+
a
1
)
p
+
q
n+a_1p=(k_1+a_1)p+q
n+a1p=(k1+a1)p+q,所以
n
+
a
1
p
≡
n
m
o
d
p
n+a_1p\equiv n\mod p
n+a1p≡nmodp,
m
m
m与
m
+
a
2
p
m+a_2p
m+a2p同理。
这也是同余证明的大部分思路,将同余关系转化为我们熟悉的倍数和关系证明。
4、若
a
≡
b
m
o
d
p
,
c
≡
d
m
o
d
p
a\equiv b\mod p,c\equiv d\mod p
a≡bmodp,c≡dmodp,则
a
±
c
≡
b
±
d
m
o
d
p
,
a
c
≡
b
d
m
o
d
p
a\pm c\equiv b\pm d\mod p,ac\equiv bd\mod p
a±c≡b±dmodp,ac≡bdmodp
5、若
a
c
≡
b
c
m
o
d
p
,
c
≠
0
ac\equiv bc\mod p,c\ne 0
ac≡bcmodp,c=0,则
a
≡
b
m
o
d
p
(
p
,
c
)
a\equiv b\mod \dfrac p {(p,c)}
a≡bmod(p,c)p
6、若
a
≡
b
m
o
d
p
a\equiv b\mod p
a≡bmodp,则
a
c
≡
b
c
m
o
d
p
ac\equiv bc\mod p
ac≡bcmodp
7、若
a
≡
b
m
o
d
p
a\equiv b\mod p
a≡bmodp,则
a
c
≡
b
c
m
o
d
p
a^c\equiv b^c\mod p
ac≡bcmodp
逆元
定义
若 a b ≡ 1 m o d p ab\equiv 1\mod p ab≡1modp,称 a a a, b b b在模 p p p意义下互为逆元,也称 a a a为 b b b在模 p p p意义下的逆元, b b b为 a a a在模 p p p意义下的逆元,可记为 b ≡ a − 1 m o d p , a ≡ b − 1 m o d p b\equiv a^{-1}\mod p,a\equiv b^{-1}\mod p b≡a−1modp,a≡b−1modp.
可以认为 a a a与 b b b在模 p p p意义下互为倒数。这就是说,在模 p p p意义下, b b b就是 1 a \dfrac 1 a a1
从定义可以发现,逆元的大部分用途用于求 a b m o d p \frac a b \mod p bamodp的值,因为 a ≡ b − 1 m o d p a\equiv b^{-1}\mod p a≡b−1modp, a b = a ⋅ b − 1 \frac a b=a\cdot b^{-1} ba=a⋅b−1,即求 a a a乘上 b b b的逆元模 p p p.
求逆元的方法可以用下面的定理。
性质
1、费马小定理:若
a
a
a与
p
p
p互质且
p
p
p为质数,则
a
p
−
1
≡
1
m
o
d
p
a^{p-1}\equiv 1\mod p
ap−1≡1modp
一般的题目求逆元多用这个定理,因为大部分题目的模数
p
p
p都为
998244353
998244353
998244353或
1
0
9
+
7
10^9+7
109+7这类质数。
a
p
−
1
≡
1
m
o
d
p
a^{p-1}\equiv 1\mod p
ap−1≡1modp
则
a
p
−
2
⋅
a
≡
1
m
o
d
p
a^{p-2}\cdot a\equiv 1\mod p
ap−2⋅a≡1modp
所以
a
a
a在模
p
p
p意义下的逆元为
a
p
−
2
m
o
d
p
a^{p-2}\bmod p
ap−2modp.
2、欧拉定理:若
a
a
a与
p
p
p互质,则
a
ϕ
(
p
)
≡
1
m
o
d
p
a^{\phi(p)}\equiv 1\mod p
aϕ(p)≡1modp.
欧拉函数:
ϕ
(
n
)
=
∑
i
=
1
n
[
(
i
,
n
)
=
1
]
\phi(n)=\sum\limits_{i=1}^n[(i,n)=1]
ϕ(n)=i=1∑n[(i,n)=1]
(
i
,
n
)
(i,n)
(i,n)表示
i
i
i与
n
n
n的最大公约数,等价于
g
c
d
(
i
,
n
)
gcd(i,n)
gcd(i,n).
[
(
i
,
n
)
=
1
]
[(i,n)=1]
[(i,n)=1]是艾弗森表示法,当
(
i
,
n
)
=
1
(i,n)=1
(i,n)=1时为
1
1
1,否则为
0
0
0.
欧拉函数
ϕ
(
n
)
\phi(n)
ϕ(n)为小于
n
n
n的正整数中与
n
n
n互质的数。
容易发现,
ϕ
(
p
)
=
p
−
1
(
p
∈
P
,
即
p
为质数
)
\phi(p)=p-1(p\in P,即p为质数)
ϕ(p)=p−1(p∈P,即p为质数)
费马小定理为欧拉定理的特殊情况,因为
ϕ
(
p
)
=
p
−
1
\phi(p)=p-1
ϕ(p)=p−1.
3、扩展欧拉定理: a b ≡ a ( b m o d ϕ ( p ) ) + ϕ ( p ) m o d p a^b\equiv a^{(b\bmod \phi(p))+\phi(p)}\mod p ab≡a(bmodϕ(p))+ϕ(p)modp
以上
3
3
3个定理的关系为:费马小定理
⊂
\subset
⊂欧拉定理
⊂
\subset
⊂扩展欧拉定理
即扩展欧拉定理包含了前两个定理。
以上
3
3
3个定理本人均不会证明,证明请自行bdfs。
积性函数
定义
若
a
a
a与
b
b
b互质时有
f
(
a
)
×
f
(
b
)
=
f
(
a
×
b
)
f(a)\times f(b)=f(a\times b)
f(a)×f(b)=f(a×b),则称
f
f
f为积性函数,又称数论函数。
若对于任意
a
a
a和
b
b
b均满足
f
(
a
)
×
f
(
b
)
=
f
(
a
×
b
)
f(a)\times f(b)=f(a\times b)
f(a)×f(b)=f(a×b),则称
f
f
f为完全积性函数。完全积性函数属于积性函数。
常见的积性函数
单位函数: ϵ = [ n = 1 ] \epsilon=[n=1] ϵ=[n=1]
常数函数: I ( n ) = 1 I(n)=1 I(n)=1
恒等函数: I d ( n ) = n Id(n)=n Id(n)=n
幂函数:
I
d
k
(
n
)
=
n
k
Id_k(n)=n^k
Idk(n)=nk
常数函数为
k
=
0
k=0
k=0的幂函数,恒等函数为
k
=
1
k=1
k=1的幂函数。
欧拉函数:
ϕ
(
n
)
=
∑
i
=
1
n
[
(
i
,
n
)
=
1
]
\phi(n)=\sum\limits_{i=1}^n[(i,n)=1]
ϕ(n)=i=1∑n[(i,n)=1]
引理1:
ϕ
(
p
k
)
=
p
k
(
1
−
1
p
)
\phi(p^k)=p^k(1-\dfrac 1 p)
ϕ(pk)=pk(1−p1),其中
p
∈
P
p\in P
p∈P
证明:
我们知道,
ϕ
(
p
k
)
\phi(p^k)
ϕ(pk)表示小于
p
k
p^k
pk的正整数中与
p
k
p^k
pk互质的数的个数。
思考
[
1
,
p
k
]
[1,p^k]
[1,pk]中有多少个数与
p
k
p^k
pk不互质。这就是“从反面思考”。
若数
d
d
d与
p
k
p^k
pk不互质,由于
p
k
p^k
pk只有
p
p
p这一个质因数,所以
d
=
b
p
d=bp
d=bp.
那么
b
b
b的取值数就等于
[
1
,
p
k
]
[1,p^k]
[1,pk]中与
p
k
p^k
pk不互质的数的数量。
显然,
b
b
b的取值从
1
1
1到
p
k
−
1
p^{k-1}
pk−1,因为
b
p
≤
p
k
bp\le p^k
bp≤pk。
所以
[
1
,
p
k
]
[1,p^k]
[1,pk]中与
p
k
p^k
pk不互质的数有
p
k
−
1
p^{k-1}
pk−1个。
所以
ϕ
(
p
k
)
=
p
k
−
p
k
−
1
=
p
k
(
1
−
1
p
)
\phi(p^k)=p^k-p^{k-1}=p^k(1-\dfrac 1 p)
ϕ(pk)=pk−pk−1=pk(1−p1)
引理2:
ϕ
(
n
)
=
n
∏
p
∣
n
,
p
∈
P
(
1
−
1
p
)
\phi(n)=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p)
ϕ(n)=np∣n,p∈P∏(1−p1)
证明:
从反面思考或利用容斥原理易证————百度百科
用引理1可以很快速地证明引理2。
ϕ
(
n
)
=
ϕ
(
p
1
a
1
p
2
a
2
…
p
k
a
k
)
=
ϕ
(
p
1
a
1
)
ϕ
(
p
2
a
2
)
…
ϕ
(
p
k
a
k
)
=
p
1
a
1
(
1
−
1
p
1
)
p
2
a
2
(
1
−
1
p
2
)
…
p
k
a
k
(
1
−
1
p
k
)
=
n
∏
p
∣
n
,
p
∈
P
(
1
−
1
p
)
\phi(n)=\phi(p_1^{a_1}p_2^{a_2}\dots p_k^{a_k})=\phi(p_1^{a_1})\phi(p_2^{a_2})\dots \phi(p_k^{a_k})=p_1^{a_1}(1-\dfrac 1 {p_1})p_2^{a_2}(1-\dfrac 1 {p_2})\dots p_k^{a_k}(1-\dfrac 1 {p_k})=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p)
ϕ(n)=ϕ(p1a1p2a2…pkak)=ϕ(p1a1)ϕ(p2a2)…ϕ(pkak)=p1a1(1−p11)p2a2(1−p21)…pkak(1−pk1)=np∣n,p∈P∏(1−p1)
其中
p
i
∈
P
p_i\in P
pi∈P.
引理2较引理1更为常用。事实上,引理1是在证明引理2的过程中引出的。
引理3:
n
=
∑
d
∣
n
ϕ
(
d
)
n=\sum\limits_{d|n}\phi(d)
n=d∣n∑ϕ(d)
证明:
设
f
(
x
)
=
∑
i
=
1
n
[
(
i
,
n
)
=
x
]
f(x)=\sum\limits_{i=1}^n[(i,n)=x]
f(x)=i=1∑n[(i,n)=x],即区间
[
1
,
n
]
[1,n]
[1,n]中满足
g
c
d
(
i
,
n
)
=
x
gcd(i,n)=x
gcd(i,n)=x的数的个数。有
f
(
x
)
=
ϕ
(
n
x
)
f(x)=\phi(\dfrac n x)
f(x)=ϕ(xn),因为与
n
x
\dfrac n x
xn互质的数
a
a
a满足
g
c
d
(
a
,
n
x
)
=
1
gcd(a,\dfrac n x)=1
gcd(a,xn)=1,则
g
c
d
(
a
x
,
n
)
=
x
gcd(ax,n)=x
gcd(ax,n)=x.
枚举每一个可能的
g
c
d
(
i
,
n
)
gcd(i,n)
gcd(i,n),得
n
=
∑
d
∣
n
f
(
d
)
=
∑
d
∣
n
ϕ
(
n
d
)
n=\sum\limits_{d|n}f(d)=\sum\limits_{d|n}\phi(\dfrac n d)
n=d∣n∑f(d)=d∣n∑ϕ(dn).
注意这个式子有对称性,因为
d
∣
n
d|n
d∣n,所以
n
d
∣
n
\dfrac n d|n
dn∣n.
所以
n
=
∑
d
∣
n
ϕ
(
d
)
n=\sum\limits_{d|n}\phi(d)
n=d∣n∑ϕ(d),得证。
莫比乌斯函数:
μ
(
n
)
=
{
1
n
=
1
(
−
1
)
k
n
=
p
1
p
2
…
p
k
(
p
i
∈
P
)
0
p
2
∣
n
(
p
∈
P
)
\mu(n)=\begin{cases}1&n=1\\(-1)^k&n=p_1p_2\dots p_k(p_i\in P)\\0&p^2|n(p\in P)\end{cases}
μ(n)=⎩
⎨
⎧1(−1)k0n=1n=p1p2…pk(pi∈P)p2∣n(p∈P)
当
n
n
n有多个(指大于等于
2
2
2)相同的质因子时,
μ
(
n
)
=
0
\mu(n)=0
μ(n)=0,否则由
n
n
n的质因数个数决定,若
n
n
n有奇数个质因数,则
μ
(
n
)
=
−
1
\mu(n)=-1
μ(n)=−1,否则
μ
(
n
)
=
1
\mu(n)=1
μ(n)=1.
特别的,
μ
(
1
)
=
1
\mu(1)=1
μ(1)=1.
从定义可以看出,莫比乌斯函数多作为多项式(一般为和式或乘积)中的系数出现,因为其只有三个取值:
1
1
1,
−
1
-1
−1和
0
0
0.
这就告诉我们,莫比乌斯函数具有很好的容斥天赋,容斥的和式中多有
(
−
1
)
k
(-1)^k
(−1)k这个系数项,于是莫比乌斯函数就可能可以用于容斥系数。
其中 I I I, I d Id Id, I d k Id_k Idk均为完全积性函数。
一个有趣的性质:
若
f
(
n
)
f(n)
f(n)为积性函数,则
f
(
1
)
=
1
f(1)=1
f(1)=1.
证明:因为
f
(
n
)
f(n)
f(n)为积性函数,所以
f
(
1
×
a
)
=
f
(
1
)
×
f
(
a
)
f(1\times a)=f(1)\times f(a)
f(1×a)=f(1)×f(a)
又因为
f
(
1
×
a
)
=
f
(
a
)
f(1\times a)=f(a)
f(1×a)=f(a),所以
f
(
1
)
×
f
(
a
)
=
f
(
a
)
f(1)\times f(a)=f(a)
f(1)×f(a)=f(a),所以
f
(
1
)
=
1
f(1)=1
f(1)=1
证明欧拉函数为积性函数
根据定义,需证明 a a a与 b b b互质时, ϕ ( a × b ) = ϕ ( a ) × ϕ ( b ) \phi(a\times b)=\phi(a)\times \phi(b) ϕ(a×b)=ϕ(a)×ϕ(b).
设
x
x
x与
a
b
ab
ab互质(
x
<
a
b
x<ab
x<ab),
p
∈
Z
a
∗
,
q
∈
Z
b
∗
p\in \Z^*_a,q\in \Z^*_b
p∈Za∗,q∈Zb∗,其中
Z
a
∗
\Z^*_a
Za∗为
a
a
a的缩系(也称简化剩余系,即小于
a
a
a的正整数中与
a
a
a互质的数的集合)。则有如下方程式:
{
x
≡
p
m
o
d
a
x
≡
q
m
o
d
b
\begin{cases}x\equiv p&\mod a\\x\equiv q&\mod b\end{cases}
{x≡px≡qmodamodb
方程式的解的数量等于
ϕ
(
a
b
)
\phi(ab)
ϕ(ab)的值。
设
A
b
≡
1
m
o
d
a
,
B
a
≡
1
m
o
d
b
Ab\equiv 1\mod a,Ba\equiv 1\mod b
Ab≡1moda,Ba≡1modb
有
x
≡
A
b
p
+
B
a
q
m
o
d
a
b
x\equiv Abp+Baq \mod ab
x≡Abp+Baqmodab,因为当
x
=
A
b
p
+
B
a
q
x=Abp+Baq
x=Abp+Baq时,
x
x
x满足方程式。
p
p
p有
ϕ
(
a
)
\phi(a)
ϕ(a)个不同取值,
q
q
q有
ϕ
(
b
)
\phi(b)
ϕ(b)个不同取值,若两对不同的
p
,
q
p,q
p,q和
p
′
,
q
′
p',q'
p′,q′,则
x
x
x有
ϕ
(
a
)
×
ϕ
(
b
)
\phi(a)\times \phi(b)
ϕ(a)×ϕ(b)个不同的取值。
又因为
x
x
x的取值的数量等于
ϕ
(
a
b
)
\phi(ab)
ϕ(ab),所以只需要证明一对
p
,
q
p,q
p,q有一个唯一对应的
x
x
x即可。
可以用反证法证否下列方程式:
{
p
,
q
≠
p
′
,
q
′
x
≡
A
b
p
+
B
a
q
m
o
d
a
b
x
≡
A
b
p
′
+
B
a
q
′
m
o
d
a
b
\begin{cases}p,q\ne p',q'\\x\equiv Abp+Baq \mod ab\\x\equiv Abp'+Baq' \mod ab\end{cases}
⎩
⎨
⎧p,q=p′,q′x≡Abp+Baqmodabx≡Abp′+Baq′modab
有
A
b
p
+
B
a
q
≡
A
b
p
′
+
B
a
q
′
m
o
d
a
b
Abp+Baq\equiv Abp'+Baq'\mod ab
Abp+Baq≡Abp′+Baq′modab
移项,得
A
b
(
p
−
p
′
)
≡
B
a
(
q
′
−
q
)
m
o
d
a
b
Ab(p-p')\equiv Ba(q'-q)\mod ab
Ab(p−p′)≡Ba(q′−q)modab
两边同时乘
b
b
b,
A
b
(
p
−
p
′
)
b
≡
B
a
(
q
′
−
q
)
b
m
o
d
a
b
Ab(p-p')b\equiv Ba(q'-q)b\mod ab
Ab(p−p′)b≡Ba(q′−q)bmodab
由于右边为
a
b
ab
ab的倍数,所以
A
b
(
p
−
p
′
)
≡
0
m
o
d
a
b
Ab(p-p')\equiv 0\mod ab
Ab(p−p′)≡0modab
若要满足此式,则左边为
a
b
ab
ab的倍数。
观察左式,
b
b
b提供了
b
b
b的倍数,
a
a
a与
b
b
b互质,那么需要满足
A
(
p
−
p
′
)
A(p-p')
A(p−p′)为
a
a
a的倍数。
因为
A
b
≡
1
m
o
d
a
Ab\equiv 1\mod a
Ab≡1moda,所以
A
A
A与
a
a
a互质。
所以有
p
−
p
′
p-p'
p−p′为
a
a
a的倍数。
因为
p
,
p
′
∈
Z
a
∗
p,p'\in \Z^*_a
p,p′∈Za∗,所以
p
,
p
′
<
a
p,p'<a
p,p′<a,所以
p
−
p
′
=
0
p-p'=0
p−p′=0,即
p
=
p
′
p=p'
p=p′,与假设矛盾,故可证明一对
p
,
q
p,q
p,q只有一个唯一对应的
x
x
x.
得证。
例1:欧拉函数线性筛
求解 [ 1 , n ] [1,n] [1,n]每个数的欧拉函数 ( 1 ≤ n ≤ 1 0 7 (1\le n\le 10^7 (1≤n≤107)
本题要求线性求欧拉函数,考虑到欧拉函数是积性函数,可以采用类似欧拉筛的方法解决。
ϕ
(
i
×
p
j
)
=
{
ϕ
(
i
)
×
p
j
i
%
p
j
=
0
ϕ
(
i
)
×
(
p
j
−
1
)
i
%
p
j
≠
0
(
p
j
∈
P
,
i
∈
N
)
\phi(i\times p_j)=\begin{cases} \phi(i)\times p_j & i\% p_j=0\\ \phi(i)\times (p_j-1) & i\%p_j\ne 0\end{cases}(p_j\in P,i\in \N)
ϕ(i×pj)={ϕ(i)×pjϕ(i)×(pj−1)i%pj=0i%pj=0(pj∈P,i∈N)
证明:
当
i
%
p
j
≠
0
i\%p_j\ne 0
i%pj=0,因为
p
j
∈
P
p_j\in P
pj∈P,所以
p
j
p_j
pj与
i
i
i互质,所以
ϕ
(
i
×
p
j
)
=
ϕ
(
i
)
×
ϕ
(
p
j
)
=
ϕ
(
i
)
×
(
p
j
−
1
)
\phi(i\times p_j)=\phi(i)\times \phi(p_j)=\phi(i)\times (p_j-1)
ϕ(i×pj)=ϕ(i)×ϕ(pj)=ϕ(i)×(pj−1)
当
i
%
p
j
=
0
i\%p_j=0
i%pj=0,因为
ϕ
(
n
)
=
n
∏
p
∣
n
,
p
∈
P
(
1
−
1
p
)
\phi(n)=n\prod\limits_{p|n,p\in P}(1-\dfrac 1 p)
ϕ(n)=np∣n,p∈P∏(1−p1),所以可以看出
ϕ
(
n
)
\phi(n)
ϕ(n)仅与
n
n
n的质因子种类和
n
n
n的大小有关。
因为
i
%
p
j
=
0
i\%p_j=0
i%pj=0,所以
i
i
i中包含了
p
j
p_j
pj这个质因子,所以
i
i
i的质因子种类与
i
×
p
j
i\times p_j
i×pj完全相等,所以
∏
p
′
∣
(
i
×
p
j
)
,
p
′
∈
P
(
1
−
1
p
′
)
=
∏
p
′
∣
i
,
p
′
∈
P
(
1
−
1
p
′
)
\prod\limits_{p'|(i\times p_j),p'\in P}(1-\dfrac 1 {p'})=\prod\limits_{p'|i,p'\in P}(1-\dfrac 1 {p'})
p′∣(i×pj),p′∈P∏(1−p′1)=p′∣i,p′∈P∏(1−p′1)
有
ϕ
(
i
×
p
j
)
=
i
×
p
j
×
∏
p
′
∣
(
i
×
p
j
)
,
p
′
∈
P
(
1
−
1
p
′
)
=
p
j
×
i
×
∏
p
′
∣
i
,
p
′
∈
P
(
1
−
1
p
′
)
=
ϕ
(
i
)
×
p
j
\phi(i\times p_j)=i\times p_j\times\prod\limits_{p'|(i\times p_j),p'\in P}(1-\dfrac 1 {p'})=p_j\times i\times \prod\limits_{p'|i,p'\in P}(1-\dfrac 1 {p'})=\phi(i)\times p_j
ϕ(i×pj)=i×pj×p′∣(i×pj),p′∈P∏(1−p′1)=pj×i×p′∣i,p′∈P∏(1−p′1)=ϕ(i)×pj
得证。
故有如下代码。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n, pri[N], cnt = 0, vis[N], phi[N];
void oula(int x) {
phi[1] = 1;
for (int i = 2; i <= x; i++) {
if (!vis[i]) pri[++cnt] = i, phi[i] = i - 1;
for (int j = 1; j <= cnt && i * pri[j] <= x; j++) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
phi[i * pri[j]] = phi[i] * (pri[j] - 1); // 每个数只会被其最小质因子筛到一次
}
}
}
int main() {
scanf("%d", &n);
oula(n);
for (int i = 1; i <= n; i++) printf("%d ", phi[i]);
return 0;
}
例2:莫比乌斯函数线性筛
思路同上。
μ
(
i
×
p
j
)
=
{
0
i
%
p
j
=
0
−
μ
(
i
)
i
%
p
j
≠
0
\mu(i\times p_j)=\begin{cases}0&i\%p_j=0\\-\mu(i)&i\%p_j\ne 0\end{cases}
μ(i×pj)={0−μ(i)i%pj=0i%pj=0
证明:
当
i
%
p
j
=
0
i\%p_j=0
i%pj=0时,
i
×
p
j
i\times p_j
i×pj至少有两个相同的质因子
p
j
p_j
pj,根据定义,
μ
(
i
×
p
j
)
=
0
\mu(i\times p_j)=0
μ(i×pj)=0
当
i
%
p
j
≠
0
i\%p_j\ne 0
i%pj=0时,根据积性函数的定义,
μ
(
i
×
p
j
)
=
μ
(
i
)
×
μ
(
p
j
)
=
μ
(
i
)
×
(
−
1
)
=
−
μ
(
i
)
\mu(i\times p_j)=\mu(i)\times \mu(p_j)=\mu(i)\times (-1)=-\mu(i)
μ(i×pj)=μ(i)×μ(pj)=μ(i)×(−1)=−μ(i)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n, pri[N], cnt = 0, vis[N], mu[N];
void oula(int x) {
mu[1] = 1;
for (int i = 2; i <= x; i++) {
if (!vis[i]) pri[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt && i * pri[j] <= x; j++) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) break; // 有两个相等的质因子pri[j],故mu值为0,不更新
mu[i * pri[j]] = -mu[i]; // 每个数只会被其最小质因子筛到一次
}
}
}
int main() {
scanf("%d", &n);
oula(n);
for (int i = 1; i <= n; i++) printf("%d ", mu[i]);
return 0;
}