扩展欧几里得定理


现在我们已经知道了,方程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;
}

文章作者: fatzard
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fatzard !
评论
  目录
本站总访问量