如何在不使用 bcmod 的情况下用模计算一个非常长的数字?

How can I calculate a really long number with modulo without using bcmod?

bcmod 功能已停用,我将无法激活它,因为它不是我自己的服务器。

出于某种原因,我需要计算一个长度至少为 24 且模数为 97 的整数。 整数不能那么长,这就是为什么它不能工作...

我已经用简单的运算符“%”和“fcmod”库尝试过了,但是这个 returns 我完全错了数字。

有人知道我是否可以在没有任何其他库的情况下自己解决这个问题,或者我真的需要“bcmod”吗?

这将是示例代码:

123456789101112131415171%97 真正的答案是 96 但它 returns 我 -94

如果您的数字太大,您可以将问题分成几个较小数字的步骤。一个例子:

假设我们以 3 位数为步长执行此操作。因此,1550 % 16 与第一次执行 155 % 16 相同,即 11。在第一步之后,我们将结果与整数的剩余部分相结合。即:110 得到 110。我们现在只剩下 3 位数字,所以我们做 110 % 1614。所以结果是 14.

我们可以在一个函数中实现这个,我一次使用8位数字,因为它更快:

function modulo($value, $modulo)
{
    while ((strlen($value) > strlen($modulo)) || 
           (intval($value) >= $modulo)) {
        $head = substr($value, 0, 8);
        $tail = substr($value, 8);
        $value = ($head % $modulo) . $tail;
    }    
    return $value;
}

现在如果我们这样做:

$value = "123456789101112131415171";
$modulo = 97;
echo modulo($value, $modulo);

我们得到 96。注意大整数怎么是字符串,不然不行。此函数中正在进行大量隐式类型转换。

参见:PHP Sandbox

可以使用更短的版本,但功能相同:

function modulo($value, $modulo)
{
    while ((strlen($value) > strlen($modulo)) || 
           (intval($value) >= $modulo)) {
        $value = (substr($value, 0, 8) % $modulo) . substr($value, 8);
    }    
    return $value;
}

参见:PHP Sandbox