Algorithm: Euler function

欧拉函数。

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互质

你可能感兴趣的:(Algorithm)