zoukankan      html  css  js  c++  java
  • 欧几里得算法及扩展欧几里得算法简单解释

    欧几里得算法:

      解释:给定两个自然数,求出两个自然数的最大公约数。也叫——辗转相除法

      过程:1.给定两个自然数a、b

         2.a == 0 时 gcd(a,b)= b;b == 0 时 gcd(a,b) = a

         3.当a,b都大于0时有 gcd(a,b)= gcd(b,a%b),减小a,b继续计算

      证明:当a,b都大于0时,我们保证a大于b;并令a=kb+r

         当 r = 0时,最大公约数就是b

         当 r != 0时,首先r = a%b = a-kb,又令g = a与b的任意公约数

         a与kb都能整除g,所以r也能整除g,所以b与a%b的公约数等于g

         反过来也可以从b与a%b推出,a与b的公约数为g,这样b与a%b跟a与b的所有公约数是一样的

         得证

      代码:

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

    扩展欧几里得算法:

       解释:找到一对整数(x,y)使得ax+by=gcd(a,b)

       证明及过程:当a为0时,y为1,(b一样)

          当a、b都不为0时,因为gcd(a,b)=gcd(b,a%b)

          所以 ax+by = b*x1+a%b*y1

                = b*x1+(a-a/b*b)*y1

                = a*y1+b*(x1-a/b*y1)

          然后我们需要模拟欧几里得算法,交换x、y,并改变x

       代码:

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

       应用:模线性方程

         方程:ax ≡ c (mod b) -> 线性不等方程 ax+by = c(≡ 为前后mod b同余)

         解出ax+by=gcd(a,b)后a*(x*c/g)+b*(y*c/g)=c(g=gcd(a,b))

  • 相关阅读:
    MyEclipse 2015反编译插件安装
    RocketMQ事务消费和顺序消费详解
    Rocket重试机制,消息模式,刷盘方式
    前端js上传文件 到后端接收文件
    Junit进行单元测试
    json简单使用
    valgrind的使用--检测内存
    使用scrapy框架爬取自己的博文(3)
    使用scrapy框架爬取自己的博文
    Scrapy下xpath基本的使用方法
  • 原文地址:https://www.cnblogs.com/zhuanzhuruyi/p/6445728.html
Copyright © 2011-2022 走看看