首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速浮点调制

快速浮点调制
EN

Stack Overflow用户
提问于 2016-06-15 00:03:26
回答 1查看 218关注 0票数 0

我希望计算a^b模m,其中a&b是浮点数,m是一个非负整数。平凡的解决办法是做b乘法,这需要O(n)时间,但是我的数字a&b可以大一些(小数点前10位),我想要有效地做到这一点。当a、b和m是整数时,我们可以通过:平方在log(n)时间内快速计算modpow。

我将如何使用这种方法(或另一种)浮点数?我使用Python进行计算,而pow函数只允许整数。下面是我试图通过与十进制数相乘来进行幂运算的尝试,但答案并不正确:

代码语言:javascript
复制
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都是整数时,这个方法就是这样的:

代码语言:javascript
复制
# 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
EN

回答 1

Stack Overflow用户

发布于 2016-06-15 04:24:42

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

代码语言:javascript
复制
((x % m) * (y % m)) % m == (x * y) % m

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37824084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档