1. 程式人生 > >快速冪運算詳解

快速冪運算詳解

 快速冪運算

對於一個求很大冪運算的模來講,對於取模來說  (a*b)%c=(a%c)*(b%c)%c直接用下列
# include<stdio.h>
# include<time.h>
int main(){
	int a=2,sum=1;
	double end;
	for(int i=0;i<100000000;i++)
	sum=sum*a%10086;
	printf("%d\n",sum);
	end=(double) clock();
	printf("%lf ms\n",end);     //計算執行的時間
	return 0;
} 

如果不知道clock()函式,請點選這裡

結果如下:

5782
67101.000000 ms 

67101 ms也就是 67s 一分多鐘(我等了好長時間哭才有的結果)

我們嘗試一下快速冪運算

# include<stdio.h>
# include<time.h>
int Quick(int a,long long b)
{   int ans=1;
    a=a%10086;	
	while(b)
	{ 
		if(b&1) ans=(ans*a)%10086; //如果b的二進位制位不是0即b是奇數,那麼我們的結果是要參與運算的
			a=(a*a)%10086;    //不斷的加倍
			b>>=1;  //二進位制的移位操作,相當於每次除以2,用二進位制看,就是我們不斷的遍歷b的二進位制位
	}	 
	return ans;
}
int main(){
	int a=2,sum=1;
    double end;
    sum=Quick(a,10000000000);
	printf("%d\n",sum);
	end=(double) clock();
	printf("%lf ms\n",end);
	return 0;
}

結果如下:

5782
0.000000 ms 

看看時間是快了很多;

普通的冪的運算 就是 a*a*a*a......

快速冪運算就是 a*a^2*a^4*a^8...

現在,我們的快速冪運算已經講完了我們來大致的推演一下快速冪取模演算法的時間複雜度首先,我們會觀察到,我們每次都是將b的規模縮小了2倍那麼很顯然,原本的普通的時間複雜度是O(n)快速冪的時間複雜度就是O(logn),在資料量越大的時候,者中優化效果越明顯