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


    注意:欧几里得算法和扩展欧几里得算法是解决不同问题的两种,其中扩展欧几里得算法需要用到欧几里得算法

    update in 2018.8.22:补充欧几里得算法及其相关证明

    欧几里得算法

    欧几里得算法是用来求$(a, b)$的最大公约数

    若$d mid a$且$d mid b$,则称$d$为$(a, b)$的公约数

    在$(a, b)$的公约数中,最大的$d$成为$(a, b)$的最大公约数

    设$gcd(a, b)$表示$(a, b)$的最大公约数

    性质1:$gcd(a, b) = gcd(a - b, b)$

    证明:

    不妨设$a > b$,$d = gcd(a, b)$

    那么$a = dx$,$b = dy$。其中$x > y$

    那么$a - b = d(x - y)$

    即$gcd(a, b ) = gcd(dx, dy) = gcd(d(x - y), dy) = d = gcd(a - b, b)$

    性质2:$gcd(a , b) = gcd(a \% b, b)$

    证明:由性质1及模运算的性质不难得到


    这样直接递归计算即可,每次递归都有一个数减小一半

    因此复杂度为$log(a + b)$

    扩展欧几里得算法

    用途

    当我们已知$a,b$

    扩展欧几里得算法可以求出满足$a*x+b*y=gcd(a,b)$的$(x,y)$解集

    $gcd(a,b)$表示$a,b$的最大公约数

    前导知识

    上面有证明。

    $gcd(a,b)=gcd(b,a\%b)$

    $gcd(a,0)=0$

    $a\%b=a-a/b*b$

    推导过程

    其实扩展欧几里得的推导过程挺自然的

    $a*x+b*y$

    $=gcd(a,b)$

    $=gcd(b,a\%b)$

    $=b*x+(a\%b)*y$

    $=b*x+(a-a/b*b)*y$

    $=b*x+a*y-a/b*b*y$

    $=a*y+b*x-a/b*b*y$

    $=a*y+(x-y*a/b)*b$

    这样不断的递归下去

    当$b=0$时

    $x=1,y=0$

    代码

    注意:

    我们在求$(x-y*a/b)$的时候需要用到上一层的$x$

    但此时上一层$x$已经被赋值成了$y$

    所以我们需要开一个中间变量来记录上一层的$x$

    int 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);
        int tmp = x; x = y, y = tmp - a / b * y;
        return r;
    }

    应用

    1

    扩展欧几里得最重要的应用就是求形如$a*x+b*y=c$的解

    那么如何求呢?

    首先,这个方程能够能力的条件是$c\%gcd(a,b)=0$,这个应该比较显然

    根据前面将的扩展欧几里得算法

    我们可以先求出$a*x_0+b*y_0=gcd(a,b)$的解$x_0,y_0$

    然后方程两边同时除以$gcd(a,b)$

    就得到$a*x_0/gcd(a,b)+b*y_0/gcd(a,b)=1$的解

    再在方程两边同乘$c$

    就得到了方程

    $a*x_0/gcd(a,b)*c+b*y_0/gcd(a,b)*c=c$

    是不是很简单?

    2

    若$gcd(a,b)=1$,且$x0,y0$为$a*x+b*y=c$的一组解,则该方程的任一一解可以表示为

    $x=x_0+b*t,y=y_0-a*t$

    证明:

    $a*x+b*y$

    $=a*(x_0+b*t)+b*(y_0-a*t)$

    $=a*x_0+a*b*t+b*y_0-a*b*t$

    $=a*x_0+b*y_0$

    例题

    洛谷P1516 青蛙的约会

    根据题目要求列出等式,化简即可

    题解

    洛谷P2421 [NOI2002]荒岛野人

    题解

  • 相关阅读:
    【好文翻译】10个免费的压力测试工具(Web)
    【高手介绍】谷歌内部代码审查(code review)介绍[翻译]
    【淘宝内部好文转发】我们每天面对的互联网用户到底在想什么?
    写给开发者:别让他人用你的App赚钱[转]
    新手应该知道的二十三条关于JavaScript的最佳实践
    开发人员应该为这样的代码感到惭愧
    [Web App]必胜客宅急送产品设计思路介绍[转]
    WallsEveryDay 必应桌面壁纸
    GroupLayout 布局
    JButton 做图片框
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7860554.html
Copyright © 2020-2023  润新知