扩展欧几里德算法用来在已知和的情况下,求等式的一组可行解,该算法思路如下:
- 若,则有,是一组可行解
- 若,则设递归求等式的一组可行解。设求得的可行解为,则有。又,且,故有。则,为原等式的一组可行解。
扩展欧几里德算法的实现代码如下:
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;
}