1

我发现很难计算二进制 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.如果u和v都是偶数,那么gcd(u, v) = 2·gcd(u/2, v/2),因为2是公约数。

3.如果u是偶数,v是奇数,则gcd(u, v) = gcd(u/2, v),因为2不是公约数。类似地,如果 u 是奇数而 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 的公因数的数量。

4

1 回答 1

1

Knuth 第 2 卷有一个非常复杂的分析,这似乎证实了一个明显的猜测,即步数在最坏情况下与输入位数成线性关系。然而,对于非常大的 n,每个减法都需要单独计费为 O(n)(例如由于多精度算术),在这种情况下,总费用为 O(n^2)

于 2013-08-27T18:42:53.033 回答