【问题标题】:Computing many remainders with remainder trees用余数树计算许多余数
【发布时间】:2019-02-17 02:04:46
【问题描述】:

我正在寻找一种快速计算 n mod x1n mod x2n mod x3 的方法...我发现一篇关于“remainder trees”的文章声称可以做到这一点。

但是,我看不出上述方法比单独计算每个 mod 更好(即使上述 remaindersusingproducttree 的最后一步似乎就是这样做的)。我还对上面的代码进行了简单的基准测试,它似乎并没有运行得更快。

我的问题是,我猜“剩余树”在某种程度上比天真的方法更好,但我不明白如何。拜托,有人能解释一下吗?

或者,有没有其他方法可以快速计算许多mod 操作?

【问题讨论】:

  • 快速浏览这篇文章,它似乎适用于当结果更长时除法变得更昂贵的用例(更小的除数意味着更多的操作)。您是否尝试过使用比计算机的原生类型大得多的数字测试用例,可能是 100 位左右?
  • @domen 是的,我试过了,没有区别。而且正如我上面所说的,最后一步似乎与幼稚的方法相同,所以我有点困惑。
  • 最后一步与幼稚方法中的不完全相同。天真的方法计算 n mod x,对于可能非常大的 n。树算法首先通过应用 n mod(一些 x 的乘积)将 n 减少到更小的数字,然后使用这个更小的数字来计算最终结果。我同意@domen 的观点,当 n 非常大并且我们假设余数运算具有非常量的运行时间时,这可能很有用。

标签: algorithm optimization division modulo integer-division


【解决方案1】:

这个算法的加速假设是log(n) >> log(x[i])。两个数相除的时间复杂度为O(b^2),其中b是被除数的位数。如果n 非常大,则初始除法(n mod x[0]x[1])非常昂贵,但以下两次除法是在第一次除法的相对较小的余数上完成的。因此,为了在基本情况下获得两个余数,该算法将两个非常昂贵的除法替换为一个非常昂贵的除法和两个非常便宜的除法。

【讨论】:

  • 我不确定我是否理解:天真的方法每个元素只使用一个除法,而不是两个?
  • 我说的是这对,在基本情况下。我已经编辑了答案以澄清这一点。
  • 我认为 m-,n-bits 数的除法是 ceil(m/n)*M(n) + O(m),其中 M 是乘法的成本。但无论如何,我现在可以看到计算d=a%(b*c); d%b, d%ca%b, a%c 快。我什至在一个简单的基准测试中看到了改进,只是 log(n) 必须在 10^9 的范围内...
猜你喜欢
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多