在数论中,对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目。
n的欧拉函数值记为: F(n)
那么,我们是怎样求欧拉函数的值呢?
方法是这样的:
其实求欧拉函数值还有一种方法:即利用递推法求欧拉函数值
算法原理:开始令i的欧拉函数值等于它本身,如果i为偶数,可以利用定理:
当n为奇数的时候 F[2*N]=F[N];
变为求奇数的。
若p是一个正整数满足,那么p是素数,在遍历过程中如果遇到欧拉函数值等于自身的情况,那么说明该数为素数。把这个数的欧拉函数值改变,同时也把能被该素因子整除的数改变。
#include <iostream>
#include <cstdio>
using namespace std;
int phi(int n)//递推写法
{
int rea=n,i;
for(i=2;i*i<=n;i++){
if(n%i==0){
rea=rea-rea/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
rea=rea-rea/n;
return rea;
}
const int N = 100001;
int p[N];
void phi(int n)//利用定理写法p(2*n)=p(n)
{
for(int i=1;i<N;i++) p[i]=i;
for(int i=2;i<N;i+=2) p[i]>>=1;
for(int i=3;i<N;i+=2){
if(p[i]==i){
for( int j=i;j<N;j+=i)
p[j]=p[j]-p[j]/i;
}
}
}
int main()
{
int n;
while(cin>>n){
cout<<phi(n)<<endl;
}
return 0;
}
最后,我们来介绍一下欧拉定理: