在数轮,对正整数n,欧拉函数是少于活等于n的数中与n互质的数的数目。例如φ(8)=4,因为1,3,5,7均和8互质。

欧拉函数的算法:

一.从1N-1逐个判断时候满足欧拉函数的条件,如果满足则输出概述,并计算出欧拉函数&N;

二.利用欧拉函数和他本身不同质因数的关系,PN的质因数。

欧拉函数和它本身不同质因数的关系:

通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pnx的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3

三.利用欧拉函数&N)和N的标准非解释的关系求解欧拉函数。

如果N=p1^q1*p2^q2*……pn^qn,&N)的计算公式是

&N=p1^(q1-1)*p2^(q2-1)……pn^(qn-1)*(p1-1)*(p2-1)*(p3-1)……(pn-1)

234=2^1*3^2*13^1;

&234=2^1-1*3^2-1*13^(1-1)*(2-1)*(3-1)*(13-1);

欧拉函数的几个推论

一.欧拉函数值为偶数

二.对任意素数p,有&p=p-1

三.设N为指数P的平方,即N=P*P,则&N=P-POY*P

四.这N为指数Pn次方(n>=2,&N=N*1-1/P;

#include<stdio.h>

#include<string.h>

#define N 1500001

Long long phi[N];

void mkphilist()

{

  int i,j;

  phi[1]=1;

  for(i=2;i<N;i++)

  {

     if(!phi[i])

     {

       for(j=i;j<N;j+=i)

       {

          if(!phi[j])

            phi[j]=j;

          phi[j]-=phi[j]/i;

       }

     }

  }

}

int main()

{

  int n;

  mkphilist();

  while(scanf("%d",&n)!=EOF)

  {

     printf("%lld\n",phi[i]);

  }

  return 0;

}

或者

#include<stdlib.h>

#include<stdio.h>

#define N 10000000

int main()

{

  int *phi,i,j;

  char *prime;

  prime=(char*)malloc((N+1)*sizeof(char));

  prime[0]=prime[1]=0;

  for(i=2;i<=N;i++)

  {

     prime[i]=1;

  }

  for(i=2;i*i<=N;i++)

  {

     if(prime[i])

     {

       for(j=i*i;j<=N;j+=i)

       {

          prime[j]=0;

       }

     }

  } //这段求出了N内的所有素数

  phi=(int*)malloc((N+1)*sizeof(int));

  for(i=1;i<=N;i++)

  {

     phi[i]=i;

  }

  for(i=2;i<=N;i++)

  {

     if(prime[i])

     {

       for(j=i;j<=N;j+=i)

       {

          phi[j]=phi[j]/i*(i-1);

             //此处注意先/i*i-1),否则范围较大时会溢出

       }

     }

  }

  int n;

  while(scanf("%d",&n)!=EOF)

     printf("%d\n",phi[n]);

  return 0;

}

大数据

 

#include<iostream>

#include<cmath>

using namespace std;

 

int a[40001];

int n,m;

 

void read()

{

     int i,j;

     int ans;    

     for(i=4;i<=40000;i+=2)

          a[i]=1;

     for(i=3;i<=40000;i+=2)

     {

          if(a[i]==0)

          {

                for(j=2*i;j<=40000;j+=i)

                     a[j]=1;

          }

          while(cin>>n)

          {

                if(n==1)

                {

                     cout<<1<<endl;

                     continue;

                }

                ans=1;m=n;

                for(i=2;i<=n&&i*i<=m;i++)

                {

                     if(a[i]==0&&n%i==0)

                     {

                           j=0;

                           while(n%i==0)

                           {

                                 n/=i;

                                 j++;

                           }

                           ans*=pow(1.*i,j-1)*(i-1);

                     }

                }

                if(n>1) ans*=n-1;

                     cout<<ans<<endl;

          }

     }

}

int main()

{

     read();

     return 0;

}

或者

#include<iostream>

#include<stdio.h>

using namespace std;

long long Eular(long long n)

{

     int i;

     long long ret=n;

     for(i=2;i*i<=n;++i)

     {

          if(n%i==0)

          {

                ret-=ret/i;

                while(n%i==0)n/=i;//去掉n中含有的所有i因子

                if(n==1)break;

          }

     }

     if(n!=1)ret-=ret/n;

     return ret;

}

int main()

{

     long long m;

     while(scanf("%lld",&m)!=EOF)

          printf("%lld\n",Eular(m));

}

2100的欧拉函数值:

2 1   3 2   4 2   5 4   6 2   7 6   8 4   9 6   10 4   11 10   12 4   13 12   14 6   15 8   16 8   17 16   18 6   19 18   20 8   21 12   22 10   23 22   24 8   25 20   26 12   27 18   28 12   29 28   30 8   31 30   32 16   33 20   34 16   35 24   36 12   37 36   38 18   39 24   40 16   41 40   42 12   43 42   44 20   45 24   46 22   47 46   48 16   49 42   50 20   51 32   52 24   53 52   54 18   55 40   56 24   57 36   58 28   59 58   60 16   61 60   62 30   63 36   64 32   65 48   66 20   67 66   68 32   69 44   70 24   71 70   72 24   73 72   74 36   75 40   76 36   77 60   78 24   79 78   80 32   81 54   82 40   83 82   84 24   85 64   86 42   87 56   88 40   89 88   90 24   91 72   92 44   93 60   94 46   95 72   96 32   97 96   98 42   99 60   100 40

posted on 2011-08-14 11:12  pcoda  阅读(1312)  评论(0编辑  收藏  举报