在本文中,我们将讨论欧氏算法的时间复杂度O(log(min(a,b))并实现。
Euclid算法:这是一种找到两个整数的GCD(最大公约数)的有效方法。该算法的时间复杂度为O(log(min(a,b)) 。递归地可以表示为:
gcd(a, b) = gcd(b, a%b),
where, a and b are two integers.
证明:假设a和b是两个整数,则根据Euclid算法,a> b:
gcd(a, b) = gcd(b, a%b)
重复使用上述公式,直到到达b为0的步骤为止。在这一步,结果将是两个整数的GCD,它们等于a 。因此,在仔细观察之后,可以说该算法的时间复杂度与将b减小为0所需的步骤数成正比。
假设使用此算法将b减小为0所需的步骤数为N。
gcd(a, b) ------> N steps
现在,如果两个数字a和b的欧几里得算法以N步递减,则a至少应为f (N + 2) , b至少应为f (N +1) 。
gcd(a, b) ——> M steps
Then, a >= f(N + 2) and b >= f(N + 1)
where, fN is the Nth term in the Fibonacci series(0, 1, 1, 2, 3, …) and N >= 0.
为了使用数学归纳法则(PMI)来证明上述说法:
- 基本情况:
- 假设a = 2和b = 1 。然后,GCD(2,1)将减少GCD(1,0)在步骤1,即,N = 1。
- 这意味着2应该至少为f 3,而1应该至少为f 2,并且f 3 = 2和f 2 = 1 。
- 这意味着, a至少为f (N + 2) , b至少为f (N +1) 。
- 可以得出结论,该陈述适用于基本案例。
gcd(b, a%b) ——> (N – 1) steps
Then,
b >= f(N – 1 + 2) i.e., b >= f(N + 1)
a%b >= f(N – 1 + 1) i.e., a%b >= fN
- 它也可以写成:
a = floor(a/b)*b + a%b
- 现在,(a / b)始终大于1。因此,从以上结果可以得出结论:
a >= b + (a%b)
This implies, a >= f(N + 1) + fN
- 众所周知,每个数字都是斐波那契数列中前面两个项的和。这意味着f (N + 2) = f (N +1) + f N。
a >= f(N + 2) and b >= f(N + 1)
- 由于以上陈述对于归纳步骤也适用。这证明该陈述是正确的。
- 在继续之前,请看一下Binet公式:
Binet公式:
fN = {((1 + √5)/2)N – ((1 – √5)/2)N}/√5
or
fN = ∅N
- 其中, ∅被称为黄金分割率(∅≈1.618) ,f N是第N个斐波纳契数。
- 现在,已经说明时间复杂度将与N成正比,即将b减小为0所需的步骤数。
- 因此,为了证明时间复杂度,已知:
fN = ∅N
N ≈ log∅(fN)
现在,从以上陈述可以证明,使用数学归纳原理,可以说,如果两个数a和b的欧几里得算法以N步减少,则a至少应为f (N + 2)并且b至少应为f (N +1) 。
从以上两个结果可以得出结论:
=> fN ≈ min(a, b)
=> N ≈ log∅min(a, b)