• 第二课 欧几里德算法与扩展欧几里德算法


    耐心的看下去终究会懂的。

    ♦ 我们规定gcd(a,0)=a

    ♦ 欧几里德算法中需要明确的是,gcd(a,b) = gcd(b,r)

    证明:设x=gcd(a,b),那么b能整除以x(即b/x没有余数,觉得"整除以"比"整除"更直观,下同)。

    ∵a=bq+r

    ∴r=a-bq

    ∴r能整除以x

    ∴x为b,r的公约数(没有证明是最大)

    假设y为gcd(b,r),所以x≤y(y是最大的约数!)

    显然,b能整除以y

    ∵a=bq+r

    ∴a能整除以y.

    ∴y是a,b的约数

    ∴y≤x

    ∴x=y=gcd(b,r)

    ∴gcd(a,b) = gcd(b,r)

    求两个数的最大公约数——辗转相除法(欧几里德算法)

     1 int gcd(int a, int b)
     2 {
     3     if(a < b) swap(a,b);    
     4     
     5     int r = a%b;    
     6     
     7     while (r)
     8     {
     9         a = b;
    10         b = r;
    11         r = a%b;
    12     }
    13 
    14     return b;
    15 }

    给定a,b,c,求满足ax+by=gcd(a,b)的整数解(x,y)——扩展欧几里德算法

     1 int extended_gcd(int a, int b, int &x, int &y)
     2 {
     3     if (a < b) swap(a,b);
     4     
     5     if (b == 0)
     6     {
     7         x = 1, y = 0;
     8         return a;
     9     }
    10     
    11     int p,q;
    12      
    13     int ans = gcd(b, a%b, p, q);
    14     
    15     x = q;
    16 
    17     y = p - a/b*q;
    18     
    19     return ans;
    20 }

    ♦ 假设给定a,b. 那么我们知道a,b的最大公约数必定可以表示成a,b的线性组合,ax+by=gcd(a,b),问题是x,y是多少呢? 

    证明:已知a%b=r,gcd(a,b)=ax+by(x,y未知)

    ∵gcd(a,b)=gcd(b,r)

    ∴gcd(b,r) = bp+rq = bp+(a%b)q = bp+(a-a/b*b)q = aq+b(p-a/b*q)

    即ax+by = gcd(a,b) = aq+b(p-a/b*q)

    解得x=q, y=p-a/b*q;

    ok,到这里为止,我们得到ax+by=gcd(a,b)的一组解, x和y。

    ♦ 那么不失一般性,给定a,b,c,ax+by=c的解又怎么求呢?

    思路:等式两边同时乘以gcd(a,b)/c

    假设ax+by=gcd(a,b)的解为x0,y0.则x=x0*c/gcd(a,b),y=y0*c/gcd(a,b) 

  • 相关阅读:
    ajax优缺点及用法
    通俗易懂:窗口函数 | 全是案例
    mysql基本数据类型
    Elasticsearch从入门到专家
    shell数组实和变量扩展实现keyvalue设计
    catboost学习笔记
    pacman总结
    常用archlinux软件索引
    Linux配置打印机
    记录一次实战GetShell
  • 原文地址:https://www.cnblogs.com/chenyg32/p/2977472.html
Copyright © 2020-2023  润新知