Algorithm 对于一个大整数乘法,根据N的大小选择哪种算法

Algorithm 对于一个大整数乘法,根据N的大小选择哪种算法,algorithm,Algorithm,在我的空闲时间,我正在准备面试问题,比如:实现数字数组的乘法。显然,我被迫从头开始用Python或Java等语言编写,所以像“使用GMP”这样的回答是不可接受的(这里提到:) 对于这两个数字的大小范围(即位数),我应该选择 学校等级算法 Karatsuba算法 图姆库克 Schönhage–Strassen算法 Schönhage–StrassenO(n log n log n)总是一个好的解决方案吗?维基百科提到Schönhage–Strassen适用于2^2^15到2^2^17以外的数字。当

在我的空闲时间,我正在准备面试问题,比如:实现数字数组的乘法。显然,我被迫从头开始用
Python
Java
等语言编写,所以像“使用GMP”这样的回答是不可接受的(这里提到:)

对于这两个数字的大小范围(即位数),我应该选择

  • 学校等级算法
  • Karatsuba算法
  • 图姆库克
  • Schönhage–Strassen算法
  • Schönhage–Strassen
    O(n log n log n)
    总是一个好的解决方案吗?维基百科提到Schönhage–Strassen适用于
    2^2^15
    2^2^17
    以外的数字。当一个数字大得离谱(例如从
    10000
    40000
    十进制数字),而第二个数字只包含两位数时,该怎么办


    所有这4种算法都可以轻松并行吗?

    您可以浏览GNU多精度算术库的源代码并查看

    更实际地说,您应该只描述算法的实现。GMP在优化方面投入了大量精力,因此他们的算法将具有与您不同的常数因子。这种差异很容易将阈值移动一个数量级。找出随着代码输入大小的增加,时间交叉的地方,并相应地设置阈值


    我认为所有的算法都适合于并行化,因为它们大多由分治过程组成。但请记住,并行化是另一件会大大改变阈值的事情。

    Schönhage-Strassen对于较小的数字来说速度肯定较慢,因此它并不总是一个好的解决方案。在哪方面比说Toom Cook更好可能取决于实际实现。特别是在你选择分界点的地方,超过这个分界点,你只能求助于一个更简单的算法。我不认为面试官会期望你能够实现Schönhagen Strassen。。。老实说,我不认为有很多面试官能够自己完成NTT。简单的二次算法可能已经足够了。当然,这个问题仍然很有趣。这可能取决于不同实现的优化程度。通过实验可以确定最佳范围are@NiklasB. 我认为你应该能够在你的头顶上实现Karatsuba(毕竟这很简单),然后能够解释Toom Cook是如何概括的,对于Schönhage Strassen来说,只要知道它背后的原理就可以了。即使你对S-S了如指掌,你也不可能在一个小时内用Java从头开始实现它。我知道有这样的面试问题,但从40年的软件开发经验来看,我可以告诉你,它们完全无关。基于这些问题的公司会得到他们应得的开发者。这些开发人员可以复制其他人发明的算法,而不需要重新实现。而Karatsuba等背后的概念很难应用于乘法以外的任何东西。+1用于推荐评测!与性能相关的决策始终需要全面的分析。否则就是猜测,而性能猜测在大多数情况下都是错误的。