[数论]小于n且与n互素的个数(欧拉函数)

来源:互联网 发布:为人谋而不忠乎的读音 编辑:程序博客网 时间:2024/05/17 03:44
/*Name:小于n且与n互素的个数(欧拉函数)Actor:HTTime:2015年8月10日Error Reporte:*/#include <iostream>#include <stdio.h>#include <conio.h>#include <string.h>using namespace std;//欧拉函数://f(n) = n*TT[ 1/p * (p-1) ]//其中 p 是 n 的质因数//实现:对于每一个质因数,除p乘p-1int euler(int n){int p;int m = sqrt(n + 0.5);//m用来界定质因子的范围int ans = n;for (p = 2; p <= m; p++){if (n%p == 0){ans = ans / p * (p - 1);while (n%p == 0) n /= p;//源于唯一分解定理,排除非素}}if (n != 1) ans = ans / n*(n - 1);//如果本身也是素数,就要除一下return ans;}//筛选法求欧拉函数  O(nloglogn)int table[10000];void euler_table(int n){int i, j;for (i = 1; i <= n; i++)table[i] = i;for (i = 2; i <= n; i++){if (table[i] == i){for (j = i; j <= n; j += i){table[j] = table[j]/i*(i - 1);}}}}int main(){int n; euler_table(100);L:scanf("%d", &n);printf("%d     ", table[n]);n = euler(n);printf("%d\n", n);goto L;}//欧拉函数的推导://欧拉函数 f(n) = 小于n的与n互素的数的个数(注意不是素因数)//“积性函数” F(X*Y),当且仅当 GCD(X,Y)= 1 时, F(X*Y) = F(X)* F(Y)//欧拉函数是积性函数(我也不知道为什么)//所以  根据唯一分解定理   n = p1^a1 * p2^a2 * ... * pn^an//f(n) = p(p1^a1) * p(p2^a2) * ... * p(pn^an)//对于p1^a1 其中因数的个数为 p1^a1 - p1^a1/p1 == p1^a1 * (1 - 1/p1)//f(n) = p1^a1*p2^a2... ... *(1 - 1/p1)*(1 - 1/p2)*... ...//     = n * TT(1 - 1/pi) = n * TT[1/pi*(pi-1)] 

0 0