zoukankan      html  css  js  c++  java
  • Eculid算法 以及Extend_Eculid算法 证明及实现

    Eculid算法  欧几里得算法

    证明:

    设两数a,b(a<b). 

    1. 令c=gcd(a,b) . 则 设a=mc, b=nc 。
    2. 所以 r= r =a-kb=mc-knc=(m-kn)c  。
    3. 所以 c也是r的因数 。
    4. 可以断定 m-kn 与 n 互质 。【假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾】,因此,c也是b与r的最大公约数。
    5. 得证。

    代码实现:

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

    Extend_Eculid  拓展欧几里得算法

    证明:

    设a>b

    当b=0时,a∗1+b∗0=a=gcd(a,b),此时x=1,y=0

    当b!=0时,设

    a∗x1+b∗y1=gcd(a,b) 

    b∗x2+a%b∗y2=gcd(b,a%b)

    由于gcd(a,b)=gcd(b,a%b),所以有a∗x1+b∗y1=b∗x2+a%b∗y2

    将a%b=a−(a/b)∗b代入,

    得到 a∗x1+b∗y1=a∗y2+b∗x2−(a/b)∗b∗y2

    即 x1=y2,y1=x2−(a/b)∗y2

    因此可以递归的定义exgcd,同样b=0时递归结束。返回最大公约数

    代码实现:

    void ext_gcd(int a, int b, int &d, int &x, int &y)
    {
        if(!b)
        {
            d = a;
            x = 1;
            y = 0;
        }
        else
        {
            ext_gcd(b, a%b, d, y, x);
            y -= x*(a/b);
        }
    }

     

  • 相关阅读:
    DDD领域驱动设计的理解
    设计原则
    毫秒级的时间处理图片
    同步设施
    ASP.NET Core 中文文档
    Jenkins快速搭建持续集成
    刮刮卡
    网页WEB打印控件
    nginx+memcached+ftp上传图片+iis
    通过Jexus 部署 dotnetcore
  • 原文地址:https://www.cnblogs.com/shawn-ji/p/5677097.html
Copyright © 2011-2022 走看看