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

问题描述

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

  • 教科书长乘法
  • Karatsuba 算法
  • 3 路 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

您可以通过阅读source code2了解更多详情。


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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...