数论 · 扩展欧几里得算法
问题
扩展欧几里得算法是用来在已知 ( a , b ) (a,b) (a,b) 时,求解一组 ( p , q ) (p,q) (p,q),使得
p × a + q × b = gcd ( a , b ) p \times a + q \times b = \gcd (a, b) p×a+q×b=gcd(a,b)
求解
首先,解一定存在(证明略)。
其次,由 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd (a, b) = \gcd (b,a\bmod b) gcd(a,b)=gcd(b,amodb) 可得:
p ′ × a + q ′ × b = gcd ( b , a m o d b ) = p × b + q × ( a m o d b ) = p × b + q × ( a − ⌊ a b ⌋ × b ) = q × a + ( p − ⌊ a b ⌋ × q ) × b p' \times a + q' \times b = \gcd (b, a\bmod b) = p \times b + q \times (a \bmod b) = p \times b + q \times (a - \left\lfloor\dfrac{a}{b}\right\rfloor \times b) = q \times a + (p - \left\lfloor\dfrac{a}{b}\right\rfloor \times q) \times b p′×a+q′×b=gcd(b,amodb)=p×b+q×(amodb)=p×b+q×(a−⌊ba⌋×b)=q×a+(p−⌊ba⌋×q)×b
注意,在这一行柿子中, p ′ , q ′ p', q' p′,q′ 是当前求解的答案, p , q p,q p,q 是上一次已经求出的答案。
因为当前 exgcd 中的 a 和 b 与上一次 exgcd 中的 a 和 b 不同,所以对应的解不同。
所以,当 a a a 和 b b b 都在减小时,就可以得出 p = 1 , q = 0 p = 1,\ q = 0 p=1, q=0。
然后递归回去的时候就可以求出最终的 p p p 和 q q q 了。
代码
inline void exgcd (int a, int b)//求解 ap + bq = gcd (a, b) 时的 p 和 q
{
if (!b)//此时有了 gcd (a, b)
{
x = 1, y = 0;
return;
}
exgcd (b, a % b);
int t = x;
x = y, y = t - a / b * y;
//此时的 x, y 满足 ax + by = gcd (a, b)
}
—— E n d End End——

浙公网安备 33010602011771号