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.