【问题标题】:pow() function gives wrong resultpow() 函数给出错误的结果
【发布时间】:2017-06-10 20:44:28
【问题描述】:

我想执行这个数学函数:

3^(3^1000000000) mod 1000000007

这样的结果是:930782551

但是直接在python中做会耗费大量时间,而且程序会挂掉:

return pow(3,pow(3,1000000000),1000000007) 

所以我认为执行这个会是一样的:

return pow(3,pow(3,1000000000, 1000000007),1000000007) 

但结果是:270196661

我怎样才能在合理的时间内得到正确的结果930782551

【问题讨论】:

  • 你的 WA 表达式应该是 (3^((3^1000000000)mod1000000007))mod1000000007。你放在那里的东西和你放在这里的东西是不一样的。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见minimal reproducible example
  • 您需要费马小定理/欧拉定理才能有效地做到这一点。幸运的是,1000000007 是素数,因此很容易计算它的总函数。
  • @PM2Ring 我在 math.stackexchange 上问了一个问题,想知道如何计算它。看看我的回答。
  • 这个问题非常好,我建议编辑把原来的 pow 函数放入需要大量时间,并询问如何在合理的时间内完成

标签: python modulo exponential bignum wolframalpha


【解决方案1】:

根据您对问题的编辑,使用

>>> pow(3, pow(3, 1000000000, 500000003), 1000000007)
930782551

其他任何东西都需要很长时间才能计算出来。这个表达式是使用费马小定理获得的。

我在 math.stackexchange.com 上询问了question。底线,pow 不会打印不正确的结果。这是绝对正确的。你的输入是错误的。

【讨论】:

  • 一旦我验证了 1000000007 是素数,我就做了pow(3, pow(3,1000000000, 1000000006), 1000000007)
  • 我不知道费马定理,所以我不得不问一个问题。 x)
  • 费马小定理是一个美丽的数论,它并不难理解。一旦你把它记下来,证明欧拉定理就不难了。当你拥有那个时,你就能理解 RSA 加密是如何工作的。
  • 这太棒了!
  • @PM2Ring 是的。我有很多东西要学。另外,我认为欧拉定理费马定理的证明?
【解决方案2】:

编辑

一开始我以为是sintaxis的问题,所以回答:

return pow(3,pow(3,1000000000),1000000007)

但这需要不合理的时间。所以我尝试解决计算时间的问题,但是我没有及时解决:)。

完美的答案是@Coldspeed 一个,他可以很好地解决计算时间问题,整个解释都在那里

【讨论】:

  • 你知道计算需要多长时间吗?
  • 这会破坏
  • @Don'tcallme 是的,一开始我只是认为这是一个sintáxis问题,但还有很多,我投票赞成这个问题,因为它确实很有趣,我希望你接受版本
  • @Coldspeed你说得对,一开始我只是觉得是sintaxis的问题,我会升级答案
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多