求逆元

模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

 

 

posted @ 2013-04-26 18:10  E_star  阅读(1111)  评论(0编辑  收藏  举报