您的位置:首页 > 其它

扩展欧几里德算法

2017-12-07 21:25 176 查看
遇见这道题,对求最大公约数又有了新的认识

欧几里得问题

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(这个是推导过程)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论