了解欧拉函数前,先来了解一下费马小定理。
费马小定理:假如p是质数,且(a,p)=1,那么 a^(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a^(p-1)%p=1。
====================================================================
举例:a=5,p=3(a是整数,p是质数),5^(3-1)%3=25%3=1。
====================================================================
欧拉函数:用来求1...n-1范围内与n互质的数的个数(φ(n))。若n,a为正整数,且n,a互质,则:a^φ(n)≡1(mod n)即a^φ(n)%n=1。
====================================================================
举例:
例如n=12、a=5(a、n互质),比12小的数且与12互质的数有1、5、7、11,所以φ(n)=4,5^4%12=625%12=1。
另求φ(n),假如12=2*2*3,φ(n)=12*(1-1/2)*(1-1/3)=4。
====================================================================
可以用欧拉定理证明费马小定理(a^(p-1)%p=1):
由于p是质数,所以有φ(p) = p-1,代入欧拉定理(a^φ(n)%n=1)即可证明。推论:对于任意正整数a,有a^p ≡ a (mod p),因为a能被p整除时结论显然成立。
一些重要的定理:
1>若n是质数p的k次幂,φ(n) = p^k-p^(k-1) =(p-1)p^(k-1),因为除了p的倍数外,
其他数都跟n互质。
2>若n为素数,φ(n) = n - 1;(同第6条)
3>当n为奇数时,φ(2n)=φ(n)。
4>欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
5>欧拉定理:对任何两个互质的正整数a, m, m>=2有 a^φ(m) ≡ 1(mod m)。
6>费马小定理:当m是质数p时,此式则为:a^(p-1)≡1(mod m)。
===================================================================
欧拉函数代码如下
int eular(int n) {
int i, res = 1;
for(i = 2; i*i <= n; ++i) {
if(n%i == 0) {
n /= i; res *= i - 1;
while(n%i == 0) {
n /= i; res *= i;
}
}
}
if(n > 1) res *= n - 1;
return res;
}
附上2-100欧拉函数表