zoukankan      html  css  js  c++  java
  • exgcd

    转自https://www.cnblogs.com/hadilo/p/5914302.html

    欧几里得

    定义: (gcd(a,b))为整数 (a)(b) 的最大公约数

    引理:(gcd(a,b)=gcd(b,a mod b))

    证明:

        设$ r=a mod b , c=gcd(a,b) $

        则$ a=xc , b=yc $, 其中x , y互质

        (r=a mod b=a-pb=xc-pyc=(x-py)c​)

        而(b=yc)

        可知:$y $与 $x-py $互质

    证明:

    ​   假设 (y) 与$ x-py $不互质

    ​   设 $y=nk , x-py=mk $, 且 $k>1 $(因为互质)

    ​    将 y 带入可得

    ​   (x-pnk=mk)

    ​   (x=(pn+m)k)

    ​    则$ a=xc=(pn+m)kc , b=yc=nkc$

    ​   那么此时 (a) 与$ b $的最大公约数为 $kc $不为 (k)

    ​   与原命题矛盾,则 (y) 与$ x-py $互质

        因为 (y)(x-py) 互质,所以 (r)(b) 的最大公约数为 (c)

        即 (gcd(b,r)=c=gcd(a,b))

        得证

      当(a mod b=0)时,(gcd(a,b)=b)

      这样我们可以写成递归形式

    实现:

    int gcd(int a,int b){
        return b?gcd(b,a%b):a;
    }
    

    扩展欧几里得

    引理:存在 (x , y) 使得(gcd(a,b)=ax+by)

    证明:

    (b=0) 时,(gcd(a,b)=a,此时 x=1 , y=0)
    (b eq 0) 时,设

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

    (ecause a mod b = a-a/b*b)

    ( herefore ax+by=b{x}'+(a-a/b*b){y}')

    ( herefore ax+by=b{x}'+a{y}'-b*a/b*{y}')

    ( herefore ax+by=a{y}'+b{x}'-b*a/b*{y}')

    ( herefore ax+by=a{y}'+b({x}'-a/b*{y}')​)

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

    (b=0) 时存在 x , y 为最后一组解

    实现:

    递归进入下一层,当$ b=0 (时就返回)x=1,y=0$

    再根据(x={y}' , y={x}'-a/b*{y}')得出当前所在层的解

    回到第一层的时候得到答案。

    void exgcd(int a,int b,int &x,int &y){
        if(!b){x=1,y=0;return a;}
        int r=exgcd(b,a%b,x,y),t=x;x=y;y=t-a/b*y;
        return r;
    }
    
  • 相关阅读:
    案例5-1.3 整型关键字的散列映射 (25分)--散列表(除留余数法+线性探测法)
    基础实验5-2.2 电话聊天狂人 (25分)-散列表
    习题8.4 畅通工程之最低成本建设问题 (30分)--最小生成树
    练习4.2 平衡二叉树的根 (25分)
    案例7-1.5 与零交换 (25分)--dfs
    习题2.8 输出全排列 (20分)--dfs
    nginx 日志切割
    mysql添加索引
    mysql常见错误码及说明
    MYSQL数据类型分类
  • 原文地址:https://www.cnblogs.com/mimiorz/p/10297921.html
Copyright © 2011-2022 走看看