算法入门-扩展欧几里德算法

我们先来了解一下什么是欧几里德算法

欧几里德算法又称辗转相除法,它最常用于计算两整数a,b的最大公约数gcd(a,b)(greatest common divisor,简写为gcd)

由上图可知,gcd(a,b)=gcd(b,a%b),采取递归的形式辗转得到最大公约数gcd(a,b),这是欧几里德算法所做的事;

而扩展欧几德求的是ax+by=gcd(a,b)的一组解。

以下为推导过程:

当递归结束时,gcd(a,b)=a; 代入得

即当b=0时,求得一组解x=1,y=0;

那么当b\neq0时,即还在递归过程时,设ax_{1}+by_{2}=gcd(a,b),由上图可知,gcd(a,b)=gcd(b,a%b)。

所以

由递归过程可知,我们知道了上一层递归的x_{2},y_{2},那么我们只要知道a%b,那么就能得到x_{1},y_{1}

由此可知,,代入上式得,
x_{1}=y_{2}

y_{1}=x_{2}-(a/b)*y_{2}

当递归层级更多时,也能推导得到x,y的解

代码实现如下:

int e_gcd(int a,int b,int &x,int &y)
{
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int ret=gcd(b,a%b,x,y);
	int t=x;   //记录上一层递归的x值 
	x=y;     
	y=t-(a/b)*y;//上一层递归的y也通过关系式进行新的赋值 
	return ret; 
}

猜你喜欢

转载自blog.csdn.net/qq_30007603/article/details/81350997