两个n位数字相乘最快的算法是什么?


21

我想知道哪种算法最快的是两个n位数字的乘法?空间复杂性可以在这里放松!


1
您对理论问题还是实际问题感兴趣?
Yuval Filmus 2013年

两者都有,但更倾向于实用的一种!
安迪

1
对于实际问题,我建议使用GMP。如果您对它们的用途感到好奇,请查看文档或源代码。
Yuval Filmus

没人知道。我们还没有找到。
JeffE

Answers:


22

到目前为止,MartinFürer的Fürer算法的时间复杂度为,它对复数进行傅立叶变换。他的算法实际上基于Schönhage和Strassen算法,其时间复杂度为Θ(n \ log(n)\ log(\ log(n)))nlog(n)2Θ(log(n))Θ(nlog(n)log(log(n)))

比年级乘积算法更快的其他算法是Karatsuba乘法,其时间复杂度为O(nlog23) ≈O O(n1.585)和Toom 3算法,具有时间复杂度的Θ(n1.465)

请注意,这些是快速算法。寻找最快的乘法算法是计算机科学中的一个开放问题。

参考文献:

  1. 菲勒算法
  2. 基于FFT的大数乘法
  3. 快速傅立叶变换
  4. Toom–Cook乘法
  5. Schönhage–Strassen算法
  6. Karatsuba算法

请注意D.Harvey和J.van der Hoeven(2019年3月)最近的一篇论文,该论文描述了复杂度的算法。O(nlnn)
hardmath

9

请注意,avi列出的FFT算法会 添加一个大常数,因此对于少于千位以上的数字,它们是不切实际的。

除了该列表之外,还有一些其他有趣的算法和未解决的问题:

  • RAM模型上的线性时间乘法(带预计算)
  • 与常数的乘积是次线性的 PDF)-这意味着次线性的加法数总共为位复杂度。从本质上讲,这等效于长乘法(其中,小数乘以s的数量进行移位/加法)为,但具有加速。O(n2logn)1O(n2)O(logn)
  • 残数系统和其他数字表示形式;乘法几乎是线性时间。缺点是,乘法是模块化的,{溢出检测,奇偶校验,幅度比较}的难度或几乎与将数字转换回二进制或相似表示并进行传统比较一样困难;这种转换至少与传统乘法(目前称为AFAIK)一样糟糕。
    • 其他表示形式:
      • [ 对数表示 ]:乘法是对数表示的加法。例如:
        16×32=2log216+log232=24+5=29
        • 不利的一面是,对数表示形式的转换可能很难进行乘法运算,也可能更困难,对数表示形式也可以是分数/无理/近似等。其他运算(加法)可能更困难。
      • 规范表示:将数字表示为素因式分解的指数。乘法是指数的加法。例如:
        36×48=3251×223141=22324151
      • 缺点是,需要因数或因式分解是一个比乘法困难得多的问题。其他操作(例如加法)可能非常困难。

1
我相信,具有正确模数的基于余数/中国余数定理的方法即使转换回来也可以导致比传统乘法更快。在某些时候,这是在TAOCP的第4章中,至少是作为脚注。(它仍然不接近基于FFT的方法,但这是一个有趣的历史记录)
Steven Stadnicki

@StevenStadnicki哦,很酷,那我需要看一下;你碰巧知道复杂性吗?
Realz Slaw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.