我们先来了解一下什么是欧几里德算法。
欧几里德算法又称辗转相除法,它最常用于计算两整数a,b的最大公约数gcd(a,b)(greatest common divisor,简写为gcd)
由上图可知,gcd(a,b)=gcd(b,a%b),采取递归的形式辗转得到最大公约数gcd(a,b),这是欧几里德算法所做的事;
而扩展欧几德求的是的一组解。
以下为推导过程:
当递归结束时,gcd(a,b)=a; 代入得
即当时,求得一组解x=1,y=0;
那么当时,即还在递归过程时,设,由上图可知,gcd(a,b)=gcd(b,a%b)。
所以
由递归过程可知,我们知道了上一层递归的,那么我们只要知道a%b,那么就能得到
由此可知,,代入上式得,
当递归层级更多时,也能推导得到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;
}