乘法逆元.拓展欧几里得实现

在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的乘法逆元。

就酱啦~有错误或者笔误还请评论指出~

你可能感兴趣的:(数论)