【问题标题】:Binary GCD Algorithm vs. Euclid's Algorithm on modern computers现代计算机上的二进制 GCD 算法与欧几里德算法
【发布时间】:2011-11-19 06:18:45
【问题描述】:

http://en.wikipedia.org/wiki/Binary_GCD_algorithm

此 Wikipedia 条目有一个非常令人不满意的含义:二进制 GCD 算法曾一度比标准欧几里德算法的效率高出 60%,但直到 1998 年,Knuth 得出结论,效率仅提高了 15%在他同时代的电脑上。

又过了 15 年……今天这两种算法如何与硬件的进步叠加?

二进制 GCD 是否在低级语言中继续优于欧几里得算法,但由于其在 Java 等高级语言中的复杂性而落后?还是现代计算中的差异没有实际意义?

我为什么在乎你可能会问?我碰巧今天不得不处理大约 1000 亿个这样的数据:) 为生活在计算时代干杯(可怜的 Euclid)。

【问题讨论】:

  • 您可以有一个基准来测试它们,只需在一个 for 循环中(例如大小为 1000)创建一个随机数列表,然后为所有一对数字计算二进制并在另一个循环中计算euclid gcd,有什么问题? IMO,仍然在现代计算机中,二进制文件应该更快,特别是数字越大。
  • 我可以,这将相当代表特定操作系统上特定处理器上的特定语言。这是一种足够常见的数值运算,我更普遍地好奇当今高性能应用程序中的首选解决方案是什么。
  • 如果您今天必须完成 1000 亿次,那么花在讨论最有效解决方案上的任何时间都会比简单地实施其中一个或另一个花费更多的时间。

标签: java algorithm math numerical-analysis number-theory


【解决方案1】:

答案当然是“视情况而定”。这取决于硬件、编译器、具体实现,无论我忘记了什么。在除法较慢的机器上,二进制 GCD 往往优于欧几里得算法。几年前,我在 Pentium4 上用 C、Java 和其他几种语言对其进行了基准测试,总体而言,在该基准测试中,具有 256 个元素查找表的二进制 gcd 以 1.6 到近 3 倍的倍数击败了欧几里得算法。欧几里得当执行前几轮减法而不是立即除法时,距离更近了。我不记得数字了,但二进制还是要快得多。

如果机器具有快速除法,情况可能会有所不同,因为欧几里得算法需要较少的操作。如果除法和减法/移位之间的成本差异足够小,二进制会更慢。在您的情况下,哪一个更好,您必须通过对标自己来找出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多