http://blog.csdn.net/only_air/article/details/51675261推荐我哥们的讲的逆元,当然也可以看我写的
下面来看看逆元的定义的用处:
逆元应用于除法取模之中,有两种求法,扩展欧几里得和小费马定理;
1. 扩展欧几里得适用于任何情况,下面介绍Euclid的Extended——gcd求逆元:
比如:如果(a * b)% mod == 1 ,那么的话a 和 b 互为逆元,已知 a,和 mod 就能求出a的逆元,相同地,已知b和mod就能求出b的逆元b了,不过对应的存在逆元的条件是
a % mod 的逆元存在的充要条件是 a和 mod 互质,即gcd( a , mod ) ==1 ;类似地,求b %mod 的逆元也是一样的。
然后求逆元的方法是:
比如求a % mod的逆元b,则利用方程 a * x + mod * y == 1;利用Extended_gcd()扩展欧几里得求出x 的值就是a % mod 的逆元, 这个方程的 y 代表的是 mod % a 的逆元。
利用同模方程求出的x经过最小正数操作就是逆元了,即(x% mod +mod)%mod;
有了逆元就可以进行一些巧妙的操作:
比如要求 ( a/b)%mod的值,如果gcd( b , mod ) == 1,设p 是 b % mod的逆元,即 (b * p)% mod ==1,所以(a/b) % mod == (a * p) % mod;
(a/b)%Mod=c; (b*p)%Mod=1; ==》 (a/b)*(b*p) %Mod=c; ==》 (a*p)%Mod=c;
利用b * x +mod * y =1 和扩展gcd就可以求出a 的逆元p,代入,结果就可以出来了。
2.小费马定理适用于mod为质数的去情况,比如求(a/b)%mod,这样的话就要求b %mod的逆元,如果mod是质数的话,就可以利用 b ^(mod - 2) % mod,其实就相当于转到了快速幂的模块了,敲一个快速幂就出来了。,
下面来说说小费马定理:
费马小定理:对于质数 p 和任意整数 a,有 a ^ p ≡ a (mod p)
将两边同时约去一个 a,则有 a ^ (p - 1) ≡ 1(mod p)。
解决a/b的另一个方法:
3.当除数不存在逆元并且b|a,那么a/b % mod = a % (b * mod) /b % mod;