扩展欧几里德算法
2017-12-07 21:25
176 查看
遇见这道题,对求最大公约数又有了新的认识
对于ax + by = c; 在 c % gcd(a,b) = 0的时候,我们一般先求 a/gcd(a,b) x + b/gcd(a,b) y = 1的解,然后在扩大c倍,就是原问题的解。当然c % gcd(a,b) != 0 的时候,原问题无解。
根据下面参考文献中的原理,我们可以得到下面的程序:
对于程序中加*号的地方,我的理解:
由参考文献可知,x1 = y2; y1 = x2 - a/b * y2; 因为经过了一步,gcd(b, a%b, d, y, x); 所以 此时的 y = x2; x = y2; 所以根据将 y1 公式翻过去就是 y = y - x *(a/b);
欧几里得问题
int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a%b); }
扩展欧几里得问题
对于ax + by = c; 在 c % gcd(a,b) = 0的时候,我们一般先求 a/gcd(a,b) x + b/gcd(a,b) y = 1的解,然后在扩大c倍,就是原问题的解。当然c % gcd(a,b) != 0 的时候,原问题无解。
根据下面参考文献中的原理,我们可以得到下面的程序:
#include<iostream> using namespace std; void gcd(int a, int b, int &d, int &x, int &y) { if (!b) { d = a; x = 1; y = 0; }else { gcd(b, a%b, d, y, x); y -= x*(a/b); //*** } } int main() { int a, b, d, x, y; a = 6; b = 15; gcd(a, b, d, x ,y); cout << x << " " << y << " " << d; }
对于程序中加*号的地方,我的理解:
由参考文献可知,x1 = y2; y1 = x2 - a/b * y2; 因为经过了一步,gcd(b, a%b, d, y, x); 所以 此时的 y = x2; x = y2; 所以根据将 y1 公式翻过去就是 y = y - x *(a/b);
参考
http://blog.csdn.net/rising_fallmoon/article/details/10724239(这个是推导过程)相关文章推荐
- hdu1576 A/B(扩展的欧几里德算法)
- 扩展欧几里德算法
- 用扩展的欧几里德算法求最大公约数以及逆元
- 扩展欧几里德算法求解线性同余方程
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法、证明及其应用
- 扩展欧几里德算法
- 欧几里德算法,扩展的欧几里德算法
- hdu 1576 A/B 欧几里德算法的扩展
- 扩展的欧几里德算法的学习
- 扩展欧几里德算法
- 扩展欧几里德算法详解
- 扩展欧几里德算法
- 扩展欧几里德算法求不定方程
- (扩展)欧几里德算法
- 扩展欧几里德算法
- 扩展欧几里德算法详解
- 扩展欧几里德算法模版题(求逆元+分析+题目)HDU1576 A/B
- 扩展欧几里德算法及其应用
- 扩展欧几里德算法