exgcd 与裴蜀定理

欧几里得算法(辗转相除法)

\(\gcd(a,b) = \gcd(b, a\%b)\),当 \(b = 0\) 时为 0。

补充(更相减损术):当 \(b > a\) 时,\(\gcd(a,b) = (b - a > a \ ?\ \gcd(a, b - a) : \gcd(b - a, a))\)

可以递归求解 \(\gcd\),也可以循环求:

int gcd(int a, int b) {
  return (b ? gcd(b, a % b) : a);
}

int gcd(int a, int  b) {
  if (!a) return b;
  while (a ^= b ^= a ^= b %= a);
  return b;
}

扩展欧几里得算法(exgcd)

求一组 \(ax+by = \gcd(a, b)\) 的可行性解。

\(\begin{cases} ax_1 + by_1 = \gcd(a, b) \\ bx_2 + (a \% b)y_2 = \gcd(b, a \% b) \end{cases}\)

由欧几里得算法:\(\gcd(a, b) = \gcd(b, a \% b)\),所以有

\[\begin{aligned} ax_1 + by_1 &= bx_2 + (a \% b)y_2 \\ &= bx_2 + (a - b \lfloor \frac{a}{b} \rfloor) y_2 \\ &= bx_2 + ay_2 - b \lfloor \frac{a}{b} \rfloor y_2 \\ &= ay_2 + b(x_2 - \lfloor \frac{a}{b} \rfloor y_2) \end{aligned} \]

所以 \(x_1 = y_2, y_1 = x_2 - \lfloor \frac{a}{b} \rfloor y_2\) ,将 \(x_2, y_2\) 带入递归直至 \(\gcd(a, b) = 0\) 饭后 \(x = 1, y = 0\) 回去求解 。

int exgcd(int a, int b) {
  if (!b) {
    x = 1, y = 0;
    return a;
  }
  int g = exgcd(b, a % b), ty = y;
  y = x - a / b * y, x = ty;
  return g;
}

通解

\(x_1, y_1\) 为其中一组解。

通解为 \(\begin{cases} x = x_1 + k\frac{b}{\gcd(a, b)} \\ y = y_1 - k\frac{a}{\gcd(a, b)} \end{cases}\)

关于值域

详情见 OI-Wiki

结论,若 \(a,b \neq 0\),有 \(|x| \leqslant a, |y| \leqslant b\)

裴蜀定理

\(a, b\) 是不全为零的整数,对任意整数 \(x, y\),满足 \(\gcd(a,b)\mid ax+by\),且存在整数 \(x, y\), 使得 \(ax + by = gcd(a, b)\)

对于第一点,因为 \(\gcd(a, b) \mid a, b\),因此成立。对于第二点,有 exgcd 可知。

且裴蜀定理对于多个整数也成立。

同余方程

对于同余方程 \(ax \equiv c \pmod b\),即 \(ax + by = c\)

\(\gcd(a,b) \mid c\) 则有解,否则算出 \(ax + by = \gcd(a, b)\) 的解 \(x1, y1\), \(x = x1 \cdot \frac{c}{gcd(a,b)}\)

逆元

\(a\) 在模 \(m\) 意义下的逆元,等同于解 \(ax \equiv 1 \pmod m\),当且仅当 \(\gcd(a, m) = 1\) 有解。

posted @ 2025-07-14 08:43  xiehanrui0817  阅读(10)  评论(0)    收藏  举报