我正在寻找计算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
答案 0 :(得分:1)
如果a
和b
可以是10位数(假设在小数点之前),我认为通常没有一种简单的方法可以做到这一点。问题是,对于浮动x
和y
,您不一定拥有该属性
((x % m) * (y % m)) % m == (x * y) % m
如果您告诉我们您的具体情况以及您希望这样做的原因,可能还有其他方法。