問題描述:ax mod n (a的x次方再模n)求結果,對小數量的求模一般資料型別可以應付,但是當x很大時就會產生很大的中間結果。我們希望加速運算並且不產生大結果。
from:
我們知道模運算滿足分配率,(a*b)mod n = ((a mod n)*(b mod n)) mod n,所以我們將指數運算同模運算結合起來,將指數運算作為一系列的乘法運算,對於每次指數運算做一次模運算,(a*a*a*a*a*a*)mod n = (((a*a)mod n)((a*a)mod n)((a*a)mod n)*(x mod n))mod n.**實現如下:
[cpp]view plain
copy
#include
using
namespace std;
int pow(int x, int y, int mod)
return res;
} int main()
return 0;
}
其中(y & 1)判斷mod n 的個數是否是奇數,如果為1說明有單獨的x mod n 沒有進行指數運算,計算它儲存到臨時res,並且到最後只剩乙個指數運算的時候將結果和臨時res相乘取模。如果y是2倍數就不存在這種情況了。
神奇的模運算
小學時,大家應該已經很熟悉 如何判斷乙個數能否被3或9整除 的問題。然而,為何乙個數的各位數的和能被3或9整除時,該數即可以被3或9整除呢?又為何個位數是偶數時,該數即為偶數呢?有沒有類似的簡單的方法來判斷乙個數能否被7,被11整除呢?模運算可以很好地給出問題的答案。什麼是模運算呢?學過離散數學基礎...
常用的模運算
對於正整數和整數 定義如下運算 取模運算 a p 或a mod p 表示a除以p的餘數。模p加法 a b p 其結果是a b算術和除以p的餘數,也就是說,a b kp r,則 a b p r。模p減法 a b p 其結果是a b算術差除以p的餘數。模p乘法 a b p,其結果是 a b算術乘法除以p...
求a的b次方模p
對a的b次方取模 取模肯定是一邊算一邊取模 防止計算過程的溢位 所以只考慮實現a的b次方 快速冪 就直接說寫法和一些理解 計算a b,如果把 b 寫成2 進製,如13 的二進位制 1101,於是3 號位 2號位 0號位就都是1 就不證明了,去了解一些二進位制就會了 那麼就可以得到13 2 3 2 2...