求a的b次方 a的b次方對m取模

2021-06-19 03:53:25 字數 991 閱讀 5842

如計算2^13,則傳統做法需要進行12次乘法,但是可以優化:

把2*2的結果儲存起來看看,是不是成了:4*4*4*4*4*4*2 

再把4*4的結果儲存起來:16*16*16*2 

一共5次運算,分別是2*2、4*4和16*16*16*2 

這樣分析,我們演算法因該是只需要計算一半都不到的乘法了。 

為了講清這個演算法,再舉乙個例子2^7:2*2*2*2*2*2*2 

兩兩分開:(2*2)*(2*2)*(2*2)*2 

如果用2*2來計算,那麼指數就可以除以2了,不過剩了乙個,稍後再單獨乘上它。 

再次兩兩分開,指數除以2: ((2*2)*(2*2))*(2*2)*2 

實際上最後乙個括號裡的2 * 2是這回又剩下的,那麼,稍後再單獨乘上它 

現在指數已經為1了,可以計算最終結果了:16*4*2=128

[cpp]

view plain

copy

long

my_power(

long

a,long

b)  

return

r*a;

// 最後把主體和「剩下的」乘起來作為結果 } 

x^y可以看作y個x相乘,即然有積模分解公式,那麼我們就可以把y個x相乘再取模的過程分解開來,比如:(17^25))則可分解為:( ( 17 * 17 ) % 29 * ( 17 * 17 ) % 29 * …… 

如果用上面的**將這個過程優化,那麼我們就得到了著名的蒙格馬利快速冪模演算法:

[cpp]

view plain

copy

long

montgomery(

long

a,long

b,long

m)  

return

(r*a)%m; 

}

求a的b次方模p

對a的b次方取模 取模肯定是一邊算一邊取模 防止計算過程的溢位 所以只考慮實現a的b次方 快速冪 就直接說寫法和一些理解 計算a b,如果把 b 寫成2 進製,如13 的二進位制 1101,於是3 號位 2號位 0號位就都是1 就不證明了,去了解一些二進位制就會了 那麼就可以得到13 2 3 2 2...

求a的b次方,a b

求 a 的 b 次方對 p 取模的值。輸入格式 三個整數 a,b,p 在同一行用空格隔開。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a,b,p 10e9 輸入樣例 3 2 7輸出樣例 2 includeusing namespace std include include i...

求m的n次方

不考慮高精度,一般有三種做法 最笨的做法是把m連乘n 1次,這個就不寫了。第二種做法很好理解,是遞迴的快速冪,當n是偶數時,分解成兩個n 2次方然後再乘起來,n是奇數的時候分解成兩個n 2次方乘起來再多乘乙個m 第三種做法有點難得理解,是將n化成二進位制,然後把1的那些數字乘起來 經過測試,n很大的...