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)\),所以有
所以 \(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\) 有解。
                    
                
                
            
        
浙公网安备 33010602011771号