【发布时间】:2017-05-02 20:03:32
【问题描述】:
假设我必须重复将一个变量乘以一个常数并将结果乘以另一个常数的过程,n 次以获得我想要的结果。
显而易见的解决方案是迭代 n 次,但 n 越大,它就越耗时。
代码示例:
const N = 1000000;
const A = 123;
const B = 456;
var c = 789;
for (var i = 0; i < n; i++)
{
c = (c * a) % b;
}
log("Total: " + c);
是否有任何代数解决方案来优化这个循环?
【问题讨论】:
-
迭代乘法有数学抽象吗?那么
A和B之间存在特殊关系:如果A % B == 0… -
您可以预先计算或缓存
c = 0 .. b-1的值并将它们存储在look-up table中。在循环内,c总是被模运算截断到这个范围内。 -
是c是周期性的,最大周期长度是b。
-
@PaulHankin 我最初倾向于同意你的观点,即这是重复的,但是当我看到两个高级用户给出的答案似乎是基于假设这不仅仅是伪装的简单模幂运算我认为等效性不是很明显。