数论 · 扩展欧几里得算法

问题

扩展欧几里得算法是用来在已知 ( 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×(aba×b)=q×a+(pba×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——

posted @ 2022-03-25 07:25  pldzy  阅读(29)  评论(0)    收藏  举报