java - BigInteger 算法如何在内部工作(Java)?
问题描述
Java 的 BigInteger 除法在内部是如何工作的?我进行了大量研究,但找不到任何东西。因此,我对 CPU 如何进行除法进行了一些研究,并研究了诸如恢复/非恢复除法和快速除法算法之类的东西。但是,我认为这些不适用于 BigInteger,因为 BigInteger 似乎必须使用 Java 的本机数字原始操作。如果 BigInteger 像这些技术大纲那样一点一点地做东西,那就太慢了。
解决方案
OpenJDK 的实现(是的,这取决于实现)使用 Knuth 的“算法 D”或 Burnikel-Ziegler 算法,具体取决于除数和被除数的大小。如果除数很小,或者它们的大小相似,则使用前者。您可以在此处查看源代码。
public BigInteger divide(BigInteger val) {
if (val.mag.length < BURNIKEL_ZIEGLER_THRESHOLD ||
mag.length - val.mag.length < BURNIKEL_ZIEGLER_OFFSET) {
return divideKnuth(val);
} else {
return divideBurnikelZiegler(val);
}
}
推荐阅读
- html - 当小型设备查看时,引导不同的高度比期望列的高度比为 1:1
- python - 如何将 JSON 国际金融统计数据转换为 pandas 数据框
- r - 在 R 中将 CRS 分配给 RaterBrick
- javascript - 如果选中复选框,则在数组中获取产品名称和价格
- python - python numpy.single 在使用 out 参数时给出不同的结果
- python - 如何用替换连接两个不相等的数据集?(Python)
- reactjs - React 语法错误,似乎无法弄清楚问题所在。错误:JSX 元素 'div' 没有相应的结束标记。ts(17008)
- vue.js - 使用带有 Nuxt.js 的 laravel API 上传图像时遇到问题
- git - 如何恢复被 git -rm 和 git commit 删除的本地文件?
- r - 选择第一个积极事件