丢番图方程:
有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行。
a * x + b * y = c ( 其中所有数均为整数, 已知 x, y, c ) 例如:鸡兔同笼问题.
扩展 欧几里得算法:
拓展欧几里得算法是基于欧几里得算法而来解 一类特殊的线性丢番图方程: a * x + b * y = gcd(a,b) (已知 a, b)
当gcd(a,b) = 1,即a,b互质的时候,这个方程的解实际上就对应了a关于模b 的逆元。
简单看出 x = 1 , y = 0 是方程的一组特解
根据欧几里得算法:a * x + b * y = gcd(a, b) 可以得出,
b * x + (a % b) * y = gcd(a, b)
又因为, a % b = a - (a / b) * b (a/b 为整除关系, 即a / b 向下取整)
所以 b * x + (a - (a / b) * b )) * y = gcd(a, b)
整理之后得到:a * y + b * (x - (a / b) * y) = gcd(a,b);
x = y y = (x - (a / b) * y )
代码实现(结果返回了 a和 b 的最大公约数, x , y 使得方程成立)
int exgcd(int a,int b,int &x,int &y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int r = exgcd(b,a%b,x,y);
int temp = x;
x = y;
y = temp - a / b * y;
return r;
}