辗转相除法证明及复杂度计算

辗转相除法是计算两个数最大公约数(Greatest conmmon divisor)的一种对数复杂度算法。

问题:有两个正整数 x , y ,求 gcd(x,y):

算法证明:

设 x > y ,  且 x = r + y * c , 其中 r  >= 0, c >= 0 ;    

1. if r = 0  then gcd( x,y) == y 为结束条件)

2. if c = 0  then 算法没有前进

3. if r > 0 && c >0 then r = x - c * y , 

易知 : 如果d 为 x, y的公约数, 则必为r = x - c*y 的公约数 ,即 x,y 的公约数必为 y, r 的公约数;

如果e 为 r和y的公约数, 有 r / e = x / e - c * y / e, r / e , c*y/e 为正整数, x / e 也为正整数,即y, r的公约数必为x,y的公约数;

综上,x,y的最大公约数等价于y, r的最大公约数由此易得递归算法:

int gcd ( int x, int y )
{
	if( x < y )
		swap( x, y );
	int r =  x % y;
	if( r == 0 )
		return y;
	else
		return gcd( y , r  );
}
int main()
{
	cout<< gcd( 9, 15 );
}

算法复杂度:设 x > y ,  且 x = r + y * c , 其中 r = x % y , c > 0 ;

        得:x > r *( c+1 ) >  2 * r ;   

        即: 经过两次迭代, x至少缩小一倍,算法复杂度为 2*log2(N);



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值