拓展歐幾里得演算法
阿新 • • 發佈:2020-08-04
如果還不太熟歐幾里得演算法戳這裡
既然被稱為拓展歐幾里得演算法
它和\(a,b,a\)%\(b\)脫不了干係
首先我們設方程\(ax+by=gcd(a,b)\)
若已知道了\(x1,y1滿足bx1+(a\)%\(b)y2=gcd(a,b)\)的一組解
要求\(ax+by=gcd(a,b)\)的一組解
而\(a\)%\(b=a-(a/b)*b\)
則可列出式子:
\(bx1+(a-(a/b)*b)y1=gcd(a,b)\)
開始整理:
\(bx1+ay1-(a/b)*b*y1=gcd(a,b)\)
提出\(a,b\):
\(ay1+b(x1-a/b*y1)=gcd(a,b)\)
\(ax+by=gcd(a,b)\)
對比發現當\(x\)取\(y1,y\)取\(x1-a/b*y1\)時方程成立!
於是就可以快樂地賦值求解了
然後當\(b==0\)時方程變為了\(ax+0y=gcd(a,b)=a\)
則此時的解為\(x=1,y=0\)
這樣子再遞歸回溯就可以解出\(ax+by=gcd(a,b)\)的解了
程式碼長這樣↓
int exgcd(int a,int b){
if(b==0){
x1=1,y1=0;
return a;
}
return exgcd(b,a%b);
int x=y1,y=x1-a/b*y1;
x1=x,y1=y;
}
最後的\(x1\)和\(y1\)就是目標方程的一組特解了
結語
這個拓展歐幾里得演算法從歐幾里得演算法入手
可以解決一些逆元相關的問題(之後會說,會放連結的)
還是很普遍的,知識較為基礎,望大家掌握