算法数据结构和算法分析

扩展欧几里德算法

2019-02-20  本文已影响0人  学无止境1980

扩展欧几里德算法用来在已知ab的情况下,求等式a\cdot x+b\cdot y=gcd(a, b)的一组可行解,该算法思路如下:

  1. b=0,则有gcd(a, b)=gcd(a, 0)=a\{x=1, y=0\}是一组可行解
  2. b\neq 0,则设a=k\cdot b+r(0\le r<b),递归求等式b\cdot x+r\cdot y=gcd(b, r)的一组可行解。设求得的可行解为\{x=x', y=y'\},则有b\cdot x'+r\cdot y'=gcd(b, r)。又b\cdot x'+r\cdot y'=b\cdot x'+(a-k\cdot b)y'=a\cdot y'+b(x'-k\cdot y'),且gcd(b, r)=gcd(a, b),故有a\cdot y'+b(x'-k\cdot y')=gcd(a, b)。则,\{x=y', y=x'-k\cdot y'\}为原等式的一组可行解。

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

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 同余方程

解题思路:求关于x的同余方程ax\equiv 1(mod\ b)的解,即相当于求a\cdot x+b\cdot y=1的解,又ab必定互质,故相当于求a\cdot x+b\cdot y=gcd(a, b)的解,可以使用扩展欧几里德算法。

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;
}
上一篇 下一篇

猜你喜欢

热点阅读