Loading

【数学】【模板】扩展欧几里得算法

扩展欧几里得算法

思想

首先回忆一下裴蜀定理:对于任意一对不全为 \(0\) 的整数 \(a, b\),存在 \(x, y\) 使得 \(ax + by = \gcd(a, b)\)

扩展欧几里得算法就是求出一组解满足 \(ax + by = \gcd(a, b)\),这里用到了欧几里得算法,不会的,可以看看我的博客

我们看看怎么求:

  1. \(b = 0\) 的时候,\(ax = \gcd(a, b) = a\),那么 \(x = 1\)
  2. \(a \ne 0\)\(b \ne 0\) 时,我们递归求解出 \((a\bmod b)x_1 + by_1 = \gcd(a, b)\) 后再计算 \(ax + by = \gcd(a, b)\)

\(x_1, y_1\) 推出 \(x, y\)

\[\begin{aligned} (a\bmod b)x_1 + by_1 &= \gcd(a, b)\\ (a - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot b)x_1+by_1&= \gcd(a, b)\\ ax_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot bx_1+by_1&= \gcd(a, b)\\ ax_1+b(y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1) &= \gcd(a, b) \end{aligned} \]

所以 \(x = x_1, y = y_1 - \left\lfloor\dfrac{a}{b} \right\rfloor\cdot x_1\)

然后就在欧几里得算法的时候顺便求出来了。

代码

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

练习题

My Blog : AcWing 878. 线性同余方程题解

posted @ 2024-07-22 09:16  SunnyYuan  阅读(2)  评论(0编辑  收藏  举报