Python 用欧几里德算法求两个数的GCD?

Python 用欧几里德算法求两个数的GCD?,python,Python,我试图用欧几里德算法计算两个数字的GCD。 我跟在后面 欧几里德算法说,我们需要不断地从较大的数字中减去较小的数字,直到两个数字变得相同。他们在这个资源中使用mod而不是减法 第一版 def gcd(a, b): if a == 0 : return b return gcd(b%a, a) 第二版 def gcd(a, b): if (b == 0): return a return gcd(b, (

我试图用欧几里德算法计算两个数字的GCD。 我跟在后面

欧几里德算法说,我们需要不断地从较大的数字中减去较小的数字,直到两个数字变得相同。他们在这个资源中使用mod而不是减法

  • 第一版

     def gcd(a, b):  
         if a == 0 : 
             return b  
         return gcd(b%a, a)
    
  • 第二版

     def gcd(a, b):
         if (b == 0):
             return a
         return gcd(b, (a % b))
    

  • 在这两个版本中,代码是不同的,但它给了我相同的结果。我不明白这是如何工作的。有人能解释一下吗?

    gcd的每个实现都是另一个的镜像

    在第二个示例中,如果变量
    a
    b
    被交换,您将得到第一个版本。因此,这些
    gcd
    实现是等效的。唯一改变的是
    a
    b
    的顺序

    这种算法称为。来自维基百科:

    在每一步k,欧几里德算法从两个数字rk-1和rk-2计算商qk和余数rk

    rk-2=qk rk-1+rk

    其中rk为非负且严格小于rk-1的绝对值。作为欧几里德除法定义基础的定理确保了这样一个商和余数总是存在并且是唯一的

    在欧几里得算法的原始版本中,商和余数是通过重复减法得到的;也就是说,从rk-2中反复减去rk-1,直到余数rk小于rk-1。在这之后,rk和rk-1被交换,过程被迭代。欧几里德除法将两次交换之间的所有步骤缩减为一个步骤,因此效率更高。此外,不需要商,因此可以用模运算代替欧几里德除法,模运算只给出余数。因此,欧几里德算法的迭代变得简单

    rk=rk-2模块rk-1

    另见

    gcd的每个实现都是另一个的镜像

    在第二个示例中,如果变量
    a
    b
    被交换,您将得到第一个版本。因此,这些
    gcd
    实现是等效的。唯一改变的是
    a
    b
    的顺序

    这种算法称为。来自维基百科:

    在每一步k,欧几里德算法从两个数字rk-1和rk-2计算商qk和余数rk

    rk-2=qk rk-1+rk

    其中rk为非负且严格小于rk-1的绝对值。作为欧几里德除法定义基础的定理确保了这样一个商和余数总是存在并且是唯一的

    在欧几里得算法的原始版本中,商和余数是通过重复减法得到的;也就是说,从rk-2中反复减去rk-1,直到余数rk小于rk-1。在这之后,rk和rk-1被交换,过程被迭代。欧几里德除法将两次交换之间的所有步骤缩减为一个步骤,因此效率更高。此外,不需要商,因此可以用模运算代替欧几里德除法,模运算只给出余数。因此,欧几里德算法的迭代变得简单

    rk=rk-2模块rk-1

    另见
    第一个函数和第二个函数完全相同。唯一的区别是参数
    a
    b
    被交换。由于欧几里德算法适用于任何顺序的输入,因此函数完全相同


    第一个函数和第二个函数完全相同。唯一的区别是参数
    a
    b
    被交换。由于欧几里德算法适用于任何顺序的输入,函数完全相同。

    谢谢。你能解释任何一个版本吗?@Gnanavel请参阅更新的答案,并解释欧几里德除法算法。谢谢。你能解释任何一个版本吗?@Gnanavel请参阅更新的答案,并解释欧几里德除法算法。欧几里德说,我们需要从较大的值中减去较小的值。但是如何解释呢mod有效吗?我真的不明白。我们是需要取大与小的mod,还是取小与大的mod。你能解释一下吗?@Gnanavel,例如,如果先将较大的数字传递给
    gcd1
    ,然后
    b%a
    将计算为b(较小的数字)因此,对
    gcd1
    的下一个递归调用将是
    gcd1(b,a)
    ,颠倒了参数的顺序,因此忽略了顺序。欧几里德说我们需要从大的中减去小的。但是mod是如何工作的?我真的不明白。我们是需要取大的mod加小的还是取小的mod加大的。你能解释一下吗?@Gnanavel,例如,较大的数字首先传递给
    gcd1
    ,然后
    b%a
    将计算为b(较小的数字),因此对
    gcd1
    的下一个递归调用将是
    gcd1(b,a)
    ,颠倒参数的顺序,因此忽略顺序。
    def gcd1(a, b):  
        if a == 0 : 
            return b  
        return gcd(b%a, a)
    
    def gcd2(a, b):
        if (b == 0):
            return a
        return gcd(b, (a % b))