快速冪與快速冪取模

2021-09-20 21:11:31 字數 1127 閱讀 1029

對大數時間複雜度的優化,具體操作是利用二進位制操作

11的二進位制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我們將a¹¹轉化為算 a(20)*a(21)*a(23) ,看出來快的多了吧原來算11次,現在算三次

& 運算還可以判斷奇偶x&1== 0為偶,x&1== 1為奇

int ksm ( int a, int b)

return ans;

}

以b==11為例,b=>1011,二進位制從右向左算,但乘出來的順序是 a(20) * a(21) * a(23),是從左向右的。我們不斷的讓base*=base目的即是累乘,以便隨時對ans做出貢獻。

typedef long long ll;

ll quick_pow(ll a, ll n)//a^n

return re;//如果需要取模 可對re和a取模

}

這一部分就跟數論關係很大了。取模也是數論問題中經常出現的。那麼對於冪來取模,如果我們直接用模運算實際上是速度很慢的(因為試除法)。所以我們不妨在求快速冪的時候新增一些內容,從而得到結果。這個演算法需要了解一下數論的乙個定理:

(ab) mod c = ((a mod c)(b mod c)) mod c

那麼根據上面的定理可以推導出另乙個定理:

(a^b) mod c = (a mod c)^b mod c

具體的證明這裡不再贅述,主要是看第二個定理,快速冪取模。我們可以在求快速冪的時候,通過對底數取模的方式,不斷縮小底數的規模。那麼我們在上面快速冪的基礎上,新增取模,就可以完成整個操作。

int pow_mod(int a,int b,int c)

return ans;

}

如果能理解上面的快速冪演算法,那麼這個也會比較好理解了。定理中,底數是要有一次取模運算的。這裡我們在給base賦值的時候就執行了一次。那麼對於後面的一次取模,我們實際上利用了分配率,即:

(ab) mod c = ((a mod c)(b mod c)) mod c

我們求冪的本質仍然是求積。所以每次我們對base或者ans進行運算的時候,都必須使用一次分配率,所以都要mod c。

快速冪與快速冪取模

快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log?n 與樸素的o n 相比效率有了極大的提高。而快速冪取模就是對冪運算後結果進行取模運算。在程式設計過程中可能會遇到要求乙個很大的數的模,為了得到乙個能計算更大範圍,速度更快的演算法,快速冪取模演算法應運而生。一.計算冪,計算a ...

快速冪與快速冪取模

正常的求冪就是一直累乘如下 include intmain 這種方法實現很簡單,但是有時候挺浪費時間,於是就有了快速冪。關於快速冪,用乙個簡單的例子說明比較容易理解。關於nm舉乙個實際,比如2 11。通常我們使用累乘法需要運算10次。211 2 2 2 2 2 2 2 2 2 2 2。而我們可以將1...

快速冪與快速冪取模

intmi int a,int b return num 這種暴力求法的時間複雜度是o n 為了降低時間複雜度,我們引用快速冪,它的時間複雜度縮短到o logn 我認為快速冪之所以快,主要是運用到了位運算。對於位運算,我們舉個例子 比如 2 13 13的二進位制為1101,那我們可以得到1 2 0 ...