• 简单数论总结2——同余方程与扩展欧几里得算法


    在上一次总结过后鸽了没多久其实是快要开学赶紧来肝上两篇

    今日内容——同余方程和扩展欧几里得算法

    同余

    同余的定义:若存在两个整数a,b,使得(a - b) MOD P为0,则称作a与b在MOD P的情况下同余

    换种通俗的说法,就是,a MOD P与b MOD P相等

    记作  ( aequiv b (mod P) )

    对于整数a,b,c和自然数m,n

    同余具有以下性质:

    1. 自反性:( aequiv a (mod P) )
    2. 对称性:若存在( aequiv b (mod P) ) ,则 ( bequiv a (mod P) )
    3. 传递性:若存在( aequiv b (mod P) ) ,( bequiv c (mod P) ), 则 ( aequiv b (mod P) )
    4. 同加性:若( aequiv b (mod P) ),则 ( (a+c)equiv (b+c) (mod P) )
    5. 同乘性1:若( aequiv b (mod P) ),则 ( (a*c)equiv (b*c) (mod P) )
    6. 同乘性2:若( aequiv b (mod P) ) , ( cequiv d (mod P) ),则 ( (a*c)equiv (b*d) (mod P) )
    7. 同幂性:若( aequiv b (mod P) ),则 ( (a^c)equiv (b^c) (mod P) )

      由此,我们可以得到两条推论

    1.   ( (a*b)mod k = (a mod k)*(b mod k) mod k )
    2.        若( a mod p = x ,a mod q = x,p、q互质,则a mod p*q =x )

       但是,相信像我一样睿智的你也发现了一个问题,没错,同余不满足同除性,即不满足若( aequiv b (mod P) ),则 ( (a/c)equiv (b/c) (mod P) )

      那么除法取模要如何解决呢,秃顶聪明绝顶的数学家也发现了这个问题,利用逆元的知识,我们就可以解决这个问题啦!

      但是逆元,我决定下次再讲,其实就是鸽了(咕咕咕)

    扩展欧几里得算法

      欧几里得算法相信大家都已经知道了QwQ

      就是求gcd的辗转相除法

      不知道的可以去看我的上一篇文章(理直气壮的骗访问量QwQ)

      那么扩展欧几里得算法是啥?(黑人问号.jpg)

      扩展欧几里得算法就是利用了欧几里得算法中迭代的过程,使其能够求出形如( ax + by = gcd(a , b) ) 的方程的应用

      我们可以简单的证明和感性理解一下扩展欧几里得算法的正确性:

      

      首先,当欧几里得算法停止迭代时

      有此情况 ( a=1,b=0,此时,gcd(a,b)=x,ax+by = gcd(a,b)显然成立 )

      在迭代的过程中

      有 ( b{x}' + (a mod b) {y}' = gcd(b, a%b) )与 ( ax + by = gcd(a, b) )

      则由上一层推出

      ( x= {y}' ),( y={x}'-a/b*{y}' )

      于是可推至初始情况,得出解

      

      下面给出代码的实现 

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

      就是这样喵

    对扩展欧几里得定理的应用

      利用扩展欧几里得定理,我们能够求解形如( ax+by = c )的问题

      当 (c mid gcd(a,b) )时,有( ax+by = c )的不定方程有整数解

      所以,把原式变形为 ( ax+by = d (d = gcd(a,b) ) )的形式,利用扩展欧几里得定理可解出方程的一组解( (x,y) ),再将其乘以 ( frac{c} {gcd(a,b)} )

      就能解出原方程的解啦!(快夸我.jpg)

    对扩展欧几里得定理求出解的处理

      由于形如 ( ax+by = c ) 的线性不定方程有无穷多解,扩展欧几里得定理进行求解的过程中,不一定保证求出的是最小正整数解,为得到最小正整数解,我们有如下的方式 

      易推出,对于线性不定方程 (  ax+by = c ),有一组解(x,y) 与另一组解 ( a*(x + frac {a*t} {gcd(a,b)}) ,b*(y- frac {b*t} {gcd(a,b)} | (tin mathbb{Z})) )都为原方程的解

      则可得出方法:对于线性不定方程 (ax+by = c ) ,其最小正整数解为( (  x= ( (x\%t)+t)\%t) ,(t=b/gcd(a,b))),( y=(((y\%t)+t)\%t) ,(t=a/gcd(a,b)) ) )

      至此,问题得到了解决

  • 相关阅读:
    【Unity学习笔记】Unity网络游戏开发实战(一)---网络编程的开端:Echo程序
    【DX11学习笔记】GerstnerWave波浪模拟(基于GPU计算着色器的实现)
    【DX11学习笔记】粒子系统--爆炸特效
    【设计模式】(二)观察者模式是什么?
    【设计模式】(一)工厂模式是什么?
    【C++笔记】C++中常见智能指针auto_ptr、unique_ptr、shared_ptr和weak_ptr的用法
    【C++笔记】C++关联容器set和map的概述和操作
    【C++笔记】C++函数模版与类模版
    【C++笔记】C++中vector、stack、deque、list的简易实际使用方法
    python之赋值、浅拷贝、深拷贝
  • 原文地址:https://www.cnblogs.com/dreagonm/p/9362887.html
Copyright © 2020-2023  润新知