展转相除求最大公约数

求最大公约数的最经常使用的算法是欧几里得算法,也称为展转相除法。问题定义为求i和j的最大公约数gcd(i,j),其中i和j是整数,不妨设i>j。
算法能够递归的表示:
1. 若是j能整除i,那么gcd(i,j)=j;算法

2. j不能整除i,令r=i%j,那么gcd(i,j)=gcd(j,r)。spa

C实现

int gcd(int i, int j)
{
    int r = i % j;
    return r == 0 ? j : gcd(j, r);
}

分析

算法的步骤1,显然成立(最大公约数定义);code

要证实步骤2:blog

设d是i和j的最大公约数,
那么i=md,j=nd,m和n互质(不然d不是最大公约数)。
由r=i%j能够获得i=kj+r,k=⌊m/n⌋,k≥1(咱们前面假设过i>j)。
把i=md,j=nd代入获得
md=knd+r
那么
r=(m-kn)d
m-kn和m也是互质的。
因此获得d是j和r的最大公约数。

时间复杂度分析:
逆着看该算法,最后的余数是0,倒数第二次余数是d,倒数第三次是kd,k>1…
因为组成了一个数列,{0,d,kd,nkd+d,…}
数列的n项加上n+1项,比n+2项要小,因此比斐波纳契数列增加的要快。
咱们已知斐波纳契数列增加速度是指数,那么待分析的数列也是指数增加。
设欧几里得算法须要k次,那么j=O(2^k),则k=O(lg j)。递归

因此欧几里得算法求最大公约数的时间复杂度是对数量级的,速度很是快。
相关文章
相关标签/搜索