欧拉定理
定义
设m >= 2, (a, m) = 1。 若 ϕ(m) 表示小于m且与m互素的正整数的个数,则有
aϕ(m)≡1(modm)
//m不一定为素数
//若m为素数,则 ϕ(m)=m−1 , 上式变为费马小定理,即am−1≡1(modm)
证明
欧拉定理的证明与费马小定理的证明类似,需要以下引理:
引理1 若 (a,m)=1,r1,r2,⋯,rϕ(m) 是小于m且与m互素的正整数,则
ar1,ar2,⋯,arϕ(m)
的最小剩余(mod m)是r1,r2,⋯,rϕ(m)
的一排列。
//此引理的证明使用反证法即可。
下证欧拉定理
由引理1可得
r1∗r2∗⋯∗rϕ(m)≡(ar1)∗(ar2)∗⋯∗arϕ(m)(modm)
即r1∗r2∗⋯∗rϕ(m)≡aϕ(m)∗(r1∗r2∗⋯∗rϕ(m))(modm)
由于 r1,r2,⋯,rϕ(m) 每一个都与m互素,所以可消去,得1≡aϕ(m)(modm)
得证。
欧拉函数
定义
上面所提及的 ϕ(m) 即为欧拉函数, 表示小于m且与m互素的正整数的个数且有以下计算公式:
若n的素幂分解式为 n=pe11pe22⋯pekk ,则有
ϕ(n)=n(1−1p1)(1−1p2)⋯(1−1pk)
另一种形式为ϕ(n)=pe1−11(p1−1)pe2−12(p2−1)⋯pek−1k(pk−1)
显然二者是等价的。
证明
由积性函数的性质得。
证明所需要引理:
引理2 对一切正整数n, 有 ϕ(pn)=pn−1(p−1) 。
引理3 若 r1,r2,⋯,rϕ(m) 的最小剩余(mod m)是 0,1,2,⋯,m−1 的一个排列, 则 r1,r2,⋯,rϕ(m) 中恰有 ϕ(m) 个元素与m互素。
引理3可证 ϕ(m) 为积性函数,而积性函数具有以下性质:
若 f 是一个积性函数, n的素幂分解式为
n=pe11pe22⋯pekk ,则f(n)=f(pe11)f(pe22)⋯f(pekk)
再由引理2求得的素数幂项,即可求得正整数范围内的 ϕ(n) 。
实现
//欧拉函数 -- 单个
int Euler(int x) {
int ans = x, m = (int)sqrt(x*1.0)+1;
for(int i = 2; i < m; ++i) if(x%i == 0) {
ans = ans / i * (i-1);
while(x%i == 0) x /= i;
}
if(x > 1) ans = ans / x * (x-1);
return ans;
}
//欧拉函数 -- 递推求[1, n]的欧拉函数值phi[i]
void PhiTable(int n, int* phi) {
for(int i = 1; i <= n; ++i) phi[i] = i;
for(int i = 2; i <= n; i += 2) phi[i] /= 2;
for(int i = 3; i <= n; i += 2) if(phi[i] == i) { //i是质数
for(int j = i; j <= n; j += i) {
phi[j] = phi[j] / i * (i-1); //i是j的一个因子
}
}
}
应用
降幂**
如果模不为素数,就不能用费马小定理降幂,所以要用欧拉定理降幂。降幂公式如下:
anmodp=anmodϕ(p)+ϕ(p)modp,n>ϕ(p)
// n<ϕ(p) 的时候不用降幂。
//注意此时p不一定为素数
//而且a和p也不一定互素。所以此式又称广义欧拉定理。
例题
上帝与集合的正确用法 HYSBZ - 3884
Super A^B mod C FZU - 1759
Calculation HDU - 2837
Colossal Fibonacci Numbers! UVA - 11582
Mathematician QSC HDU - 5895
还可以求有关阶,原根,指数相关的问题。
有些题目需要转化为带有欧拉函数的公式。
补一个推论
若n>= 1,则
∑d|nϕ(d)=n