快速冪與大數乘積取模

2021-09-27 17:29:06 字數 1088 閱讀 6395

計算a^n%p的值,怎麼算呢?直接算當然可能溢位。我們有一條引理:(a*b)%p=((a%p)*(b%p))%p.在這個引理上進行指數上的合併從而得到快速冪演算法。

具體地,有兩種思路,一種是減小a值,以防溢位,一種是減小b值,加快計算。

怎麼減小a值?a=a%p,就把a的值降到了p以下。對b呢,我們發現,( a%p)*(a%p)=(a^2)%p,如果a^n次方n為偶數,a^(2m)%p = ((a^2)^m)%p,如果n為奇數,就先單獨乘乙個a,剩下的又是偶數了,這樣n為偶數時就可以把n減小一半,從而降低了b的規模。

計算(a*b)%p怎麼辦?((a%p)*(b%p))%p還是會溢位。

下面用到一種思想,神奇與上面的快速冪有異曲同工之妙,把b看成二進位制表示。

舉個栗子:4*13%p,看成是4*1101(2)%p,其實表示的是4*(1*2^3+1*2^2+0*2^1+1*2^0)%p,那麼我們在計算的時候就把b看成二進位制,如果二進位制最後一位是1,就說明這一位應該乘a取餘,為零說明這一位不用乘a,從低位開始不斷將b的二進位制式右移,同時將a乘以2,等同於把基數平方,原因見上式。

1 #include 2

using

namespace

std;

3long

long q_mod(long

long a,long

long n,long

longp)4

14 a = (a*a)%p;//

合併a降n的規模

15 n /= 2;16

}17return

sum;18}

19long

long q_mul(long

long a,long

long b,long

long

p)20

28 (a <<= 1)%=p;//

不斷把a乘2相當於提高位數

29 b >>= 1;//

把b右移30}

31return

sum;

32 }

可以發現兩者非常的相似,差別在於結果變數的初值和計算中加號和乘號的區別。

快速冪 大數取模

首先要知道取餘的公式 a b p a p b p p。那麼冪不就是乘機的累積嗎,由此給出 int fast int a,int b,int p return int t p 順便把大數取模也給出吧,它的原理就是這個取餘公式 a b p a p b p p 那麼大數可以看做每一位的那位數字乘以自身的權...

快速冪與快速冪取模

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