\[\text{乘法逆元}\]算法
学习博客学习
这是来自大佬博客的:
对于缩系中的元素,每一个数\(a\)均有惟一的与之对应的乘法逆元\(x\),使得\(ax \equiv 1 (mod \ n)\),一个数有逆元的充分必要条件是\(gcd(a,n)=1\),此时逆元惟一存在ui
设\(a\)的逆元是\(x\) ,\(x\)知足\(ax\equiv1\),由于除法的实质是减法因此,方程也能够写为\(ax-my=1\),求得一组解以后判断\(gcd(x,y)\)是不是一,若是不是则说明不是,由于咱们用\(exgcd\)求得就是一组最小解了。若是是,则需调整\(x\)到相应范围\((0到m-1)\)
Code:spa
int exgcd(int a, int b, int & x, int & y) { if(!b) {x = 1, y = 0; return;} int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } int inv(int a, int n) { int x, y; int d = exgcd(a, n, x, y); return d == 1 ? (x + n) % n : -1; }
是欧拉定理的一种特殊状况
\(a^{p-1}\equiv1(mod \ p)\)
\(a^{p-2}\equiv a^{-1}(mod \ p)\)
除以一个数等于乘上这个数的逆元
除以一个数等于乘他的倒数,而此时的指数为\(-1\)正好就是他的倒数,也就是他的逆元
须要检验求出的幂值\(x\)与\(a\)相乘是否为\(1\)
Code:.net
int power(int x, int y) { int sum = 1; while(y) { if(y & 1) sum = (sum * x) % md; x = (x * x) % md; y >>= 1; } return sum; }
有一个定西叫作求逆元通常公式
\(x=a/b \ mod \ m = x \ mod \ (m *b)/b\)code
\(\frac{a}{b} mod \ k = d\)
\(\frac{a}{b}= kx+d\)
\(a=kbx+bd\)
\(a \ mod \ kb=bd\)
\(\frac{a \ mod \ kb}{b}=d\)blog
由于这个式子里有\(k*b\)须要注意一下他俩很大的时候get
仍是费马小比较的好写qwq博客
谢谢收看,住身体健康!it