数学-乘法逆元
因为luogu博客不知道为什么一直抽风,数学公式有渲染不出来,所以我直接用图片了...
1.定义
逆元素,是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数。
如果说 a 在模 p 意义下的乘法逆元是 x,那么 \(ax \equiv 1 \pmod{p}\)
2.求逆元的方法
·扩展欧几里得
1. 同余方程的转化
\(ax \equiv 1 \pmod{p}\) \(-->\) \(ax+by=\)\(gcd(a,b)\)
∵\(b≥2\)
∴\(ax\) \(mod\) \(b\) = \(1\) \(mod\) \(b\)
∴\(ax\) \(mod\) \(b\) =\(1\)
根据模的定义,我们设 \(y\) ,使 \(y\) 满足 \(ax+by=1\) (此时 \(y\) 为负数)。
∵\(k | a\) , \(k | b\)
∴\(k | ax\) , \(k | by\)
∴\(k | ax+by\)
∵ \(ax+by=1\)
∴ $ gcd(a,b) | 1 $
当 \(x\) , \(y\) 有整数解时, \(gcd(a,b)\) 只能等于 \(1\)。
∴ \(ax+by=\) \(gcd(a,b)\)
2. 扩展欧几里得的求解
设 \(G=\)\(gcd(a,b)\),令 \(ax+by=G\) 。
设 \(x'\) , \(y'\),使其满足
\(bx'+(\) \(a\) \(mod\) \(b\) \()y'=G\)
那么 \(ax+by=bx'+(\) \(a\) \(mod\) \(b\) \()y'\)
∵ \(a\) \(mod\) \(b\) \(=\) \(a-b \times (a/b)\)
∴ \(bx'+(\) \(a\) \(mod\) \(b\) \()y'\)
\(=bx'+(\) \(a-b \times (a/b)\))\(\times\)\(y'\)
\(=bx'+ay'-b \times (a/b) \times y'\)
$=ay'+b \times(x'-(a/b)y') $
∴ \(ax+by=ay'+b \times(x'-(a/b)y')\)
那么 \(x'\),\(y'\)怎么求呢?其实对辗转相除法较为熟悉的朋友们,现在已经知道该怎么求解了。如果还不知道也不用着急。我们回看这两个式子。
\(ax+by=bx'+(\) \(a\) \(mod\) \(b\) \()y'\)
\(bx'+(\) \(a\) \(mod\) \(b\) \()y'=G\)
其实这便于 辗转相除法 相同,通过不断缩小求解未知数,然后递归求解。
代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y;
void exgcd(int a,int b){
//ax+by=gcd(a,b);
if(b==0){
x=1;
y=0;
return;
}
exgcd(b,a%b);
int tmp=x;
x=y;
y=tmp-a/b*y;
}
signed main(){
long a,b;
cin>>a>>b;
exgcd(a,b);
x=(x%b+b)%b;
cout<<x;
return 0;
}
本文来自博客园,作者:Wh1sky,转载请注明原文链接:https://www.cnblogs.com/wh1sky/p/17557715.html