乘法逆元

满足x与y的乘积对z取模等于1时,x和y对于模数z来说互为逆元
即 x*y=1(mod z)
为什么要求逆元呢?
比如求 (a/b)mod p 时,如果a太大,无法求得 a/b 时,我们可以先求出在模数p下与b互为逆元的数k,那么 (a/b)mod p 转化成 (a*k)mod p

证明:

根据b*k1 (mod p)有b*k=p*x+1。
k=(p*x+1)/b。
把k代入(a*k) mod p,得:
(a*(p*x+1)/b) mod p
=((a*p*x)/b+a/b) mod p
=[((a*p*x)/b) mod p +(a/b)] mod p
=[(p*(a*x)/b) mod p +(a/b)] mod p
//p*[(a*x)/b] mod p=0
所以原式等于:(a/b) mod p

如何求逆元呢?
根据扩展欧几里算法:a*x+b*y = gcd(a,b);
等号两边同时对b取模:a*x % b = gcd(a,b)%b;
当gcd(a,b)=1 ,即a和b互质时:a*x % b = 1;
得到了在b下与a互为逆元的数x;
ps:如果求出来x和b不同号就将x加或减去b使x和b同号。

你可能感兴趣的:(乘法逆元)