【问题标题】:Raising 2 to large exponents将 2 提高到大指数
【发布时间】:2020-09-23 18:18:17
【问题描述】:

我正在尝试计算以下两个的大指数:2^48572234(*注意:这是一个示例,不是我正在计算的数字之一)。但是,python 用于提高指数的内置符号在此任务上相当慢:

number = 2**<exponent>

在我的计算机上完成这项任务需要 80 多个小时(使用上面的示例)。但是,更快的方法可能是pow。这是一个例子:

number = pow(<exponent>)

总共需要 68 小时。但这仍然太长,尤其是当指数开始变得非常大时。另一种方法是使用math.pow 函数,但使用OverflowError 会出错。

我还尝试了另一种方法,我将n 的数量附加到一个字符串中,将其转换为int 并添加一个以获得答案。这将类似于以下方法:

def genExponent(n): # generate large exponents of two.
    x = ""
    for i in range(n):
        x += "1"
    z = int(x,2)
    z+=1
    return z

但是,在我的示例中,这种方法在 72 小时内与其他方法一样慢。

有人对更高效的算法有任何想法吗?

【问题讨论】:

  • 使用您的示例,2^48572234 将是一个需要大约 48 兆位/6 兆字节来存储和表示的数字(2^X 需要 X+1 位)。地球上没有一个处理器可以使用硬件加速来计算这样的数字,所以这将仅使用软件来完成。因此,计算需要一段时间也就不足为奇了。
  • 不过,要使用该属性,以迂回的方式计算它可能会更容易。二进制中的2^X 是 1 后跟 X 个零,因此不是用数学方法计算它,另一种方法可能是构造该字符串,然后将其解析为一个(非常大的)整数。
  • 在我说我试过的问题中*
  • 对于这些大小,您应该考虑使用指数表示。你会用这个数字做什么:在结果中加 1?它不会有任何效果。
  • 说实话,我真的不想用它做任何事情——我只是想看看我是否可以,以及计算它的最快选择是什么。

标签: python python-3.x performance exponent


【解决方案1】:

这是我在评论中描述的十六进制方法:

def hex(exponent):
    sig_exp = exponent % 4
    sig = 2**sig_exp
    zeroes = (exponent - sig_exp) // 4
    return str(sig) + (zeroes * '0')

x = hex(1234567)
ix = int(x, 16)

# Equivalent exponential operator
# ix = 2*1234567

它似乎运行得相当快,尽管不一定比指数运算符选项快得多(实际上差不多)。当我尝试创建您在问题中描述的大小的字符串/整数时,我只在不喜欢它的在线存储库中对其进行了测试,所以我不知道它在那里的表现如何。

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 2020-01-26
    • 1970-01-01
    • 2022-09-22
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多