欧拉函数&&欧拉定理

在数论中,对正整数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;
}

最后,我们来介绍一下欧拉定理:




你可能感兴趣的:(欧拉函数&&欧拉定理)