我希望有效地计算以下数额:
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.
答案 0 :(得分:2)
你可以稍微改变一下来获得
A*(sum(i=0..max)) mod B
简化为
A*(max*(max+1)/2) mod B
现在你只需要做一个(可能是big-int)乘法(假设max本身不是太大),然后是一个(big-int)mod操作。