【问题标题】:Karatsuba multiplication implementation in Java BigDecimalJava BigDecimal 中的 Karatsuba 乘法实现
【发布时间】:2017-05-23 09:37:04
【问题描述】:

最近我试图实现大数的 Karatsuba 乘法。然后我尝试将我的实现与 Java BigInteger 实现进行比较。我无法遵循这行代码:

// result = p1 * 2^(32*2*half) + (p3 - p1 - p2) * 2^(32*half) + p2
BigInteger result = p1.shiftLeft(32*half).add(p3.subtract(p1).subtract(p2)).shiftLeft(32*half).add(p2);

根据 Karatsuba 算法,result = (p1 * 10 ^ (2*half) ) + ( (p3 -p1 - p2) * 10 ^ (half)) + (p2)

由于使用 int[] 的实现,我相信 32 是 Java 整数中的位数。

但我不明白涉及向左移动位的部分。你能帮我理解这里发生了什么吗?

【问题讨论】:

  • @djxak 你能告诉我应该看那篇文章的哪一部分吗?似乎不相关。
  • @djxak 你说的是绝对的、完整的、完全的垃圾。这是BigDecimal 中关于 Karatsuba 乘法的 Java 问题。它与 Javascipt 或全局错误处理完全无关。
  • 行上方的评论不是回答了这个问题吗?左移就像乘以 2。
  • 伙计们,这当然不相关。只是错误的浏览器选项卡,我尽快撤销了标志,不知道为什么评论没有自动删除。现在删了。
  • 你给出的算法是十进制的。 Java 实现的基数为 2^32。

标签: java bit-manipulation bitwise-operators karatsuba


【解决方案1】:

Arithmetic shift

算术移位可用作执行有符号整数乘以或除以 2 的幂的有效方法。在有符号或无符号二进制数上左移n 位具有将其乘以2^n 的效果。将二进制补码有符号二进制数右移n 位会产生除以2^n 的效果,但它总是向下舍入(朝向负无穷大)。

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多