gcd算法的时间复杂度

时间:2013-08-27 18:15:31

标签: algorithm time-complexity greatest-common-divisor

我发现很难计算二进制GCD算法的时间复杂度,也就是所谓的Stein算法,它被赋予O(n ^ 2),其中n是较大的位数。这两个数字。 不应该是O(n)吗? 算法如下:

1.gcd(0,v)= v,因为所有内容都为零,而v是除以v的最大数。同样,gcd(u,0)= u。通常不定义gcd(0,0),但设置gcd(0,0)= 0很方便。

2.如果你和你都是偶数,那么gcd(u,v)= 2·gcd(u / 2,v / 2),因为2是一个公约数。

3.如果你是偶数而v是奇数,则gcd(u,v)= gcd(u / 2,v),因为2不是公约数。同样,如果你是奇数而v是偶数,则gcd(u,v)= gcd(u,v / 2)。

4.如果u和v都是奇数,并且u≥v,则gcd(u,v)= gcd((u - v)/ 2,v)。如果两者都是奇数而且u < v,然后gcd(u,v)= gcd((v - u)/ 2,u)。这些是简单欧几里德算法的一步的组合,其在每个步骤使用减法,以及上述步骤3的应用。除以2得到一个整数,因为两个奇数的差是偶数。[3]

5.重复步骤2-4直到u = v,或(再多一步)直到u = 0.在任何一种情况下,GCD都是2kv,其中k是步骤2中找到的2的公因子数。

1 个答案:

答案 0 :(得分:1)

Knuth volume 2有一个非常复杂的分析,这似乎证实了明显的猜测,即输入位数的步骤数是最坏的线性。然而,对于非常大的n,每个减法需要自己收取O(n)(例如由于多精度算术),在这种情况下总票据是O(n ^ 2)