求逆元
模P乘法逆元:
对于整数a、p,如果存在整数b,满足ab mod p =1,则说,b是a的模p乘法逆元。
定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1
证明: 首先证明充分性 如果gcd(a,p) = 1,根据欧拉定理,a^φ(p) ≡ 1 mod p,因此 显然a^(φ(p)-1) mod p是a的模p乘法逆元。 再证明必要性 假设存在a模p的乘法逆元为b ab ≡ 1 mod p 则ab = kp +1 ,所以1 = ab - kp 因为gcd(a,p) = d 所以d | 1 所以d只能为1
逆元主要帮助我们来求a/b%mod的值,我们知道加,减,乘的运算可以取余,但是除法不能直接取余,a/b%mod = a*reverse(b)%mod;
证明:
在计算(a/b)%Mod时,往往需要先计算b%Mod的逆元p(b有逆元的条件是gcd(b,Mod)==1,显然素数肯定有逆元),然后由(a*p)%Mod得结果c。这里b的逆元p满足(b*p)%Mod=1。先来简单证明一下:
(a/b)%Mod=c; (b*p)%Mod=1; ==》 (a/b)*(b*p) %Mod=c; ==》 (a*p)%Mod=c;
如何求逆元:
方法1:
(p是mod) 首先这里要保证 gcd(b,p)=1
根据费马小定理 若gcd(b,p)=1 则 b^phi(p)== 1(mod p),与a/b,合并一下, a/b=a*b^(-1) ,那就是 a/b == a * b^(phi(p)-1) (mod p) 这里要用到欧拉函数
二分求幂...
方法2:
若gcd(b,p)=1,则可根据扩展欧几里得算法得出 bx==1 (mod p) 与a/b,合并一下, 答案 就是 a/b*(b*x)==ax (mod p)
扩展欧几里德算法,大家应该都知道,就是已知a、b,求一组解(x,y)使得a*x+b*y=1。这里求得的x即为a%b的逆元,y为b%a的逆元(想想为什么?把方程两边都模上b或a看看)。调用ExtGcd(b,Mod,x,y),x即为b%Mod的逆元p。
题目:
http://www.cnblogs.com/E-star/archive/2013/04/26/3045436.html