一个写的非常好的证明链接:扩展欧几里德算法的证明
欧几里德算法 又称 辗转相除法,用于计算两个整数a,b的最大公约数。
公式表述
gcd(a,b)=gcd(b,a mod b)
扩展欧几里德算法
扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by = Gcd(a, b) =d(解一定存在,根据
数论中的相关定理)。 (定理:裴蜀定理)
满足的解x,y可以写成如下形式:
根据最开始的链接里的证明,上面的不等式右边似乎可以进一步放缩,再除以2.
证明如下:
欧几里得算法代码:
//欧几里得算法 返回a,b的最大公约数
int EUCLID(int a, int b)
{
if (b == 0) return a;
else
return EUCLID(b, a%b);
}
扩展欧几里得算法:
//扩展欧几里得算法,求出来的是绝对值最小的那对系数
int EXTENDED_EUCLID(int a, int b, int &x, int &y)
{
if (0 == b)
{
x = 1; y = 0;
return a;
}
int y1, gcd;
gcd = EXTENDED_EUCLID(b, a%b, y1, x);
y = y1 - (a / b)*x;
// printf("%d%d\n", x, y);
return gcd;
}