欧拉函数phi(n)表示1到n之间与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 }