GCD - Euclid算法和分解算法分析

时间:2013-02-13 06:02:52

标签: algorithm complexity-theory big-o analysis

当我准备介绍算法类期中考试时,我会通过教授发布的一些先前的测试,我发现了这个问题:

计算gcd(312,455)两种方法:通过查找每个数的分解,并使用Euclid的算法。每种方法的复杂性是什么?

他的回答是:

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)

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

2 个答案:

答案 0 :(得分:1)

要分析欧几里德GCD,你必须选择最坏的情况值:我个人发现斐波纳契对最适合这个问题。 E.g。

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

看看这个“序列”:

enter image description here

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

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

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

当然,最坏情况下的运行时间会使用小Oh表示法,因为最好的情况会使用Omega(1),换句话说就是恒定时间,例如,当红利为1000且除数为2时。 / p>

由于我们有一个递减因子,我们可以将递归关系放在如下:

enter image description here

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

答案 1 :(得分:0)

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

  • 欧几里德算法:对于a >= b我们gcd(a,b) = gcd(b, a mod b) min(b, a mod b) < a/2,所以在最多两个简化步骤后,我们至少将第一个操作数减少{{1} }}。因此,减少步骤的数量受1/2的基数a的对数限制,对于某个常数sqrt(2)c * log(a)

  • 分解:为了测试数字的素数或分解素数的平方,只需检查因子直到数字平方根。如果给定的数字具有较小的因子,那么我们需要更少的可除性测试。因此,所需分区的数量很容易受c约束。由于sqrt(a)+sqrt(b)ld(a)因素最多可以a,因此获得gcd的剩余比较和乘法也受ld(a) < sqrt(a)约束。