Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在gcd算法中无法理解_Python - Fatal编程技术网

Python 在gcd算法中无法理解

Python 在gcd算法中无法理解,python,Python,帮助我们理解这个算法中的一点 为什么b>a在第一次通过a和b时交换位置:(800225) 为什么操作a%b失败 def gcd(a,b): 如果b==0: 归还 其他: 返回gcd(b,a%b) 印刷品(gcd(225800)) 如果b大于a,那么a%b就是a,因为a%b是整数除法余数(模),而a/b是零。我建议您简单地尝试一下:gcd算法的整个思想是用最小的数替换最大的数,用模替换最小的数,如您的示例所示: GCD(225800): 最小的是225 模为'800-3*225',等于125 So

帮助我们理解这个算法中的一点

为什么
b>a
在第一次通过
a
b
时交换位置:
(800225)

为什么操作
a%b
失败

def gcd(a,b): 如果b==0: 归还 其他: 返回gcd(b,a%b) 印刷品(gcd(225800))
如果b大于a,那么
a%b
就是a,因为
a%b
是整数除法余数(模),而a/b是零。

我建议您简单地尝试一下:gcd算法的整个思想是用最小的数替换最大的数,用模替换最小的数,如您的示例所示:

GCD(225800):

最小的是225
模为'800-3*225',等于125

So:GCD(225800)=GCD(125225)

从现在开始,你可以继续到最后(模为零)

如果您不检查哪一个是最大的,哪一个是最小的,您将得到:

GCD(225800):

模数是225,因为225=0*800+225,所以:

GCD(225800)=GCD(225800)


你被卡住了

不确定这是否回答了问题,但如果你问为什么值交换位置,你需要了解欧几里德算法

我们为什么要交换? 下面是我被解释的一种方式:

假设您有两个数字
a
b
,并且您想要找到GCD。根据定义,GCD是
a
b
除后不带余数的最大数。现在,让我们看看这是如何推理的:

我们可以把a和b之间的关系写成

a = b * c0 + r0
在上面的示例中,
c0
r0
是一些整数,
r0
是余数(即
r0=a%b

我们还可以用类似的方式重写
b
r0

b = r0 * c1 + r1
请注意,
b
取代了
a
r0
取代了
b
。这正是交换步骤。重复此过程,直到
rX
变为0(即不存在余数)

假设正确吗? 欧几里德定律的正确性来自这样一个假设:

GCD(a, b) = GCD(b, r)
其中
a=b*c+r
。这就是证据:

  • k
    a
    b
    的任何公约数(不一定是最大的)。在这种情况下,
    a=c1*k
    b=c2*k
    ,其中
    c1
    c2
    是整数
  • 在这种情况下,
    k
    也是
    b
    r
    的公约数,因为
    b
    除以
    k
    ,如(1)和
    r=a-b*c=(c1-c2*c)*k
    (这只是重新排列了(1)、(2)和原始语句)
  • (2)的对立面也是正确的(证明类似于(2)):任何
    b
    r
    的公约数也是
    a
    b
    的公约数
  • 这意味着元组
    (a,b)
    (b,r)
    的所有公约数都重叠。换句话说,元组
    (a,b)
    没有不是
    (b,r)
    的公约数的公约数,反之亦然
  • 特别是,两个元组的最大公约数必须相同,因为如果假设
    GCD(a,b)>GCD(b,r)
    GCD(a,b)
    将导致前面一个语句中的矛盾。因此,
    GCD(a,b)
    必须等于
    GCD(b,r)
    =>
    GCD(a,b)=GCD(b,a%b)

  • 查找
    a%b
    的功能。想想当b>a时,该操作的结果会是什么。当您将其作为第二个参数发送到递归时会发生什么?为什么说
    a%b
    失败?当
    0时