• 【OI】同余方程


    一.同余方程的判定

    我们知道同余方程是形如 

    ax ≡ b (mod n)   的东西,用文字表达就是:

    ax和b除以n的余数相同

    那么,经过如下推理:(用=代替恒等于)

    ax=b (mod n) 

    ax=b+n*x2 (转化为b加上n乘上某个数等于ax)

    ax-n*x2=b(移项得)

    a x1 + n x2 = b(转换)

    ax + ny = b

    但是为了看起来更顺眼,我们将除x,y的元素改变名称,得到:

    ax + by = c

    那么,判断是否有解:

    举几个例子,不难得到:

    c|gcd(a,b)时,ax + by = c有解。

    然后可以举几个例子:

    ①2x + 3y = 1

    这是一种特殊情况,解得其中一个解为 x0 = -1, y0 = 1

    ②4x + 6y = 2

    化简为 2x + 3y = 1,解同上

    ③2x + 3y = 5

    解得其中一个解为  x0  = -5, y0 = 5

    发现与①的规律,也就是x0 * 5,y0 * 5

    那么就可以将ax + by = c 简化为ax + by = 1 ,

    换种形式表达就是:ax ≡ 1 (mod n)


    二.同余方程的解法

    这时,我们需要引入exgcd。

    exgcd可以用来求

    ax + by = gcd (a,b)

    那么,如何证明呢?

    先给出结果:

    {

    要解 ax + by  = 1

    先解 bx + (a%b)y = 1

    }

    如何得到它?

    在 bx + (a%b)y = 1 中展开a,得到

    a = b·floor(a/b) + a%b

    代入原方程,得 

    b·floor(a/b) + a%b)x + by = 1

    与ax + by = 1等量代换,得

    (a%b)*x + b(floor(a/b)·x+y) = 1

    得到其中解:y0 = x,x0 = floor(a/b)·x+y

    又由gcd(a,b) = gcd(b,a%b) 得到

    exgcd(a,b,x,y) = exgcd(b,a%b,y,x), y -= (a/b) * x

    代码:

    #include <cstdio>
    void exgcd(int a, int b, int &x, int &y)
    {
        if (b == 0) x = 1, y = 0;
        else exgcd(b, a % b, y, x), y -= (a / b) * x;
    }
    int main()
    {
        int a = 2, b = 3, x, y;
        exgcd(a, b, x, y);
        printf("%d %d
    ", x, y);
        return 0;
    }

     

  • 相关阅读:
    Springboot使用ehcache缓存
    Tomcat启用HTTPS协议配置过程
    细说document.ready和window.onload
    科技创新
    SpringBoot的ApplicationRunner
    禁用Chrome的“请停用以开发者模式运行的扩展程序”提示
    论文排版问题
    mathType换行等号对齐
    内部类调用外部类的成员,同名时怎么调用?
    Tomcat的manager app管理web项目
  • 原文地址:https://www.cnblogs.com/dudujerry/p/10296330.html
Copyright © 2020-2023  润新知