Java使用哪种算法进行乘法?

可能的乘法算法列表很长:

  • 教科书长乘法
  • 唐叶算法
  • 三路 Toom–Cook 乘法
  • k-way Toom–Cook 乘法
  • 混合级 Toom–Cook
  • Schönhage-Strassen 算法
  • Fürer 算法

Java 默认使用哪一个,为什么?它什么时候切换到“更好的性能”算法?

回答

嗯……*运营商将使用硬件提供的任何东西。Java 在这方面没有发言权。

但是,如果您谈论的是BigInteger.multiply(BigInteger),则答案取决于 Java 版本。对于 Java 11,它使用:

  • 小数的天真“长乘法”,
  • 中等大小的 Karatsuba 算法,以及
  • 大数的 3 路 Toom–Cook 乘法。

对于由 80 到 239 个int值表示的数字,阈值是 Karatsuba,对于 >= 240 个int值是一个 3 路 Toom-Cook 。被乘数中的较小者控制算法选择。


Java 默认使用哪一个,为什么?

哪个?看上面。

为什么?代码中的注释暗示阈值是根据经验选择的;即有人做了一些系统的测试来确定哪些阈值给出了最好的性能1

您可以通过阅读源代码2找到更多详细信息。


1 - 当前的实现BigInteger自 2013 年以来没有发生重大变化,因此它可能没有包含更多最近的研究结果。
2 - 请注意,此链接指向Github 上的最新版本。

  • See the source code link in my answer. That is the only public information I'm aware of about how Java does this.

以上是Java使用哪种算法进行乘法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>