扩展欧几里得算法
2013-04-15 08:26
211 查看
问题:ax+by=c,已知a、b、c,求解使该等式成立的一组x,y。其中a、b、c、x、y均为整数 a,b的最大公约数为gcd(a,b)。如果c不是gcd(a,b)的倍数,则该等式无解,因为等式左边除以gcd(a,b)是整数,而等式右边除以gcd(a,b)后为小数。因此,只有当c是gcd(a,b)的倍数的时候,该等式有解。这样,可以通过计算使ax1+by1=gcd(a,b)成立的x1、y1,然后有x=(c/gcd(a,b))*x1,y=(c/gcd(a,b))*y1,得到x,y。 问题就被转换为求使ax+by=gcd(a,b)成立的一组x,y。
如果b不为零,根据欧几里德定理,可以设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2=bx2+(a-(a/b)*b)y2 化简后有x1=y2,y1=x2-(a/b)y2。因此x1,y1依赖于x2,y2,同理依次类推递归调用求出x3,y3,x4,y4……,类似于辗转相除,直到b=0时,求出xn,yn,便可以推出x1,y1的值。
其它解为x0 + k*b/gcd(a,b),y0-k*a/gcd(a,b),具体参考白书P179.
如果b不为零,根据欧几里德定理,可以设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2=bx2+(a-(a/b)*b)y2 化简后有x1=y2,y1=x2-(a/b)y2。因此x1,y1依赖于x2,y2,同理依次类推递归调用求出x3,y3,x4,y4……,类似于辗转相除,直到b=0时,求出xn,yn,便可以推出x1,y1的值。
// 返回a,b的最大公约数 int extended_euclid(int a, int b, int &x, int &y) { if(b == 0) // gcd(a, b) == a { x = 1; y = 0; return a; } int n = extended_euclid(b, a%b, x, y); int tmp = x; x = y; y = tmp - static_cast<int>(a/b)*y; return n; }
其它解为x0 + k*b/gcd(a,b),y0-k*a/gcd(a,b),具体参考白书P179.
相关文章推荐
- 扩展欧几里得算法学习笔记
- 扩展欧几里得算法
- 扩展欧几里得算法
- [模板] 扩展欧几里得算法详解
- 欧几里得算法以及扩展算法
- 欧几里得算法与其扩展 Romantic
- 算法学习(1)----扩展欧几里得算法
- 扩展欧几里得算法
- 欧几里得算法及其扩展
- 扩展欧几里得算法模板题 zoj 3609
- 扩展欧几里得算法的非递归实现的证明
- 欧几里得算法与其扩展
- 扩展欧几里得算法
- 扩展欧几里得算法——pku1061
- 欧几里得算法与其扩展 Romantic
- 扩展欧几里得算法
- 扩展欧几里得算法
- 欧几里得算法与扩展算法相关内容
- 扩展欧几里得算法
- bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法