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

原创 2016年08月30日 17:45:54

辗转相除法是计算两个数最大公约数(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);



辗转相除法 java 实现 及其时间复杂度证明

代码 public static void main(String[] args) { Random r = new Random(); for (int ii...

欧几里得算法(即辗转相除法)的时间复杂度

欧几里得算法(即辗转相除法)的时间复杂度 本文是参考新浪博客而写。 欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式 ...

为什么辗转除法求最大公因子的时间复杂度是O(nn)

首先我们要明确的是这里的n指的是输入数据所使用的二进制位数。比如我们现在常用用的32位或64位。 我在来看计算机是怎样做除法的。给定两个自然数m1, m2。我们假设m1>m2;这样我们有了一个代数...

多项式除法及求模的计算复杂度

void polynomial_division(int n, int m, long long *A, long long *B, long long *D, long long *R) { ...

每天一道编程题----------------辗转相除法求两个数的最大公约数及其证明

证明方法为转载:        设两数为a、b(a>b),b最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b...

欧几里得算法(辗转相除法)证明过程

今天在读Aditya Bhargava著的《算法图解》的时候,发现了第41页的农场主分地的题目需要一个知识——欧几里得算法,还真是第一次看到实际应用。然后就参照百度的证明学习一下如何证明欧几里得算法。...

辗转相除法证明

今天做面试题,又遇到了求两个数的最大公约数问题,

C++计算最大公约数(辗转相除法)

典型例题: 一.辗转相除法 例1 。求两个正数8251和6105的最大公因数。 (分析:辗转相除→余数为零→得到结果) 解:8251=6105×1+2146 显然8251与6105的最大公因...

C++计算最大公约数(辗转相除法)

典型例题: 一.辗转相除法 例1 。求两个正数8251和6105的最大公因数。 (分析:辗转相除→余数为零→得到结果) 解:8251=6105×1+2146 显然8251与6105的最大公因...

辗转相除法证明+最小公倍数证明+其他相关证明

辗转相除算法的简介   在数论中,辗转相除法(国际上一般称为Euclidean Algorithm 或 Euclid's Algorithm,即欧几里得算法)是一种求任意两个欧几里得环(Euclid...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:辗转相除法证明及复杂度计算
举报原因:
原因补充:

(最多只允许输入30个字)