模冪是一種對模進行的冪運算，在計算機科學，尤其是公開金鑰加密方面有一定用途。 模冪運算是指求整數 b 的 e 次方 be 被正整數 m 所除得到的餘數 c 的過程，可用數學符號表示為 cbe bmod m。由 c 的定義可得 0leq c m。 例如，給定 b5，e3 和 m13，53125 被 13 除得的餘數 c8。 指數 e 為負數時可使用擴充套件歐幾里得演算法找到 b 模除 m 的模逆元 d 來執行模冪運算，即： cbe bmod mde bmod m，其中 e0 且 bcdot d equiv 1 pmod m。 即使在整數很大的情況下，上述模冪運算其實也是易於執行的。然而，計算模的離散對數（即在已知 b，c 和 m 時求出指數 e）則較為困難。這種類似單向函式的表現使模冪運算可用於加密演算法。 直接演算法 計算模冪的最直接方法是直接算出 be，再把結果模除 m。假設已知 b4，e13，以及 m497，要求 c： cequiv 413pmod 497 可用計算器算得 413 結果為 67108864，模除 497，可得等於 445。 注意到 b 只有一位，e 也只有兩位，但 be 的值卻有 8 位。 強加密時 b 通常至少有 1024 位。考慮 b5times 1076 和 e17 的情況，b 的長度為 77 位，e 的長度為 2 位，但是 be 的值以十進位制表示卻已經有 1304 位。現代計算機雖然可以進行這種計算，但計算速度卻大大降低。 用這種演算法求模冪所需的時間取決於操作環境和處理器，時間複雜度為 mathrm Oe。 空間最佳化 這種方法比第一種所需要的步驟更多，但所需記憶體空間和時間均大為減少，其原理為： 給定兩個整數 a 和 b，以下兩個等式是等價的： c bmod macdot b bmod m c bmod ma bmod mcdot b bmod mbmod m 演算法如下： 令 c1，e0。 e 自增 1。 令 cbcdot c bmod m 若 ee，則返回第二步；否則，c 即為 cequiv be pmod m。 再以 b4，e13，m497 為例說明，演算法第三步需要執行 13 次： e 1cdot c1cdot 4 bmod 4974 bmod 4974 e 2cdot c4cdot 4 bmod 49716 bmod 49716 e 3cdot c16cdot 4 bmod 49764 bmod 49764 e 4cdot c64cdot 4 bmod 497256 bmod 497256 e 5cdot c256cdot 4 bmod 4971024 bmod 49730 e 6cdot c30cdot 4 bmod 497120 bmod 497120 e 7cdot c120cdot 4 bmod 497480 bmod 497480 e 8cdot c480cdot 4 bmod 4971920 bmod 497429 e 9cdot c429cdot 4 bmod 4971716 bmod 497225 e 10cdot c225cdot 4 bmod 497900 bmod 497403 e 11cdot c403cdot 4 bmod 4971612 bmod 497121 e 12cdot c121cdot 4 bmod 497484 bmod 497484 e 13cdot c484cdot 4 bmod 4971936 bmod 497445 因此最終結果 c 為 445，與第一種方法所求結果相等。 與第一種方法相同，這種演算法需要 mathrm Oe 的時間才能完成。但是，由於在計算過程中處理的數字比第一種演算法小得多，因此計算時間至少減少了 mathrm Oe 倍。 演算法虛擬碼如下： function modular_pow b e m if m 1 then return 0 c 1 for e 0 to e1 c c b mod m return c 從右到左二位演算法 第三種方法結合了第二種演算法和平方求冪原理，使所需步驟大大減少，同時也與第二種方法一樣減少了記憶體佔用量。 首先把 e 表示成二進位制，即： e sum_i0n1 a_i 2i 此時 e 的長度為 n 位。對任意 i（0leq i n），a_i 可取 0 或 1 任一值。由定義有 a_n11。 be 的值可寫作： be bleft sum_i0n1 a_i 2i right prod_i0n1 left b2i right a_i 因此答案 c 即為： c equiv prod_i0n1 left b2i right a_i mbox mod m 虛擬碼 下述虛擬碼基於布魯斯施奈爾所著《應用密碼學》Schneier 1996 p 244。其中 base，exponent 和 modulus 分別對應上式中的 b，e 和 m。 function modular_pow base exponent modulus if modulus 1 then return 0 Assert modulus 1 modulus 1 does not overflow base result 1 base base mod modulus while exponent 0 if exponent mod 2 1 result result base mod modulus exponent exponent 1 base base base mod modulus return result 注意到在首次進入迴圈時，變數 base 等於 b。在第三行程式碼中重複執行平方運算，會確保在每次迴圈結束時，變數 base 等於 b2i bmod m，其中 i 是迴圈執行次數。 本例中，底數 b 的指數為 e 13。 指數用二進位制表示為 1101，有 4 位，故迴圈執行 4 次。 4 位數字從右到左依次為 1，0，1，1。 首先，初始化結果 R 為 1，並將的值儲存在變數 x 中： R leftarrow 1 b0 text 且 x leftarrow b 第 1 步 第 1 位為 1，故令 R leftarrow R cdot x text b1 ； 令 x leftarrow x2 text b2 。 第 2 步 第 2 位為 0，故不給賦值； 令 x leftarrow x2 text b4 。 第 3 步 第 3 位為 1，故令 R leftarrow R cdot x text b5 ； 令 x leftarrow x2 text b8 。 第 4 步 第 4 位為 1，故令 R leftarrow R cdot x text b13 ； 這是最後一步，所以不需要對求平方。 綜上，R 為 b13。 以下計算 b 4 的 e 13 次方對 497 求模的結果。 初始化： R leftarrow 1 b0 且 x leftarrow b 4 。 第 1 步 第 1 位為 1，故令 R leftarrow R cdot 4 pmod 497 equiv 4 pmod 497 ； 令 x leftarrow x2 text b2 equiv 42 equiv 16 pmod 497 。 第 2 步 第 2 位為 0，故不給賦值； 令 x leftarrow x2 text b4 equiv 162 pmod 497 equiv 256 pmod 497 。 第 3 步 第 3 位為 1，故令 R leftarrow R cdot x text b5 equiv 4 cdot 256 pmod 497 equiv 30 pmod 497 ； 令 x leftarrow x2 text b8 equiv 2562 pmod 497 equiv 429 pmod 497 。 第 4 步 第 4 位為 1，故令 R leftarrow R cdot x text b13 equiv 30 cdot 429 pmod 497 equiv 445 pmod 497 ； 綜上，R 為 413 pmod 497 equiv 445 pmod 497，與先前演算法中所得結果相同。 該演算法時間複雜度為 exponent。指數 exponent 值較大時，這種演算法與前兩種 exponent 演算法相比具有明顯的速度優勢。例如，如果指數為 220 1048576，此演算法只需執行 20 步，而非 1048576 步。 Lua 實現 function modPow bem if m 1 then return 0 else local r 1 b b m while e 0 do if e 2 1 then r rb m end e e 1 Lua 52 或更早版本使用 e mathfloor e 2 b b2 m end return r end end 軟體實現 鑑於模冪運算是計算機科學中的重要操作，並且已有高效演算法，所以許多程式語言和高精度整數庫都有執行模冪運算的函式： Python 內建的 pow （求冪）函式 NET 框架的 BigInteger 類的 ModPow 方法 Java 的 javamathBigInteger 類的方法 Perl 的 MathBigInt 模組的 bmodpow 方法 Raku 內建的 expmod 例程 Go 的 bigInt 類的 Exp （求冪）方法 PHP 的 BC Math 庫的 bcpowmod 函式 GNU 多重精度運算庫（GMP）的 mpz_powm 函式 FileMaker Pro 的 PowerMod 函式（以 1024 位 RSA 加密為例） Ruby 的 openssl 包的 OpenSSLBNmod_exp 方法 HP Prime 計算器的 CASpowmod 函式 另見 蒙哥馬利演算法，用於計算模很大時的餘數。 參考資料 外部連結 Paul Garrett Fast Modular Exponentiation Java Applet Category 密碼演算法 Category 數論演算法 Category 同餘 Category 帶有虛擬碼示例的條目