【问题标题】:Fast floating point modpow快速浮点 modpow
【发布时间】:2016-10-15 21:33:56
【问题描述】:

我正在计算 a^b mod m 其中 a & b 是 浮点 数字,m 是非负整数。简单的解决方案是进行 b 乘法,这需要 O(n) 时间,但是我的数字 a 和 b 可能较大(小数点前约 10 位),我想有效地做到这一点。当 a、b 和 m 是整数时,我们可以通过以下方式在 log(n) 时间内快速计算 modpow:Exponentiation_by_squaring

如何将这种方法(或另一种方法)用于浮点数?我正在使用 Python 进行此计算,并且 pow 函数只允许整数。这是我尝试通过与十进制数平方来求幂,但答案并不正确:

from decimal import Decimal

EPS = Decimal("0.0001")

# a, b are Decimals and m is an integer
def deci_pow(a, b, m):
  if abs(b) < EPS:
    return Decimal(1)
  tmp = deci_pow(a, b / 2, m) % m # Should this be // ?
  if abs(b % 2) < EPS:
    return (tmp * tmp) % m
  else:
    if b > 0:
      return (a * tmp * tmp) % m
    else:
      return ((tmp * tmp)/a) % m

print(deci_pow(Decimal(2.4), Decimal(3.5), 5)) # != 1.416

当 a,b,m 都是整数时,方法如下所示:

# a, b, m are Integers
def integer_pow(a, b, m):
  if b == 0: return 1
  tmp = integer_pow(a, b // 2, m) % m
  if b % 2 == 0:
    return (tmp * tmp) % m
  else:
    if b > 0:
      return (a * tmp * tmp) % m
    else:
      return ((tmp * tmp) / a) % m

【问题讨论】:

  • 你的意思是 (a**b)mod m?在您的示例中,您是如何获得 4.705 的?
  • 很抱歉,人为错误。实际答案应该是 1.416!

标签: python math floating-point exponentiation mod


【解决方案1】:

如果ab 可以是10 位数字(假设在小数点之前),我认为一般来说没有简单的方法可以做到这一点。问题是对于浮动xy,你不一定有这个属性

((x % m) * (y % m)) % m == (x * y) % m

如果您告诉我们您的具体情况以及为什么要这样做,可能还有其他方法。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2013-04-09
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多