计算线性序列模n的和

时间:2014-04-10 00:30:43

标签: algorithm sum modulo

我希望有效地计算以下数额:

sum(i = 0..max)(i * A mod B)

可以假设max,A< B和A和B是共同素数(否则可以轻松减少)。数字很​​大,因此简单的迭代效率太低。 到目前为止,我还没有能够提出多项式时间算法(即log(B)中的多项式),我能找到的最好是O(sqrt(max))。这是一个已知的难题,还是有人知道多项式时间算法?

要清楚,“mod B”仅适用于i * A,而不适用于总和。例如,

sum(i = 0..3)(i * 7 mod 11)= 0 + 7 + 3 + 10 = 20.

1 个答案:

答案 0 :(得分:2)

你可以稍微改变一下来获得

 A*(sum(i=0..max)) mod B

简化为

 A*(max*(max+1)/2) mod B

现在你只需要做一个(可能是big-int)乘法(假设max本身不是太大),然后是一个(big-int)mod操作。