快速浮点模型

时间:2016-06-15 00:03:26

标签: python math floating-point exponentiation mod

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

如何将此方法(或其他方法)用于浮点数?我正在使用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

1 个答案:

答案 0 :(得分:1)

如果ab可以是10位数(假设在小数点之前),我认为通常没有一种简单的方法可以做到这一点。问题是,对于浮动xy,您不一定拥有该属性

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

如果您告诉我们您的具体情况以及您希望这样做的原因,可能还有其他方法。