扩展欧几里德算法

来源:互联网 发布:old town coffee淘宝 编辑:程序博客网 时间:2024/05/02 04:18
  • 遇见这道题,对求最大公约数又有了新的认识

欧几里得问题

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(这个是推导过程)
原创粉丝点击