欧拉函数

 欧拉函数

 
 
 

给定一个数N;求1 到n-1与他互为质数的数的个数

 

欧拉函数可以求解

 

euler(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4),,,,,

 

P1 P2 P3 P4 。。。。。是n的质因数,

 

比如10的质因数有2 5

 

所以euler(10)=10*(1-1/2)*(1-1/5)=4

 

30的质因数 2 3 5

 

所以 结果是 8

 
8的质因数是2  所以结果是4(1 3 5 7)
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
筛选法求欧拉函数
const int Max=51;
int euler[Max];
void Euler()
{
    euler[1]=1;
    for(int i=2;i<Max;i++)
        euler[i]=i;
    for(int i=2;i<Max;i++)
        if(euler[i]==i) //筛选掉不是质因数的i;
        for(int j=i;j<Max;j+=i) //保证j都是i的倍数,
        {
             euler[j]=euler[j]/i*(i-1);// 只要是i的倍数,j就不是质因子,那么euler[j]的值就会改变,不再等于j;
             cout<<"质因数含有 "<<i<<" 的数"<<j<<",其乘以(1-1/"<<i<<")后的结果是"<<euler[j]<<endl<<endl;
        }
 
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
直接根据欧拉函数的定义
 
 
int euler(int n)
 {
     int a=n,res=n;
     for(int i=2;i*i<=a;i++) //一个数的质因数不会大于它的平方根
     {
         if(a%i==0) //保证i是质因数
            res=res/i*(i-1); //先乘后除防止溢出
         while(a%i==0)a/=i; //保证i是质因数
     }
     if(a>1)res=res/a*(a-1);
     return res;
 } 
 
 
 
 
 
 
 
 
 
posted @ 2015-09-26 10:47  -梦里不知身是客  阅读(174)  评论(0编辑  收藏  举报