您的位置:首页 > 其它

扩展欧几里得算法

2015-08-06 01:03 344 查看
  对于 a 、b 不全为0,存在整数 x 和 y 使得 gcd(a,b)=x*a+y*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;
}


扩展欧几里得算法
  


  首先,我们看一下他是怎么形成的。从最后一层往上推:首先b=0 时得到最大公约数 a ,return a; 现在看上一层,从r那句后继续往下运行,可以知道,此后,每次都从r 句 获得已经得到的最大公约数,然后再往下执行。。。

对于倒二层的a、b来说,b就是a、b的最大公约数,那么有 b = x1*a + y1*b ; (即 x1=0; y1=1;)

  同样,对于倒三层的a、b来说,倒二层的b也是这一层a、b的最大公约数 有 b' = x2*a + y2*b ; b'=a%b; b'=x1*a'+y1*b' ; b'=x1*b+y1*(a%b) ;

---> x1*b+y1*(a%b) = x2*a+ y2*b;

----> (***) 这一步非常关键。就是化解a%b x1*b+y1*(a-a/b*b) = x2*a + y2*b (这里的除是计算机编程里的除)

-----> 合并同类项 x1*b + a* y1 - (a/b*b)*y1= x2*a+y2*b;

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

-----> x2=y1; y2=x1- a/b *y1; (la-la-la 终于出来了、、)

  也就是说下一层的x等于上一层的y,下一层的y等于上一层的x-a/b*上一层的y,这里的a/b是这一层的。。。这里虽然拿特列:倒二倒三层解释,但由于没有涉及具体的x、y值,所以得出的公式应该是通用的。 这解释了我们代码的写法原因,同时最后一层的a本身就是公约数,b为0,所以x0=1;y0=0;

  采用递归写法先到底层,然后由底层的x、y逐步上推,得到顶层的x、y,就是我们想求的x、y。。。

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