【问题标题】:Simple Modular Exponentiation in C++ without overflow? [closed]C ++中的简单模幂运算没有溢出? [关闭]
【发布时间】:2016-11-18 00:31:21
【问题描述】:

我必须创建一个简单的模幂函数,它接受输入三个整数 a、b 和 c,并执行任务:a^b %c 而不会溢出。

【问题讨论】:

标签: c++


【解决方案1】:

它是Modular exponentiation。假设无符号 a、b、c 并且 a * (c - 1) 不会溢出:

unsigned int r = 1;
for (unsigned int k = 0; k < b; k++)
    r = r * a % c;

(请注意,C 中没有幂运算符,^ 是为XOR (封闭OR。)

【讨论】:

  • 这并不安全,r * a 很容易溢出。也很慢。
  • 所以a^b %c 的答案是k=b 之后的r?
  • @harold 是的,我假设了一个合理的a 的简化案例。更新。我认为练习的想法是避免与求幂相关的溢出,而不是专注于极端情况。不过,你的说法是正确的。
  • @Bartholomew 是的,r 应该是结果。
  • @AlexD 非常感谢。
【解决方案2】:

为此使用Euler theorem,它可以显着降低指数。

您需要一个辅助函数来查找 phi 函数(或者可能有一个包含该函数的库)。那么,你所要做的就是

(a ^ b) % c => (a ^ (b % phi(c)) % c

这肯定有助于减少溢出的机会。此外,mod 具有以下属性:

a*b % c = (a % c)*b % c

这意味着如果您的指数会导致溢出,您可以将指数减半,并在较小的值上执行 mod。查看一些数论书籍,了解更多技巧,让这变得更容易!

【讨论】:

  • 非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 2018-01-15
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2011-01-13
  • 2017-07-28
相关资源
最近更新 更多