【发布时间】:2012-02-04 23:56:07
【问题描述】:
我正在编写一个使用连续平方来求解 a^k mod m 的算法。由于连续平方的工作方式,算法必须计算的最大数字是 2147483646^2(我将用户输入限制为 214738364)。不幸的是,它仍然需要计算这个。它似乎正确地得到了平方部分,然后将溢出的数字转换为浮点数,但随后无法计算浮点数和整数的模数。
示例行是:
3422422^2 mod 715924 = 661224^2 mod 715924 = 437217178176 mod 715924 = -354280
我该如何解决这个问题,以及如何在 PHP 中找到解决整数溢出的方法?
【问题讨论】:
-
如何解决?那个浮点/积分模块不可用?
-
嗯,显然模不会返回负数,但这就是这里发生的事情。浮点数和整数的取模是否有特殊的 PHP 函数?
-
What's wrong with modulus returning a negative number? 我不认为浮点与它有任何关系;它只是一个溢出的整数。
-
对不起,我的意思是两个正整数的模数不会返回负数,就像我展示的例子一样。那么这里发生了什么?我认为一旦 PHP 中的整数溢出,它的类型就会更改为浮点数。所以在 661224^2 溢出后,4372178176 变成了一个浮点数,然后它试图计算一个正浮点数和一个正整数的模数。
-
我怀疑这很容易通过高效的运行时行为重新实现(您需要处理字符串并模拟整数算术)。这就是
bcpowmod()存在的原因。