【发布时间】:2016-11-18 00:31:21
【问题描述】:
我必须创建一个简单的模幂函数,它接受输入三个整数 a、b 和 c,并执行任务:a^b %c 而不会溢出。
【问题讨论】:
标签: c++
我必须创建一个简单的模幂函数,它接受输入三个整数 a、b 和 c,并执行任务:a^b %c 而不会溢出。
【问题讨论】:
标签: c++
它是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 的简化案例。更新。我认为练习的想法是避免与求幂相关的溢出,而不是专注于极端情况。不过,你的说法是正确的。
r 应该是结果。
为此使用Euler theorem,它可以显着降低指数。
您需要一个辅助函数来查找 phi 函数(或者可能有一个包含该函数的库)。那么,你所要做的就是
(a ^ b) % c => (a ^ (b % phi(c)) % c
这肯定有助于减少溢出的机会。此外,mod 具有以下属性:
a*b % c = (a % c)*b % c
这意味着如果您的指数会导致溢出,您可以将指数减半,并在较小的值上执行 mod。查看一些数论书籍,了解更多技巧,让这变得更容易!
【讨论】: