【问题标题】:GCD - Euclid's algorithm and Factorization Algorithm AnalysisGCD - 欧几里得算法和分解算法分析
【发布时间】:2014-03-02 04:35:03
【问题描述】:

当我准备介绍算法课的期中考试时,我正在检查教授之前发布的一些测试,我发现了这个问题:

计算 gcd(312,455) 有两种方法:求每个数的因式分解,以及使用欧几里得算法。每种方法的复杂性是多少?

他的回答是:

gcd(455,312) = gcd(312,143) = gcd(143,26) = gcd(26,13) = gcd(13,0) = 13

factors(312)= {2, 3, 13} factors(455)= {5, 7, 13}

复杂性:

  • gcd - log(n)
  • 因素-sqrt(n)

他是如何解决复杂问题的?

【问题讨论】:

  • 你达到了什么样的复杂性,以及如何达到的?
  • 我不认为整数分解的难度与输入的平方成比例,因此您可能需要解释“复杂性”的含义

标签: algorithm complexity-theory big-o analysis


【解决方案1】:

要分析欧几里得 GCD,您必须选择最坏情况的值:我个人发现斐波那契对最适合这个问题。例如

EGCD(121393, 75025) = 1; // With 24 iterations (or recursive calls).

看看这个“序列”:

对于斐波那契对,我们注意到:

121393 % 75025 == 121393 - 75025 == 46368.

因此,有121393 / 46368 = **2.61** (more or less);的递减因子

当然,最坏情况下的运行时间会使用 Small Oh Notation,因为最好情况下会使用 Omega(1),换句话说,当被除数为 1000,除数为 2 时,会使用恒定时间。

由于我们有一个递减因子,我们可以把递推关系写成如下:

您必须知道,此运行时间与 EGCD 算法的迭代版本完全相同。

【讨论】:

    【解决方案2】:

    给定的复杂性是所需算术运算数量的粗略最坏情况界限:

      1234563因此,减少步骤的数量受a 的对数约束,基数为sqrt(2),即c * log(a),对于某些常数c
    • 因式分解:为了测试一个数的素数或分解一个素数的平方,只需检查直到数平方根的因数。如果给定数字的因子更小,那么我们需要更少的可分性测试。因此,所需的分割数很容易受到sqrt(a)+sqrt(b) 的约束。由于ald(a) < sqrt(a) 最多可以有ld(a) 因子,因此获得gcd 的剩余比较和乘法也受sqrt(a) 的约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2020-12-05
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多