求解两个正整数的最大公约数(Greatest Common Devisor),可以采用循环进行遍历,不过效率很低。所以引入欧几里得算法(Euclid’s algorithm)。
欧几里得算法基于GCD递归引理:
对任意非负整数a和任意正整数b,
gcd(a, b) = gcd(b, a mod b)
可以直接写出递归程序:
int GCD(int a, int b)
{
if(0 == b)
return a;
else
return GCD(b, a % b);
}
- 复杂度分析
运行时间与递归调用的次数成正比。
时间复杂度 ,最坏情况下计算次数 。
证明:欧几里得算法
- 扩展欧几里得算法
可以计算出满足下式的三元组 :
int Euclid_extend(int a, int b, int* x, int* y)
{
if(0 == b)
{
*x = 1;
*y = 0;
return a;
}
else
{
int r = Euclid_extend(b,a%b,x,y);
int temp = *x;
*x = *y;
*y = temp - (*y)*(a/b);
return r;
}
}
简单证明:
是递归基,易得一组解
;
时:
首先递归求解:
我们知道:
将(2)(3)式带入(1):
所以,令 、 ,就可以满足 。