您的位置:首页 > 其它

欧几里得 与 扩展欧几里得

2014-08-07 20:47 106 查看
欧几里得与扩展欧几里得

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

递归的方式:

int gcd (int a,int b)

{

if (b == 0)

return a;

return gcd (b, a%b);

}

gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)

当然也可以写成非递归的方式,这里就不再多说。

那么什么是扩展欧几里得呢?

百度百科:

扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足等式:ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。

扩展欧几里德常用在求解模线性方程及方程组中。

对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 ax+by=gcd(a,b)。

int exgcd(int a,int b,int&x,int&y)

{

if(b==0)

{

x=1;

y=0;

return a;///对应最底层的递归

}

int r=exgcd(b,a%b,x,y);

int t=x;

x=y;

y=t-a/b*y;

return r;

}

把这个exgcd函数和gcd函数的递归实现相比,发现多了下面的x,y赋值过程,这就是扩展欧几里德算法的精髓。

递归调用的次数为 O(lg b);

下面先来说明这个递归函数所要表达的意思:

首先说的是:exgcd函数的返回值 就是最大公约数。

那么 x y 又是什么?

先说明一下:exgcd函数中x,y表示上层递归的值,x1,y1表示的是下层递归的值,方便理解。

已知:方程 ax+by=c;

由扩展欧几里得定理得:

ax+by=gcd(a,b); gcd(a,b)=gcd(b,a%b);

所以:ax+by=b*x1+(a%b)*y1;

=b*x1+(a-a/b*b)*y1 ****(千万不要以为a-a/b*b等于0了,这里表示的是余数)

=b*x1+a*y1-a/b*b*y1;

=b*(x1-a/b*y1)+a*y1;

所以最终 ax+by = b*(x1-a/b*y1)+a*y1;

由等式恒等得出:

x = y1;

y = x1-a/b*y1;

(x,y表示上层递归的值,x1,y1表示的是下层递归的值)(理解这个递归的过程)

到此 上面的递归函数基本已解决。

那么求出来的x,又代表了什么?

其实得出来的x,y,是方程 ax+by==gcd(a,b) 的一组特殊解.

那这组特殊解有什么用呢?

有什么用呢。。。

有了特殊解我们就可以表达出所有解了。。。

假设 解为x0,y0,那我们可以用这组解来表示整个不定方程的所有解:

x = x0 + b / gcd *t;

y = y0 - a / gcd *t;

这个关系是怎么来的呢。。我也不知道啊。。先记住再说。。。

看个简单的题吧。POJ1061 青蛙的约会

题解:

/article/1510170.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: