快速冪與快速冪取模

2021-10-02 05:28:07 字數 961 閱讀 3591

intmi(

int a,

int b)

return num;

}

這種暴力求法的時間複雜度是o(n),為了降低時間複雜度,我們引用快速冪,它的時間複雜度縮短到o(logn)。

我認為快速冪之所以快,主要是運用到了位運算。

對於位運算,我們舉個例子

比如:2^13

13的二進位制為1101,那我們可以得到1* 2^0+0 * 2 ^1+1* 2 ^2+1* 2 ^3=13

帶回去可得:2 ^(1* 2 ^0+0* 2 ^1+1* 2 ^2+1 * 2 ^3)

得出結果為2 ^(1*2 ^ 0)*2 ^(1 *2 ^ 2)*2 ^(1 *2 ^ 3);

由此我們可以總結出,對於冪,我們可以將其化為二進位制一位一位讀取,碰到0,則不做操作,碰到1我們就進行累乘;

用**表示

intmi(

int a,

int b)

return num;

}

我們進行實際的模擬

對於快速冪的模運算其實和快速冪大部分相同,就是在快速冪的同時進去取模,所以我們只要根據公式對原**進行加工便可得

模運算公式:(a*b) mod c = ((a mod c) * (b mod c)) mod c;

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

主要看第二個定理;

intmi(

int a,

int b,

int m)

return num;

}

因為我們對a ^ n進行二進位制拆分,所以這裡的模運算,其實是運用到了分配率的乙個用法。

快速冪與快速冪取模

快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 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 ...

快速冪與快速冪取模

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