[算法] check divisibility

看到一个算法题:不使用除法运算符(/)和模运算(%)判断一个数是否被形如2^n-1的数整除。

代码如下:

 

int checkdiv(int n,int k)
{
// 返回 n%(2^k-1)的结果
// n>=0,k>=2
	if(n == 0)
		return 0;
	
	int m = (1<<k)-1;  // m=2^k-1
	while(n > m)
	{
		n = (n>>k) + (n&m);
	}
	
	if(m == n)
		return 0;
	else // m>n
		return n;
}

原理如下:

n可以表示为

n=(n>>k)*(1<<k)+(n&m)

因此只需证明((n>>k)*(2^k)) ≡ (n>>k) (mod (2^k-1)),显然这是成立的。