欧拉公式与欧拉phi函数

  欧拉函数phi(n)表示1n之间与n互素的整数的个数。对于一个整数a,如果gcd(a,n)==1,则aphi(n) ==1(mod n)

建设整数n可以分解为素数的乘积:

  n = p1^k1 * p2^k2 * ... * pn^kn

  则phi(n) = (p1^k1 - p1^(k1-1)) * (p2^k2 - p2^(k2-1)) * ... * (pn^kn - pn^(kn-1))

  还可以表示为:

  phi(n)   =  p1^(k1-1)*(p1 - 1) * p2^(k2-1)*(p2-1) * ... * pn^(kn-1) * (pn - 1)

      =  n * ((p1-1)*(p2-1)* ... *(pn-1)) / (p1*p2* ... * pn)

  代码:

 1 //zzy2012.7.17
 2 #include<cstdio>
 3 #include<iostream>
 4 #define NUM 10000
 5 using namespace std;
 6 
 7 typedef struct{
 8     int p1,p2,v;
 9 }node;
10 
11 int flag[NUM];
12 node phi[NUM];
13 
14 void ini(){
15     for(int i=0; i<NUM; i++){
16         phi[i].p1 = 1;
17         phi[i].p2 = 1;
18         flag[i] = 1;
19     }
20 }
21 
22 void calcu_phi(){
23     phi[1].v = 1;
24     for(int i = 2; i<NUM; i++){
25         if(flag[i] == 1){
26             for(int j = 1; i*j<NUM; j++){
27                 phi[i*j].p1 *= (i-1);
28                 phi[i*j].p2 *= i;
29                 flag[i*j] = 0;
30             }
31         }
32     }
33     for(int i = 2; i<NUM; i++)
34         phi[i].v = i*phi[i].p1/phi[i].p2;
35 }
36 
37 void print(){
38     for(int i = 1; i<NUM; i++)
39         printf("%d ",phi[i].v);
40 }
41 
42 int main()
43 {
44     ini();
45     calcu_phi();
46     print();
47     return 0;
48 }

posted on 2012-07-17 21:17  Lattexiaoyu  阅读(954)  评论(0编辑  收藏  举报

导航