定义:对于正整数 n n n,欧拉函数是小于等于 n n n的数中与 n n n互质的数的个数。
符号: φ ( n ) φ(n) φ(n)表示 n n n的欧拉函数,默认 φ ( 1 ) = 1 φ(1)=1 φ(1)=1。
一些定理:
1.对于一个素数 p p p, φ ( p ) = p − 1 φ(p)=p-1 φ(p)=p−1。
证明略。
2.对于两个互质的数 a , b a,b a,b, φ ( a × b ) = φ ( a ) × φ ( b ) φ(a \times b)=φ(a) \times φ(b) φ(a×b)=φ(a)×φ(b)。 ( ( (感谢 h y j hyj hyj 巨佬的指正 ) ) )
证明:因为
a
a
a与
b
b
b互质,所以
a
a
a与
b
b
b没有共同的质因数。设
a
a
a有
k
a
k_a
ka个质因数,
b
b
b有
k
b
k_b
kb个质因数,因此:
φ
(
a
)
∗
φ
(
b
)
=
a
∗
∏
i
=
1
k
a
(
1
−
1
p
[
i
]
)
∗
b
∗
∏
i
=
1
k
b
(
1
−
1
p
[
i
]
)
=
a
∗
b
∗
∏
i
=
1
k
a
+
k
b
(
1
−
1
p
[
i
]
)
=
φ
(
a
∗
b
)
\begin{aligned}φ(a)*φ(b)&=a*\prod\limits_{i=1}^{k_a} \left(1-\dfrac{1}{p[i]}\right)*b*\prod\limits_{i=1}^{k_b} \left(1-\dfrac{1}{p[i]}\right)\\&=a*b*\prod\limits_{i=1}^{k_a+k_b} \left(1-\dfrac{1}{p[i]}\right)\\&=φ(a*b)\end{aligned}
φ(a)∗φ(b)=a∗i=1∏ka(1−p[i]1)∗b∗i=1∏kb(1−p[i]1)=a∗b∗i=1∏ka+kb(1−p[i]1)=φ(a∗b)
注:欧拉函数是积性函数,但不是完全积性函数。
u
p
d
a
t
e
update
update:这个证法貌似是错的,因为要用到欧拉函数的公式,但是欧拉函数的公式又要由这个式子推出来。所以只能显然正确了。真的证明我还不会
(
(
(我菜爆了
)
)
),可以参考这里
3.对于一个素数 p p p的幂次,如 p a p^{a} pa,有 φ ( p a ) φ(p^{a}) φ(pa) = = = ( p − 1 ) (p-1) (p−1) × \times × p a − 1 p^{a-1} pa−1。
证明:比 p a p^{a} pa小的正整数共 p a − 1 p^{a}-1 pa−1个。其中所有 p p p的倍数可以表示成 p p p × \times × t t t ( t = 1 , 2...... p a − 1 − 1 ) (t=1,2......p^{a-1}-1) (t=1,2......pa−1−1),即共有 p a − 1 − 1 p^{a-1}-1 pa−1−1个数能被 p p p整除。因为 p p p是质数,所以显然只有这些数不能被 p p p整除,剩余的数都与 p p p互质。因此, φ ( p a ) φ(p^{a}) φ(pa) = = = p a − 1 p^{a}-1 pa−1 − - − ( p a − 1 − 1 ) (p^{a-1}-1) (pa−1−1) = = = ( p − 1 ) (p-1) (p−1) × \times × p a − 1 p^{a-1} pa−1。
4.如果 i % p = 0 i\%p=0 i%p=0,那么 φ ( i × p ) = φ ( i ) × p φ(i\times p)=φ(i)\times p φ(i×p)=φ(i)×p。
证明:懒了不想写,好像没多大用。
求欧拉函数:
1.求单个欧拉函数: φ ( x ) φ(x) φ(x) = x =x =x × \times × ∏ i = 1 k ( 1 − 1 p [ i ] ) \prod\limits_{i=1}^k \left(1-\dfrac{1}{p[i]}\right) i=1∏k(1−p[i]1)
其中 p [ 1 ] , p [ 2 ] . . . . . . p [ k ] p[1],p[2]......p[k] p[1],p[2]......p[k]为 x x x的所有质因子
证明:首先,由整数的唯一分解定理可得,
x
x
x
=
=
=
p
[
1
]
a
1
p[1]^{a_1}
p[1]a1
×
\times
×
p
[
2
]
a
2
p[2]^{a_2}
p[2]a2
×
\times
×
.
.
.
.
.
.
......
......
×
\times
×
p
[
k
]
a
k
p[k]^{a_k}
p[k]ak。显然
p
[
1
]
a
1
p[1]^{a_1}
p[1]a1,
p
[
2
]
a
2
p[2]^{a_2}
p[2]a2,
.
.
.
.
.
.
......
......,
p
[
k
]
a
k
p[k]^{a_k}
p[k]ak之间两两互质。那么,根据定理
2
,
3
2,3
2,3:
φ
(
x
)
=
φ
(
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
]
)
)
=
(
p
[
1
]
a
1
∗
p
[
2
]
a
2
∗
.
.
.
.
.
.
∗
p
[
k
]
a
k
)
∗
(
1
−
1
p
[
1
]
)
∗
(
1
−
1
p
[
2
]
)
∗
.
.
.
.
.
.
∗
(
1
−
1
p
[
k
]
)
=
x
∗
∏
i
=
1
k
(
1
−
1
p
[
i
]
)
\begin{aligned}φ(x)&=φ(p[1]^{a_1})*φ(p[2]^{a_2})*......*φ(p[k]^{a_k})\\&=(p[1]^{a_1}*(1-\frac{1}{p[1]}))*(p[2]^{a_2}*(1-\frac{1}{p[2]}))*......* (p[k]^{a_k}*(1-\frac{1}{p[k]}))\\&=(p[1]^{a_1}*p[2]^{a_2}*......*p[k]^{a_k})*(1-\frac{1}{p[1]})*(1-\frac{1}{p[2]})*......*(1-\frac{1}{p[k]})\\&=x*\prod\limits_{i=1}^k \left(1-\dfrac{1}{p[i]}\right)\end{aligned}
φ(x)=φ(p[1]a1)∗φ(p[2]a2)∗......∗φ(p[k]ak)=(p[1]a1∗(1−p[1]1))∗(p[2]a2∗(1−p[2]1))∗......∗(p[k]ak∗(1−p[k]1))=(p[1]a1∗p[2]a2∗......∗p[k]ak)∗(1−p[1]1)∗(1−p[2]1)∗......∗(1−p[k]1)=x∗i=1∏k(1−p[i]1)
代码:
inline int getphi(int x){
int res=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
res=res/i*(i-1);//通分公式大括号内内容即可
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
2.线性筛欧拉函数:方法类似于筛素数,其实并不难,在筛素数的同时进行筛欧拉函数。
用到上面的1,2,4定理。
代码:
for(int i=2;i<=n;i++){
if(!v[i]){
phi[i]=i-1;
pr[++top]=i;
}
for(int j=1;j<=top&&i*pr[j]<=n;j++){
v[i*pr[j]]=1;
if(i%pr[j]==0){
phi[i*pr[j]]=phi[i]*pr[j];
break;
}
else phi[i*pr[j]]=phi[i]*phi[pr[j]];
}
}
欧拉定理:若 g c d ( a , m ) = 1 gcd(a,m)=1 gcd(a,m)=1,那么 a φ ( m ) a^{φ(m)} aφ(m) ≡ \equiv ≡ 1 ( m o d m ) 1 \pmod m 1(modm)。
证明:找欧拉去