euler证明

我们用g(x)表示x的欧拉函数值,即1~x与x互质的数的个数

欧拉函数公式为: g(x)= y*((x1-1)/x1)*((x2-1)/x2)*((x3-1)/x3)....(其中x1, x2, x3....为质数)

 

 证明:

1. 对于质数x,有g(x)=x-1

 

2. 对于x^h,其中x为质数,那么显然1~x^h之间包含x因子的数不与x^h互质,有:

x, 2*x, 3*x, 4*x.....x^(h-1)*x 共x^(h-1)个,很显然有g(x^h)=x^h-x^(h-1),其中x^(h-1)为

不与x^h互质的数。

例如:

y=3^4
... 3 .2*3.. 3*3 ..4*3. 5*3 3*3*3 .7*3..... 3*3*3*3
g(y)=3^4-3^3

 

3. 对于任意一个数y,我们可以将其分解成质数的积的形式,再由乘法原理得到g(y)

例如:
y=3^4*5^7
g(y)=(3^4-3^3)*(5^7-5^6)

 

4. 综上所述:
对于任意y=x1^h1*x2^h2*x3^h3......有:
g(y)=(x1^h1-x1^(h1-1))*(x2^h2-x2^(h2-1))*(x3^h3-x3^(h3-1))....
    =x1^h1*(1-1/x1)*x2^h2*(1-1/x2)*x3^h3*(1-1/x3)....
    =y*(1-1/x1)*(1-1/x2)*(1-1/x3)....
    =y*((x1-1)/x1)*((x2-1)/x2)*((x3-1)/x3)....

至此得到了欧拉函数

 

代码:

 1 /*  int euler(int n){
 2     int ans=1;
 3     for(int i=2; i*i<=n; i++){
 4         if(n%i==0){
 5             ans*=(i-1);
 6             n/=i;
 7             while(n%i==0){
 8                 ans*=i;
 9                 n/=i;
10             }
11         }
12     }
13     if(n>1){
14         ans*=n-1;
15     }
16 }*/
17 
18 int euler(int n){
19     int ans=n;
20     for(int i=2; i*i<=n; i++){
21         if(n%i==0){
22             ans=ans*(i-1)/i;
23             while(n%i==0){
24                 n/=i;
25             }
26         }
27     }
28     if(n>1){
29         ans=ans*(n-1)/n;
30     }
31 }
View Code

 

posted @ 2017-03-26 13:01  geloutingyu  阅读(339)  评论(0编辑  收藏  举报