快速乘與快速冪總結

2021-10-02 11:54:25 字數 1136 閱讀 5919

快速乘:(a*b)%p

while

(b)//把b看成二進位制

a=(a*2

)%p;

//(2)式 要採用遞推+取模的方法得到

b=b>>1;

//右移一位

}printf

("%lld"

,ans)

;

推導過程:

(a*2^k1+a*2^k2+a*2^k3+...+a*2^kn)%p=((a*2^k1+a*2^k2+a*2^k3+...+a*2^kn-1)%p+a*2^kn%p)%p,等號左邊為前n項的結果,等號右邊含%p的第一項為前n-1項的結果,含%p的第二項可看成遞推關係,由此可得到(1)式,ans用於儲存計算結果,a為(2)式,除此之外還可注意到最後結果即ans,不用再取模。

快速冪:(a^b)%p

while

(b)//把b看成二進位制,根據b的每一位看乘不乘當前a

a=a*a%p;

//(2)式 更新a

b=b>>1;

//b向前移位

}printf

("%lld"

,ans)

;

推導過程:

a^(2^k1+2^k2+2^k3+2^k4+...+2^kn)%p=((a^2^k1)*(a^2^k2)*(a^2^k3)*(a^2^k4)*...*(a^2^k(n-1))*(a^2^kn))%p=(((a^2^k1)*(a^2^k2)*(a^2^k3)*(a^2^k4)*...*(a^2^k(n-1)))%p* ((a^2^kn)%p))%p,第二個等號左邊為前n項的結果,第二個等號右邊含%p的第一項為前n-1項的結果,含%p的第二項可看成遞推關係,由此可得到(1)式,ans用於儲存計算結果,a為(2)式,除此之外還可注意到最後結果即ans,不用再取模。對於a=(a^2^kn)%p,可看成從第1項遞推到第n項的結果,根據二進位制的權值可知,後一項等於前一項乘以a^2,即a*a,令an=(a^2^kn)%p,則可推出an=a(n-1)*a*a%p

快速冪 與 快速乘

快速冪 傳統求a b非常的耗時間,那麼有沒有一種更快的方法去求這個呢 下面介紹一次快速冪 以求a的b次方來介紹 把b轉換成二進位制數 以a 11為例 b的二進位制數為1011,二進位制從右向左算,但乘出來的順序是 a 20 a 21 a 23 是從左向右的。我們不斷的讓base base目的是累乘,...

快速冪與快速乘

題目描述 求 a 的 b 次方對 p 取模的值,其中 0 a,b 10 9 0輸入 三個用空格隔開的整數a,b和p。輸出 乙個整數,表示a b mod p的值。樣例輸入 2 3 9 樣例輸出8思路 普通求冪時間複雜度為o b 會tle 設b的二進位制表示有k位,ci為0或1,則 b sum limi...

快速冪 快速乘

直接求解,需要迴圈b次。思路 將b轉化為二進位制。對應為1的次數的冪保留,只需要將保留的冪的結果進行乘積就是a b。class solution def fast self,a,b b bin b 2 res 1for i in b 1 if i 1 res res a a a return res...