标签:
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