欧拉函数

        在数论,对正整数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
#include
#define N 1500001
long long phi[N];
void mkphilist()
{
  int i,j;
  phi[1]=1;
  for(i=2;i
#include
#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
#include
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<1) ans*=n-1;
                     cout<
#include
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));
}


2
100的欧拉函数值:

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





你可能感兴趣的:(语言/理论,数学)