二进制GCD

写在前面

全程抄书

想要进一步提高求 \(\gcd\) 的效率,可以通过不断去除因子 \(2\) 来降低常数,这就是“二进制 \(\gcd\)

具体实现:

\(x = y\) ,则 \(\gcd(x, y) = x\) 否则:

  • \(x, y\) 均为偶数,则 \(\gcd(x, y) = 2 * \gcd(x / 2, y / 2)\)

  • \(x\) 为偶数, \(y\) 为奇数, 则 \(\gcd(x, y) = \gcd(x / 2, y)\)

  • \(x\) 为奇数, \(y\) 为偶数, 则 \(\gcd(x, y) = \gcd(x, y / 2)\)

  • \(x, y\) 均为奇数,则 \(\gcd(x, y) = \gcd(x - y, y)\)

Code

int Gcd(int x, int y){//二进制GCD 
	int i = 0, j = 0;
	if(x == 0) return y;
	if(y == 0) return x;
	while((x & 1) == 0) x >>= 1, ++i;
	while((y & 1) == 0) y >>= 1, ++j;
	if(j < i) i = j;
	while(1){
		if(x < y) x ^= y, y ^= x, x ^= y;
		if(0 == (x -= y)) return y <<= i;
		while(0 == (x & 1)) x >>= 1; 
	}
}
posted @ 2020-12-26 17:47  Suzt_ilymtics  阅读(132)  评论(0编辑  收藏  举报