辗转相除法的时间复杂度

本文介绍了一种使用辗转相除法计算两非负整数最大公约数(GCD)的算法,并给出了C语言实现。文章详细解释了算法原理及正确性,并分析了其时间复杂度为对数级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下程序是用辗转相除法来计算两个非负数之间的最大公约数:

long long gcd(long long x, long long y) {
    if (y == 0)
        return x;
    else
        return gcd(y, x % y);
}


 我们假设x,y中最大的那个数的长度为nx>y,基本运算时间复杂度为O(1),那么该程序的时间复杂度为( )

求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法.
问题定义为求ij的最大公约数gcd(i,j),其中ij是整数,不妨设i>j.
算法可以递归的表示:
1.如果j能整除i,那么gcd(i,j)=j;
2.j不能整除i,r=i%j,那么gcd(i,j)=gcd(j,r).
使用C语言实现:

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


关键是要证明步骤2.正确性分析:
算法的步骤1,显然成立(最大公约数定义).

dij的最大公约数,
那么i=md,j=nd,mn互质(否则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-knm也是互质的.
所以得到djr的最大公约数.

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

所以欧几里得算法求最大公约数的时间复杂度是对数量级的,速度非常快.

zz from http://guozi149.me/tech/foundations/math/212

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值