algorithm - 计算线性序列模 n 的总和

标签 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,不适用于总和。所以例如

总和(i=0..3) (i*7 mod 11) = 0 + 7 + 3 + 10 = 20。

最佳答案

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

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

简化为

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

现在您只需要执行一次(可能是大整数)乘法(假设 max 本身不是太大),然后进行一次(大整数)模运算。

关于algorithm - 计算线性序列模 n 的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976468/

相关文章:

arrays - 如果我使用一维数组来表示方板,我如何获取索引并检查其上方、下方和两侧的方 block ?

javascript - 将不同大小的圆圈打包成矩形 - d3.js

ruby-on-rails - 如何对 rails 中的列求和?

python - 如何在 Python 中对文本文件中的数字求和

python - 变量反转的总和

java - 将青色的整数颜色转换为 RGB 时遇到问题

c++ - 飞越等 ionic 分形 - 菱形方算法

algorithm - 寻找平截头体的最小包围球

c++ - 如何将整数字符串转换为二维整数 vector ?

c - 使用模数循环 9-0 并打印