快速冪及快速冪取模演算法的分析與實現

2021-10-02 05:28:07 字數 1278 閱讀 7208

快速冪的思想

列如2^10

我們將其10化為二進位制為(1010)

那麼我們可以得到

10=0* 2^0+ 1*2^1+ 0 * 2^2+ 1 2^3;

所以得到2^10 = 2^( 0 * 2^0+ 1 *2^1+ 0 * 2^2+ 1 *2^3)

最後得到 2^ (2^1) * 2^( 2^3);

在了解快速冪之前,我們還應該先了解一下位運算的倆個符號

1.按位與

c語言中符號為&

是什麼意思呢?舉了例子例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。

相同位的兩個數字都為1,則為1;若有乙個不為1,則為0。

00101

11100

結果為00100

意思就是相同的取相同,不相同的取一;

2.左移

符號為》,類似於數學裡面的遠大於;

列如1011100>>2

結果為10111

後面的數字就是移動的位數;

接下來就可以上**了

int

pow(

int a,

int b)

return ans;

}

其中難懂點的的地方詳細解說一下

if

(b&1

) ans=ans*base;

base=base*base;

b>>=1;

}

這裡說的是 如果b的末位為1,就執行一次 ans=ans*base;

在這裡b已經是二進位制數了;無論末尾數是0還是1;我們都要進行一次累乘;

執行後左移一位;

while(b)直到b為零;

在弄懂快速冪之後,快速冪取模也就簡單起來;

其思想是

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

這裡不再具體證明。

有了思想後,就可以上**了

int

pow(

int a,

int b,

int c)

return ans;

}

在快速冪**後面加上乙個取模就完事了;

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

希望能有所幫助。

快速冪 快速冪取模演算法

在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...

快速冪與快速冪取模

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

快速冪與快速冪取模

對大數時間複雜度的優化,具體操作是利用二進位制操作 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 ...