【问题标题】:time complexity of below gcd algorithm以下gcd算法的时间复杂度
【发布时间】:2013-08-27 18:15:31
【问题描述】:

我一直发现很难计算二进制 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

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

【问题讨论】:

  • 它是 O(n),因为在最坏的情况下,您将每个数字除以所有小于 n 的除数

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


【解决方案1】:

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

【讨论】:

  • 但是在那种情况下,它不应该像 O(log n) 那样进行减法
  • 但是n=log(max(u,v)),而不是n=max(u,v)。我们不应该期望log n 出现在任何地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多