在CSDN找了各种博客,发现乘法逆元都写得很生涩
于是想自己写一个简单通俗易懂一点的解释
乘法逆元
定义:
如果有ab≡1(modp),则称b是mod p意义下a的乘法逆元。(摘)
三横线为同余符号,即 如果a%p==b%p,则写为 a≡b (mod p)
作用:多用于快速幂取模
如 a /b %c 无法运用快速幂原理 此时我们可以找到 b的乘法逆元 k, a /b %c 就可以等价于 a*k%c=(a%c*k%c)%c
b对c的乘法逆元存在的条件是gcd(b,c)=1 ,即 b,c互为质数
其中k有点像b的倒数,可以类比理解,但其实是倒数的推广,并不真的一定是倒数。
求乘法逆元方法,这里先给出拓展欧几里得
void exgcd(int a,int b,int& d,int& x,int& y){
if(!b) { d=a;x=1;y=0;}
else { exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
这是小紫书上的拓展欧几里得模板 具体原理可以自行百度,以后也会更新博客给出。
拓展欧几里得一大作用就是解决 对于给定的a,b,c求 ax+by=c 的解(x,y) 这一类问题
而拓展欧几里得是先求出ax+by=gcd(a,b)的一组解(x1,y1) 在乘上 c/gcd(a,b)得出ax+by=c 的解(x2,y2).
对于乘法逆元(对a求乘法逆元b) ab≡1(modp) ,a*b%p=1%p=1,设 y1=ab-1/p
得 ab-py1=1
即ab+py2=1=gcd(a,p) (y2=-y1,系数互质参见上文)
如此一来就满足 ax+by=c 形式
对于给定的 a,p 通过拓展欧几里得 我们可以求得一组解(b,y2) 而 b恰好就正是a的乘法逆元。
就酱啦~有错误或者笔误还请评论指出~