码迷,mamicode.com
首页 > 编程语言 > 详细

扩展欧几里得算法(extended Euclidean algorithm)的一个常犯错误

时间:2016-04-29 09:24:34      阅读:560      评论:0      收藏:0      [点我收藏+]

标签:

1 int exGcd(int x,int y,int& a,int& b) //ax+by=gcd(x,y)
2 {
3     if(!y) { a=1; b=0; return x; }
4     int res=exGcd(y,x%y,a,b);
5     int t=a; a=b; b=t-x/y*b;
6     return res;
7 }
int exGcd(int x,int y,int& a,int& b) //ax+by=gcd(x,y)
{
    if(!y) { a=1; b=0; return x; }
    int res=exGcd(y,x%y,a,b);
    int t=a; a=b; b=t-b*x/y;
    return res;
}

找找看,能发现两份代码的区别么?

事实上,只有第一份是正确的,而第二份代码有着很隐蔽的错误

在exGcd的过程中,我们求ax+by=g(g=gcd(a,b))的一组解,需要先递归求出ay+bm=g(m=x mod y)的解

记x=ky+m(k=x div y),欲由ay+b(x-ky)=g(整理得bx+(a-bk)y=g)得到ax+by=g的解,需使a←b,b←a-bk

由于这里的k不是整除得出的结果,所以在编程时,写成b=t-b*x/y的形式是错误的

扩展欧几里得算法(extended Euclidean algorithm)的一个常犯错误

标签:

原文地址:http://www.cnblogs.com/Onlynagesha/p/5445076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!