欧几里德算法戳这
一、概述
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。——百度百科
二、代码实现
//摘自《挑战程序设计竞赛 第二版》 int extgcd(int a,int b,int& x,int& y){ int d=a; if (b!=0){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; }else{ x=1;y=0; } return d; }
三、算法分析 (摘自http://blog.csdn.net/acmore_xiong/article/details/47694909)
需要用到的欧几里德表达式
①gcd(a,b)=gcd(b,a%b)
②gcd(a,0)=a
设如下两个方程:
ax+by = gcd(a,b) = d;
bx’+(a%b)y’ = gcd(b,a%b);
因为,gcd(a,b) = gcd(b,a %b),
所以,ax+by = bx’+(a%b)y’ = bx’ +(a – [a/b]*b)y’ = ay’ + b(x’ – [a/b]y’),
由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。
所以参数x,y不断的被取代,函数递归下去,但是a%b会等于0,等于0时,gcd(a,0)=a,所以a*x+0*y=a,x=1,y=0。然后返回得到x,y的值。