现在我们已经知道了,方程ax+by=gcd(a,b) 的一组可行解一定有一组可行解,那么如何求解它喃?
而这个时候我们有一个方法可以帮助我们求解:
扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求ax+by=gcd(a,b) 的一组可行解。
下面来看一下证明:
(没加载出来一定要多刷新一下,这渲染太慢了)
那么将x2,y2 不断代入递归求解直至gcd 为 0为止
在这之前有
,故x=1,y=0,再反过来带回去迭代便可以求出一组可行解
代码实现:
#include<bits/stdc++.h>
using namespace std;
int ex_gcd(int a,int b,int &x,int &y)//扩展欧几里得求ax+by=gcd(a,b);
{
if(!b){
x=1;
y=0;
return a;
}
int gcd=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return gcd;
}
int main()
{
int a,b,x,y;
cin>>a>>b;
int gcd=ex_gcd(a,b,x,y);
printf("%dx+%dy=%d\n",a,b,gcd);
cout<<"x="<<x<<" y="<<y<<endl;//方程的特解,可由线性代数相关知识推出通解;
return 0;
}