一、欧几里得算法
求a,b的最小公约数。
int GCD(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}
二、扩展欧几里得
求解方程ax + by = gcd(a, b),并返回gcd(a,b)。
简单证明:
//求解ax + by = gcd(a,b)的整数解 返回gcd(a,b)
int exGCD(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int xx, yy;
int gcd = exGCD(b, a%b, xx, yy);
x = yy;
y = xx - a / b * yy;
return gcd;
}
三、扩展欧几里得的一般情况
求解ax + by = c的最小非负整数解x,其中c被gcd(a, b)整除,否则方程无解(裴蜀定理?)
//求解ax + by = c的最小非负整数解x 其中c被gc