『数论』拓展欧几里得

徘徊边缘 提交于 2019-12-01 21:43:58
//#define fre yes

#include <cstdio>

int exgcd(int a, int b, int &x, int &y) {
    int gcd;
    if(b == 0) {
        x = 1;
        y = 0;
        gcd = a;
    } else {
        gcd = exgcd(b, a % b, x, y);
        int x2 = x, y2 = y;
        x = y2;
        y = x2 - (a / b) * y2;
    } return gcd;
}

谈论数论不废话 ----- 拓展gcd

如何求解 \(ax + by = c\)

换个问题 如何求解 \(ax + by = gcd(a, b)\)

∵ 由求 $\gcd $ 我们知道 \(gcd(a, b) = gcd(b, a \mod b)\)

那么很明显,通过这个等式我们就能求出一组特解

\(ax + by = gcd(a, b)\)

\(bx_2 + (a \mod b)y_2 = gcd(b, a \mod b)\)

\(ax + by = bx_2 + (a \mod b)y_2\)

\(ax + by = bx_2 + (a - (\frac{a}{b}) \times b)y_2\)

\(ax + by = bx_2 + ay_2 - (\frac{a}{b})by_2\)

\(ax + by = b(x_2 - (\frac{a}{b})y_2) + ay_2\)

所以我们就得到了

\(x = y_2\)
\(y = x_2 - \left \lfloor \frac{a}{b} \right \rfloor y_2\)

那么对于方程 \(ax + by = c\) 而言

如果 \(c \mod gcd(a,b) == 0\) 就说明有解,解为 \(t \times x,t\times y\) 这个 \(t\)\(\frac{c}{gcd(a,b)}\)

反之不等于则无解

正确性显然(两边同乘一个数显然结果成立,可以想象成去分母)

小拓展:对于 \(ax + by = gcd(a, b)\) 这个式子一定有无数个解,我们让 x 增加 b/gcd(a,b),让 y 减少 a/gcd(a,b),等式两遍仍然成立,从而求出所有 x, y 的通解

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!