快速GCD算法

遇到GCD(最大公约数)问题的同学可能回想到以下这个算法,这种方法理解起来没有太大的难度,并且原理为大家所熟知的辗转相除法,算法的C++实现如下:

 

int GCD(int a, int b)
{
	if(!a || !b)
		return max(a, b);
	else 
	{
		for(int t; t = a % b; x = y, y = t);
		return t;
	}
}


但是 数量级相当大(千位级别的运算)的时候似乎上面的算法执行效率并不是想象中那么快速,所以有了如下的快速GCD算法,其原理是:更相减损法,当传入的参数a和b均为偶数时,我们吧a和b全部右移(>>),然后在结尾乘2(<<),如果一个奇数,一个偶数的话我们很容易想到,2肯定不会是这两个数的公约数,所以我们把偶数右移两位(>>), 如果两个数都是奇数的话,我们就令他们进行相减,然后再把a和b取最小的传入,就会出现一奇一偶的两个数即可进行下一步的运算; 算法C++实现如下:

 

 

 

 

int qGCD(int a, int b)
{
	if(a == 0) return b;
	if(b == 0) return a;
	if(!(a & 1) && !(b & 1)) // a % 2 == 0 && b % 2 == 0;
		return qGCD(a >> 1, b >> 1) << 1;
	else if(!(b & 1))
		return qGCD(a, b >> 1);
	else if(!(a & 1))
		return qGCD(a >> 1, b);
	else
		return qGCD(abs(a - b), min(a, b));
}

 

 

 

 

 

你可能感兴趣的:(数论基础)