zoukankan      html  css  js  c++  java
  • 『数论』拓展欧几里得

    //#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}) imes 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} ight floor y_2)

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

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

    反之不等于则无解

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

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

  • 相关阅读:
    js模块化历程
    夜深
    出差(六)开会
    高情商的十大典型表现
    出差(五)调整
    HighCharts简单应用
    出差(四)适应
    出差(三)尝试
    出差(二)熟悉
    ZTree简单应用
  • 原文地址:https://www.cnblogs.com/Nicoppa/p/11717677.html
Copyright © 2011-2022 走看看