gcd(a,b)和exgcd(a,b,x,y)
gcd()
:
int gcd(int a,int b)
{
if(b) return gcd(b,a%b);
else return a;
}
当然也可以使用头文件<algorithm>
自带的函数__gcd(a,b)
exgcd(a,b,x,y)
:
int exgcd(int a,int b,int &x,int &y)
{
int gcd;
if(b){
gcd=exgcd(b,a%b,y,x);
y-=a/b*x;
}
else gcd=a,x=1,y=0;
return gcd;
}
证明:
假设有
①\(ax_1+by_1=gcd(a,b)\)
②\(a'x_2+b'y_2=gcd(a,b)\)
先假设②是在①的下面,也就是说,在递归顺序中②是先执行完的。
我们由\(gcd(a,b)\)的代码实现过程可以很容易得到:
\(a'=b,b'=a\%b=a-a/b*b\)代入②式得\(bx+(a-a/b*b)y_2=gcd(a,b)\),整理一下,\(ay_2+b(x_2-a/b*y_2)=gcd(a,b)\)
跟①式进行对照,即可得出\(\begin{cases}x_1=y_2\\y_1=x_2-a/b*y_2 \end{cases}\)
扫描二维码关注公众号,回复: 8714280 查看本文章即得到了\(x\)和\(y\)的递推关系