模冪計算機
使用快速平方乘演算法,高效計算大整數乘方後對另一整數取模的結果。
計算乘方對 m 取模
輸入整數底數、非負指數,以及大於一的模數。
關於模冪運算
模冪運算是將整數底數提升至非負整數次方,再求除以正模數後的餘數。運算式 a^b mod m 求的是從 0 到 m - 1 之間、與 a^b 同餘的唯一餘數。即使最後的餘數很小,冪值也會迅速變得極為龐大,使直接計算變得不切實際。本計算機不必建立這個巨大的中間整數。
這種高效方法稱為二進位快速冪、反覆平方或平方乘演算法。它將指數寫成二進位並逐位處理。首先將底數對 m 取模,再於每一步將目前因子平方並對 m 取模。當對應的指數位元為一時,將該因子乘入結果,並立即再次取模。由於每個中間值都會取模,計算中的數值始終小於模數的平方。
此演算法所需步驟數僅與指數的對數成正比。因此,計算十億次方只需約三十個平方階段,而非重複十億次乘法。顯示的運算次數分別統計平方運算,以及與指數中值為一的位元對應的選定乘法。指數為零時會正確傳回 1 mod m。
模運算將餘數相同的數視為等價。例如,17 與 5 模 12 同餘,因為兩者的餘數都是 5。本工具也支援負底數,會先將其正規化為非負剩餘類代表元。此處的指數必須非負。負模指數需要求模乘法反元素,而反元素僅在底數與模數互質時存在。
模冪是數論與現代密碼學的基礎運算。RSA 加密與簽章會將訊息提升至大指數次方,再對合數取模。Diffie-Hellman 金鑰交換和許多離散對數系統使用對質數取模的冪運算。此運算也用於質數測試、偽隨機數產生器、檢查碼、週期規律及程式競賽題目。
三個輸入欄位皆以任意精度整數處理,而非浮點數。因此,即使數值超出 JavaScript 通常的安全整數範圍,仍能保留每一位數字。模數必須大於一,且輸入不得包含逗號或小數點。手動核對時,可先對底數取模,再以較小指數反覆相乘,每一步都求餘。
模冪計算範例
以下範例涵蓋簡單算術核對及常見數論規律。
| 運算式 | 結果 | 說明 |
|---|---|---|
| 3^4 mod 5 | 1 | 81 除以 5 的餘數為 1 |
| 7^10 mod 13 | 4 | 一個精簡的類密碼學範例 |
| 123^456 mod 789 | 699 | 快速冪不必產生完整冪值 |
| 2^16 mod 17 | 1 | 費馬小定理的範例 |
如何計算模冪
- 輸入整數底數,可以是正數、零或負數。
- 輸入非負整數指數。
- 輸入大於一的整數模數。
- 選取「計算」,取得精確餘數與快速演算法的運算次數。
模冪常見問題
為什麼不先計算完整冪值?
完整冪值可能包含數百萬位數字,浪費時間與記憶體。每次相乘後取模可得到相同的最終餘數,同時讓中間整數保持在可處理範圍內。
什麼是平方乘演算法?
它逐位讀取指數的二進位表示,反覆對目前底數的餘數求平方。只將與值為一的位元對應的因子乘入結果。
底數可以是負數嗎?
可以,計算機會將負底數正規化為模 m 下等價的非負餘數。最終結果始終介於零與 m - 1 之間。
指數為零時會怎樣?
任何非零底數的零次方皆為一,模運算結果為 1 mod m。對於底數與指數皆為零的情況,本計算機採用相同慣例。
這個計算機能處理密碼學規模的整數嗎?
它使用任意精度整數運算,因此輸入不受一般浮點精度限制。極大的指數仍需更多運算,但二進位快速冪讓階段數維持對數級成長。