扩展欧几里得算法
裴蜀定理
百度百科上的解释
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
然后呢?我们的扩展欧几里得算法就是为形如 ax + by = c (gcd(a,b) | c)的式子求特解的算法
extend_gcd(int a,int b,int &x,int &y)
首先先介绍一下,extend_gcd 求的是 ax + by = gcd(a,b)的特解
有欧几里得定理可知 :
gcd(a,b) = gcd(b,a % b)
根据裴蜀定理,有:
ax + by = gcd(a,b);
bx1 + (a % b)y1 = gcd(b,a % b) = gcd(a,b);
而 bx1 + (a % b)y1 = gcd(b,a % b) = gcd(a,b)可整理为:
y1 * a + (x1 - a / b * y1) * b = gcd(a,b);
所以有:
x = y1, y = x1 - a / b * y1
因此我们可以通过先求关于gcd(b,a % b)的 x1 和 y1, 然后倒推出 x 和 y;
- 然后我们可以用递归函数实现这一过程;
- 递归的结束条件为b = 0,此时gcd(a,b) = a;
- 意味着 ax + by = a, 即 x = 1, y = 0;
如果要求 ax + by = c 的特解,那么需要保证 gcd(a,b) | c 然后 x *= c / gcd(a,b)就ok啦!
求 ax + by = c的通解
由于通解 = 特解 + 齐次
而我们可以用扩展欧几里得求得特解,剩下得就是求齐次解了
齐次方程为
ax + by = 0;
求得的解为
x = k * (b / gcd(a , b));
y = - k * (a / gcd(a , b));
所以 ax + by = c 的通解为
x = x0(特解) + k *(b / gcd(a,b));
y = y0(特解) - k *(a / gcd(a,b));
其次方程的求解如图所示