• 欧几里得&扩展欧几里得算法


    朴素的欧几里得算法大家应该知道

    \(gcd(a,b)\)表示a,b的最大公约数
    朴素的欧几里得算法其实就是所谓的辗转相除法

    • 辗转相除法
      \(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\)
      证明如下:
      \(设r=a\) \(mod\) \(b\) \(=a-\lfloor\frac{a}{b}\rfloor*b\),\(p=gcd(a,b)\);
      则$$a=xp,b=yp$$
      代入可得$$r=xp-\lfloor\frac{xp}{yp}\rflooryp$$
      提公因式得$$r=p(x-\lfloor\frac{xp}{yp}\rfloor
      y)$$
      所以$$p|r$$
      即$$a,b的最大公约数也是r的约数$$
      \(p`=gcd(b,r)\)
      则$$b=xp,r=yp$$

    \[a=r+\lfloor\frac{a}{b}\rfloor*b \]

    代入得$$a=yp+\lfloor\frac{a}{b}\rfloorxp$$
    提公因式$$a=p(y+\lfloor\frac{a}{b}\rfloor
    x)$$ 所以$$p|a$$
    得出结论:a,b与b,a mod b的公约数相同,所以最大公约数也相同
    得证;

    Code:

    int gcd(int a,int b) 
    {
        if(!b) return a; 
        else return gcd(b,a%b);
    }
    

    扩展欧几里得算法

    扩展欧几里得算法就是在朴素的欧几里得算法上求一组未知数(x,y)的解,满足贝祖定理:\(ax+by=gcd(a,b)\)

    • 公式的推导
      当且仅当\(a>b\)
      \(b=0\)\(x=1,y=0\)
      \(a>b>0\)
      \(ax1+by1=gcd(a,b);bx2+(a\) \(mod\) \(b)y2=gcd(b,a\) \(mod\) \(b)\)
      由朴素欧几里得算法得:\(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\)
      所以\(ax1+by1=bx2+(a\) \(mod\) \(b)y2\)
      \(ax1+by1=bx2+(a-\lfloor\frac{a}{b}\rfloor*b)y2\)
      化简得:\(ax1+by1=bx2+ay2-\lfloor\frac{a}{b}\rfloor*b*y2\)
      由贝祖等式得\(\left\{\begin{array}\\x1=y2\\{y1=x2-\lfloor\frac{a}{b}\rfloor*b} \end{array}\right.\)

    Code:

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

    扩展欧几里得应用

    ①解不定方程
    ②解线性同余方程
    ③求模的逆元

    1.解形如ax+by=c的不定方程

    用扩展欧几里得算法求出解\(ax`+by`=gcd(a,b)\)
    再分别乘上\(\frac{c}{gcd(a,b)}\)
    \(c\) \(mod\) \(gcd(a,b)\neq0\)时无解

    2.解形如\(ax\equiv b(mod\) \(m)\)的线性同余方程

    即$$ax-my=b$$

    \[ax+m(-y)=b \]

    得出:

    \[ax+my=b \]

    同上解除即可。

    3.求\(ax\equiv1(mod\) \(m)\)

    由上式子可得\(x\equiv \frac{1}{a} (mod\) \(m)\)
    所以 x是a的逆元
    同②得:\(ax+my=1\)
    解出x即可.

  • 相关阅读:
    【Python】[面向对象编程] 访问限制,继承和多态
    【Python】[面向对象编程] 类和实例
    【jQuery】 jQuery上下飘动效果
    【jQuery】scroll 滚动到顶部
    【Python】[模块]使用模块,安装第三方模块
    【jQuery】Jquery.cookie()
    【Python】[高级特性]切片,迭代,列表生成式,生成器,迭代器
    【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
    【JavaScript】 JSON
    【CSS3】 线性渐变
  • 原文地址:https://www.cnblogs.com/Chandery/p/11332796.html
Copyright © 2020-2023  润新知