数论专题-扩展欧几里得算法
本篇博客是【数论专题】系列的第 \(7\) 篇,希望大家多多支持。
扩展欧几里得算法是用来求解 \(a\times x + b\times y = \gcd(a, b)\) 的一种算法。
首先,根据数论中的相关定理,此方程一定有解。
因为 \(\gcd(a, b) = \gcd(b, a\bmod\ b)\),所以 \(a\times x + b\times y = \gcd(a, b) = \gcd(b, a\bmod\ b) = x \times b + y\times (a\bmod\ b)= x\times b + y\times (a - \lfloor \frac{a}{b} \rfloor \times b) = y\times a + (x - \lfloor \frac{a}{b} \rfloor \times y)\times b\)。
可以根据欧几里得算法递归,当 \(b = 0\) 时,可以得出 \(x = 1, y = 0\),。
扩展欧几里得算法流程如下:
- 当 \(b = 0\) 时,\(x = 1, y = 0\)。
- \(b\ne 0\),则往下递归计算 \(\gcd(b, a\bmod\ b)\),得到一组解 $ x',y'\(,根据以上的推论,\)x = y',y = x' - \lfloor \frac{a}{b} \rfloor \times y'$。
扩展欧几里得算法时间复杂度与欧几里得算法一样,为 \(O(\log \max(a, b))\)
void exgcd(int a, int b)
{
if(b == 0)
{
x = 1, y = 0;//b = 0 时,x = 1,y = 0
return;
}
exgcd(b, a % b);//递归
int tmp = x;
x = y;
y = tmp - a / b * y;
}

浙公网安备 33010602011771号