欧拉函数:对于一个正整数n,小于n且与n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。
特殊性质:当n为奇数时,φ(2n)=φ(n)。
当n为素数时:φ(n) = n - 1;
(1)φ(n) = n * (1 - 1/p1) * (1 - 1 / p2) * ... * (1 - 1 / pn) (pi是n的质因子)
求小于n且与n互质的数有多少个
http://poj.org/problem?id=2407
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f; int main() { ll n; while(~scanf("%lld", &n), n) { ll ans = n; for(ll i = 2 ; i * i <= n ; i++) { if(n % i == 0) { ans -= ans / i; while(n % i == 0) { n /= i; } } } if(n > 1) ans -= ans / n; printf("%lld ", ans); } return 0; }
(2)当n = p^k时,φ(n) = φ(p^k) = p^k - p^(k - 1)
证明:比p^k小的数总共有p^k - 1个,与p^k不互质的数有:
p*1, p * 2, p * 3, ... , p^k - p(即p(p^(k - 1)- 1))共p^(k - 1)- 1个
所以与p^k互质的数有p^k - 1 - (p^(k - 1)- 1) = p^k - p^(k - 1)个
即φ(n) = φ(p^k) = p^k - p^(k - 1)
(3)当n = p * q 时,φ(n) = φ(p * q) = φ(p) * φ(q), gcd(p, q) = 1;
原根:
如果a不被素数p整除,则a模p的阶是指使得a^e=1(mod m)(即a^e % m = 1)的最小指数e>=1;例如2、3、4、5、6模7的阶分别是3、6、3、6、2。
一个重要的性质:一个数a模m的阶e总能整除m-1。
设m是正整数,a是整数,若a模m的阶等于φ(m)(即a^φ(m) % m = 1),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
奇素数p的原根个数 = φ(p - 1)
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> using namespace std; int main() { int n; while(~scanf("%d", &n)) { n = n - 1; int ans = n; for(int i = 2 ; i * i <= n ; i++) { if(n % i == 0) { ans -= ans / i; while(n % i == 0) n /= i; } } if(n > 1) ans -= ans / n; printf("%d ", ans); } return 0; }