【问题标题】:PHP Overflow ModulusPHP 溢出模数
【发布时间】: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() 存在的原因。

标签: php overflow modulus


【解决方案1】:

我建议查看GMP extension 并阅读this question

【讨论】:

  • 谢谢,我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多