欧拉函数
定义
ϕ ( x ) ϕ(x) ϕ(x) 表示从 1 , 2 , 3 , . . . , x 1,2,3,...,x 1,2,3,...,x 中和 x x x 互质的数的数量
公式
ϕ ( x ) = x ∗ ∏ i = 1 m ( 1 − 1 p i ) ϕ(x)=x*\prod_{i=1}^{m}(1-\frac{1}{p_{i}}) ϕ(x)=x∗∏i=1m(1−pi1)
其中 p i p_{i} pi 是 x x x 的质因子,且两两不同
证明:
- ϕ ( 1 ) = 1 ϕ(1) =1 ϕ(1)=1
- 若 x x x 是素数,则 ϕ ( x ) = x − 1 ϕ(x)=x-1 ϕ(x)=x−1
- 若 p p p是素数,则 ϕ ( p k ) = p k − 1 ∗ ( p − 1 ) = p k − p k − 1 = p k ∗ ( 1 − 1 p ) ϕ(p^{k})=p^{k-1}*(p-1)=p^{k}-p^{k-1}=p^{k}*(1-\frac{1}{p}) ϕ(pk)=pk−1∗(p−1)=pk−pk−1=pk∗(1−p1)
- 若
a
,
b
a,b
a,b 互质,则
ϕ
(
a
∗
b
)
=
ϕ
(
a
)
∗
ϕ
(
b
)
ϕ(a*b)=ϕ(a)*ϕ(b)
ϕ(a∗b)=ϕ(a)∗ϕ(b)
- 这条结论的证明需要用到中国剩余定理,如果 a a a与 p 1 p1 p1互质 ( a < p 1 ) (a<p1) (a<p1), b b b与 p 2 p2 p2互质 ( b < p 2 ) (b<p2) (b<p2), c c c与 p 1 , p 2 p1,p2 p1,p2互质 ( c < p 1 ∗ p 2 ) (c<p1*p2) (c<p1∗p2),则c与数对 ( a , b ) (a,b) (a,b) 是一 一对应关系。由于a的值有 ϕ ( p 1 ) ϕ(p1) ϕ(p1)种可能,b的值有 ϕ ( p 2 ) ϕ(p2) ϕ(p2)种可能,则数对 ( a , b ) (a,b) (a,b) 有 ϕ ( p 1 ) ∗ ϕ ( p 2 ) ϕ(p1)*ϕ(p2) ϕ(p1)∗ϕ(p2)种可能,而c的值有 ϕ ( p 1 ∗ p 2 ) ϕ(p1*p2) ϕ(p1∗p2)种可能,所以 ϕ ( p 1 ∗ p 2 ) ϕ(p1*p2) ϕ(p1∗p2)就等于 ϕ ( p 1 ) ϕ ( p 2 ) ϕ(p1)ϕ(p2) ϕ(p1)ϕ(p2)。
设 x = p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p k a k x =p {_{1}}^{a_{1}}*p {_{2}}^{a_{2}}*...*p {_{k}}^{a_{k}} x=p1a1∗p2a2∗...∗pkak
由上述结论,可得
ϕ ( x ) = ϕ ( p 1 a 1 ) ∗ ϕ ( p 2 a 2 ) ∗ . . . ∗ ϕ ( p k a k ) ϕ(x)=ϕ(p {_{1}}^{a_{1}})*ϕ(p {_{2}}^{a_{2}})*...*ϕ(p {_{k}}^{a_{k}}) ϕ(x)=ϕ(p1a1)∗ϕ(p2a2)∗...∗ϕ(pkak)
ϕ ( x ) = 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)=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)=p1a1∗p2a2∗...∗pkak∗((1−p11))∗((1−p21))∗...∗((1−pk1))
ϕ ( x ) = x ∗ ∏ i = 1 m ( 1 − 1 p i ) ϕ(x)=x*\prod_{i=1}^{m}(1-\frac{1}{p_{i}}) ϕ(x)=x∗∏i=1m(1−pi1)
参考博客:https://blog.csdn.net/wrwhahah/article/details/82704053
求解
从这个公式可以得到两个得到 ϕ ( x ) ϕ(x) ϕ(x)的方法
- 暴力枚举质因子,时间复杂度: O ( x O( \sqrt{x} O(x ) ) )
int phi(int x){
int sum=x;
for(int i=2;i*i<=x;i++)
{
if(x%i)
continue;
sum=sum/i*(i-1);
while(x%i==0)
x/=i;
}
if(x!=1)
sum=sum/x*(x-1);
return sum;
}
- 类似素数塞,时间复杂度: O ( n ) O( n ) O(n)
const int N=1e6+6;
int P[N];
bool Notprime[N]; //不是素数为true
int phi(int MAXN){ //得到1--MAXN所有数的欧拉函数值
for(int i=1;i<=MAXN;i++)
P[i]=i;
for(int i=2;i<=MAXN;i++)
if(!Notprime[i])
for(int j=i+i;j<=MAXN;j+=i)
{
Notprime[j]=true;
P[j]=P[j]/i*(i-1);
}
}
欧拉定理与扩展欧拉定理
公式
a
x
%
m
≡
{
a
x
%
ϕ
(
m
)
%
m
,
a
,
m
互
质
a
x
%
m
,
x
<
ϕ
(
m
)
,
g
c
d
(
a
,
m
)
!
=
1
a
(
x
%
ϕ
(
m
)
)
+
ϕ
(
m
)
%
m
,
x
>
=
ϕ
(
m
)
,
g
c
d
(
a
,
m
)
!
=
1
a^{x} \% m\equiv\left\{\begin{matrix} & a^{x\%ϕ(m)} \%m ,a,m互质 \\& a^{x}\%m , x<ϕ(m),gcd(a,m)!=1 \\& a^{(x\%ϕ(m))+ϕ(m)}\%m,x>=ϕ(m),gcd(a,m)!=1\end{matrix}\right.
ax%m≡⎩⎨⎧ax%ϕ(m)%m,a,m互质ax%m,x<ϕ(m),gcd(a,m)!=1a(x%ϕ(m))+ϕ(m)%m,x>=ϕ(m),gcd(a,m)!=1
证明:
参考博客:https://blog.csdn.net/hzj1054689699/article/details/80693756
练习题目:
http://acm.fzu.edu.cn/problem.php?pid=1759
https://www.lydsy.com/JudgeOnline/problem.php?id=3884
http://acm.hdu.edu.cn/showproblem.php?pid=1395
http://acm.hdu.edu.cn/showproblem.php?pid=6363