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 }
我就是我,颜色不一样的烟火 --- geloutingyu