乘法逆元、逆元应用、求逆元(费马小定理,扩展欧几里得)

匿名 (未验证) 提交于 2019-12-03 00:21:02

乘法逆元

对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n)

逆元的含义:模n意义下,1个数a如果有逆元x,那么除以a相当于乘以x。


逆元的应用

当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:
设c是b的逆元,则有b*c≡1(mod m);
则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);
即a/b的模等于a*b的逆元的模;

逆元就是这样应用的;


求逆元的方法

(1)费马小定理

(p-1)


const int mod = 1000000007; long long quickpow(long long a, long long b) {     if (b < 0) return 0;     long long ret = 1;     a %= mod;     while(b) {         if (b & 1) ret = (ret * a) % mod;         b >>= 1;         a = (a * a) % mod;     }     return ret; } long long inv(long long a) {     return quickpow(a, mod - 2); }


(2)拓展欧几里德

我们都知道模就是余数,比如12%5=12-5*2=2,18%4=18-4*4=2。(/是程序运算中的除)

那么ax≡1 (mod p)即ax-yp=1.把y写成+的形式就是ax+py=1,为方便理解下面我们把p写成b就是ax+by=1。就表示x是a的模b乘法逆元,y是b的模a乘法逆元。然后就可以用扩展欧几里得求了。

算法复杂度O(logn)

ll extend_gcd(ll a, ll b, ll &x, ll &y) {       if (b == 0) {           x = 1, y = 0;           return a;       }       else {           ll r = extend_gcd(b, a % b, y, x);           y -= x * (a / b);           return r;       }   }   ll inv(ll a, ll n) {       ll x, y;       extend_gcd(a, n, x, y);       x = (x % n + n) % n;       return x;   }  




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!