欧拉函数
定义
ϕ(x) 表示从
1,2,3,...,x 中和
x 互质的数的数量
公式
ϕ(x)=x∗∏i=1m(1−pi1)
其中
pi 是
x 的质因子,且两两不同
证明:
-
ϕ(1)=1
- 若
x 是素数,则
ϕ(x)=x−1
- 若
p是素数,则
ϕ(pk)=pk−1∗(p−1)=pk−pk−1=pk∗(1−p1)
- 若
a,b 互质,则
ϕ(a∗b)=ϕ(a)∗ϕ(b)
- 这条结论的证明需要用到中国剩余定理,如果
a与
p1互质
(a<p1),
b与
p2互质
(b<p2),
c与
p1,p2互质
(c<p1∗p2),则c与数对
(a,b) 是一 一对应关系。由于a的值有
ϕ(p1)种可能,b的值有
ϕ(p2)种可能,则数对
(a,b) 有
ϕ(p1)∗ϕ(p2)种可能,而c的值有
ϕ(p1∗p2)种可能,所以
ϕ(p1∗p2)就等于
ϕ(p1)ϕ(p2)。
设
x=p1a1∗p2a2∗...∗pkak
由上述结论,可得
ϕ(x)=ϕ(p1a1)∗ϕ(p2a2)∗...∗ϕ(pkak)
ϕ(x)=p1a1∗p2a2∗...∗pkak∗((1−p11))∗((1−p21))∗...∗((1−pk1))
ϕ(x)=x∗∏i=1m(1−pi1)
参考博客:https://blog.csdn.net/wrwhahah/article/details/82704053
求解
从这个公式可以得到两个得到
ϕ(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)
const int N=1e6+6;
int P[N];
bool Notprime[N];
int phi(int 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);
}
}
欧拉定理与扩展欧拉定理
公式
ax%m≡⎩⎨⎧ax%ϕ(m)%m,x,m互质ax%m,x<ϕ(m)a(x%ϕ(m))+ϕ(m)%m,x>=ϕ(m),
证明:
参考博客: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