PHP 5 之前的版本沒有 bcpowmod。此常式使用 bcdiv、bcmod 和 bcmul 模擬此函式。bcpowmod 非常實用,因為它通常用於實作 RSA 演算法。
函式 bcpowmod(v, e, m) 理應等同於 bcmod(bcpow(v, e), m)。然而,對於 RSA 演算法中用作金鑰的大數字,bcpow 函式會產生一個太大而溢位的數字。對於任何大於數萬的指數,bcpow 都會溢位並傳回 1。
此常式會迴圈執行,針對指數中的每個 1 位元,將結果平方,並以模數取模。指數會在每次迴圈時向右移一位。當它被減至零時,計算結束。
此方法可能比 bcpowmod 慢,但至少它有效。
function PowModSim($Value, $Exponent, $Modulus)
{
// 檢查是否真的需要模擬。
if (function_exists("bcpowmod"))
return (bcpowmod($Value, $Exponent, $Modulus));
// 迴圈直到指數減為零。
$Result = "1";
while (TRUE)
{
if (bcmod($Exponent, 2) == "1")
$Result = bcmod(bcmul($Result, $Value), $Modulus);
if (($Exponent = bcdiv($Exponent, 2)) == "0") break;
$Value = bcmod(bcmul($Value, $Value), $Modulus);
}
return ($Result);
}