扩展欧几里德算法

扩展欧几里德算法用来在已知《扩展欧几里德算法》《扩展欧几里德算法》的情况下,求等式《扩展欧几里德算法》的一组可行解,该算法思路如下:

  1. 《扩展欧几里德算法》,则有《扩展欧几里德算法》《扩展欧几里德算法》是一组可行解
  2. 《扩展欧几里德算法》,则设《扩展欧几里德算法》递归求等式《扩展欧几里德算法》的一组可行解。设求得的可行解为《扩展欧几里德算法》,则有《扩展欧几里德算法》。又《扩展欧几里德算法》,且《扩展欧几里德算法》,故有《扩展欧几里德算法》。则,《扩展欧几里德算法》为原等式的一组可行解。

扩展欧几里德算法的实现代码如下:

int ex_gcd(int a, int b, int & x, int & y){
    // ax + by = gcd(a,b) = r
    if(!b){
        x = 1; y = 0;
        return a;
    }
    int r = ex_gcd(b, a%b, x, y);
    int t = x; x = y; y = t-a/b*y;
    return r;
}

附上一道练习题:洛谷P1082 同余方程

解题思路:求关于《扩展欧几里德算法》的同余方程《扩展欧几里德算法》的解,即相当于求《扩展欧几里德算法》的解,又《扩展欧几里德算法》《扩展欧几里德算法》必定互质,故相当于求《扩展欧几里德算法》的解,可以使用扩展欧几里德算法。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int ex_gcd(int a, int b, int & x, int & y){
    // ax + by = gcd(a,b) = r
    if(!b){
        x = 1; y = 0;
        return a;
    }
    int r = ex_gcd(b, a%b, x, y);
    int t = x; x = y; y = t-a/b*y;
    return r;
}
int main(){
    int a, b, x, y;
    cin >> a >> b;
    ex_gcd(a, b, x, y);
    cout << (x%b+b)%b << endl;
}
    原文作者:学无止境1980
    原文地址: https://www.jianshu.com/p/a9f5cdefdb47
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞