【问题标题】:Why are multiplication algorithms needed if hardware already does it?如果硬件已经做到了,为什么还需要乘法算法?
【发布时间】:2016-02-03 05:09:38
【问题描述】:

我正在学习用于快速整数乘法的 Karatsuba algorithm 并想知道,既然计算机已经在 CPU 中内置了专用硬件来进行乘法运算,为什么还需要这个算法?

是不是大数很难相乘,但算法把它分解成更简单的步骤,硬件更容易处理,因为硬件擅长乘小数?

【问题讨论】:

  • Karatsuba 算法对于大型输入仍然不够快。你可能更愿意学习基于快速傅里叶变换的乘法算法:en.wikipedia.org/wiki/…

标签: algorithm architecture


【解决方案1】:
  1. 所有 CPU 都有固定的 ALU/FPU 位宽。

    例如,在 i80x86 (PC) 上,ALU 仅限于:

    i8086+   16 bit
    i80386+  32 bit
    x64 arch 64 bit
    

    只允许计算最多 16/32/64 位数字作为操作数。 i80x87 FPU 使用 80 bit 数字表示,它从/到 IEEE float(32bit)/double(64bit) 限制精度。

  2. 如果您需要计算位宽大于硬件限制的数字

    然后您需要将其分解为可在 ALU/FPU 上计算的块(并将它们作为数字处理)并将它们的结果组合成最终值。 ALU 对此进行计数,这就是为什么 CPU 具有 Carry 标志并且 ALU 支持带进位的加法和减法。现在,如果您正在做简单的+/-,那么您只需添加/替换从最低(LSW)到最高(MSW)传播进位的所有数字。见:

    乘法和除法更复杂,你需要使用长算法(比如你在纸上计算),通常是O(n^2)。其中n 是“位数”的数量。一位通常是8/16/32/64 位数或其最大的10^m 基数。当您计算小数字(最多几个 100 倍位)时,更高级的算法没有任何好处,因为它们的开销太大。对于更大的数字,情况对他们有利。见:

    计算大浮点数很棘手,通常在整数算术 ALU 上而不是在 FPU 中完成速度更快。但在某些情况下,如果您将值分解为更多变量,例如在求和/积分时提高准确性,您仍然可以从 FPU 中受益,请参阅:

【讨论】:

    【解决方案2】:

    这类算法往往只对多精度数字有效——这实际上对 RSA 之类的东西有用。不管他们是否有回报,理论上都对制定多精度算术的最佳算法感兴趣。

    当然,硬件也需要设计,人们有时会使用除法算法,这些算法不是教给刚开始算术的孩子的。维基百科建议https://en.wikipedia.org/wiki/Division_algorithm#SRT_division,这并不完全是高科技。有一些建议甚至实际使用 Newton-Raphson 迭代进行除法的示例。

    【讨论】:

    • 最近的指令集中甚至还支持多精度算术:addition using two carry bits 以及与之配套的乘法。对于完全令人沮丧的体验,尝试让 Java BigInteger 平方明显快于在 JVM 中使用这种对乘法的支持,而不是平方(乘法需要大约三分之二的时间)。 /跨度>
    • 什么是“多精度数”?你指的是任意精度算术en.wikipedia.org/wiki/Arbitrary-precision_arithmetic
    • @Celeritas “多精度数字”通常是指由基本块组成的数字,以允许像 BYTE/WORD/DWORD/QWORD... 这样的分段处理,并且通常可分为低半和高半
    • @Celeritas,是的,我指的是这个
    【解决方案3】:

    如果硬件已经做到了,为什么还需要乘法算法?

    因为硬件还没有做到这一点。硬件最多只能进行 64 位或 128 位乘法。你提到的 Karatsuba 算法只有在你的数字大很多数量级时才会开始有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2017-11-13
      • 2018-01-28
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2017-10-03
      • 2016-02-04
      相关资源
      最近更新 更多