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