【问题标题】:pow or ** for very large number in Pythonpow 或 ** 表示 Python 中的非常大的数字
【发布时间】:2014-07-08 16:10:08
【问题描述】:

我正在尝试在 Python 中计算一些 num1**num2。但问题是num193192289535368032Lnum284585482668812077L,这是非常大的数字。

我尝试了以下几种方法:首先,我尝试使用**运算符进行计算。但是花了太多时间(我等了大约2个小时,但没有得到结果)。

其次,我使用了math.pow(num1, num2)。但我得到了这个:

Traceback (most recent call last):   File "<pyshell#23>", line 1, in <module>
    math.pow(84585482668812077L, 93192289535368032L)
OverflowError: math range error

最后我用numpy.power:

numpy.power(84585482668812077, 93192289535368032)
-9223372036854775808

如你所见,它给了我负数。

我真正想做的是result = (num1**num2),然后是result % num3。所以,我需要有效地计算这个功率值。

我该怎么做?

【问题讨论】:

  • 既然你在做(num1 ** num2) % num3,你应该看看Fermat's Litte Theorem的泛化。在维基百科上查找
  • @sshashank124 感谢您的参考。

标签: python python-2.7 math numpy


【解决方案1】:

您应该将 num3 作为第三个参数传递给pow

战俘(...) pow(x, y[, z]) -> 数字 有两个参数,相当于 x**y。用三个论据, 等效于 (x**y) % z,但可能更有效(例如,对于多头)。

【讨论】:

  • 谢谢。我想我必须导入“数学”才能使用 pow。但是 Python 本身有默认的 pow。
  • 你不想从math导入pow——那是C pow,它不接受第三个参数。
  • @confused_at_times, math.pow 以浮点数进行计算。即使结果符合浮点范围,这里的精度损失也是不可接受的。此外,当涉及大量数据时,仅在最后进行 mod 确实不切实际。
  • 抱歉,评论是基于没有正确阅读问题。没想到用户已经尝试过了。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2010-10-07
相关资源
最近更新 更多