欧拉函数。
phi(n)表示比n小的与n互质的数的个数,比如
phi(1) = 1;
phi(2) = 1;
phi(3) = 2;
phi(4) = 2;
phi(5) = 4;
性质:
1. 如果p为质数,则phi(p) = p-1;
2. 如果p为质数并且a为正整数,则phi(p^a) = p^a - p^(a-1);
证明:p为质数,所以所有可以和p相乘小于p^a的数有p^a/p = p^(a-1)个,剩下的都与p^a互质。
3. phi(ab) = phi(a)*phi(b)
4. n = p1^a1*p2^a2*...*pk^ak
phi(n) = phi(p1^a1)*phi(p2^a2)*...*phi(pk^ak)
= (p1^a1-p1^(a1-1))*(p2^a2-p2^(a2-1))*...(pk^ak-pk^(ak-1))
=n*(1-1/p1)*(1-1/p2)*...*(1-1/pk)
实现代码:
1 int phi (int n) { 2 int result = n; 3 for (int i=2; i*i<=n; ++i) 4 if (n % i == 0) { 5 while (n % i == 0) 6 n /= i; 7 result -= result / i; 8 } 9 if (n > 1) 10 result -= result / n; 11 return result; 12 }
应用:
欧拉定理:a^(phi(m)) = 1 (mod m)
其中a与m互质
费马定理:a^(m-1) = 1 (mod m)
其中a与m互质