传统的乘法运算方法
这种方法需要大约n2步完成乘法计算,其中n是乘数的位数。 因此,三位数字需要9次乘法,而100位数字需要10000次乘法。因此该方法只适用于位数少的数字,但对于数百万或数十亿的数字就不那么方便了。如果要将两个十亿位的数字相乘,则需要进行1018次乘法计算,即使是现代计算机不停歇地工作都大约需要30年才能完成。
几千年来,人们普遍认为已经不存在更快的乘法运算方式。1960年,23岁的俄罗斯数学家Anatoly Karatsuba参加了由20世纪伟大的数学家之一柯尔莫果洛夫领导的研讨会。会上柯尔莫果洛夫断言,n2是乘法运算所需最少的步骤,不存在更快的运算方式。但Karatsuba认是有更快地乘法运算方式的,并且经过一周的探索就发现了它。
Karatsuba算法
Karatsuba的方法尝试对数字的位数进行分解并重新组合,运用这种方式时,可以用少量的加法和减法代替大量的乘法。该方法节省了时间,因为完成加法计算时仅需2n步,而不是n2步(n同样代表数字的位数)。
“如果用加法替代乘法的话,你甚至可以在上学前就使用这种方法,因为它更容易,你可以连续地完成,几乎像从右到左阅读数字一样快,”宾夕法尼亚州立大学数学家MartinFürer说道,他在2007年创造了当时最快的乘法算法。
处理大数字时,你可以重复Karatsuba的过程,将原始数字拆分成与位数一样多的部分。每次拆分,都可以用加法和减法替换掉乘法,这会节省很多步骤。Karatsuba的方法可以将乘法运算步骤减少至n1.58次。新南威尔士大学的数学家,新论文作者David Harvey说:“把一些乘法转变成加法后,计算机会运算得更快。”
大数相乘下两种方法的比较
乘法步骤不断更新
1971年,ArnoldSchönhage和Volker Strassen发表了一种能在n×log n×log(log n)个步骤以内完成的大数乘法。如果是两个10亿位数字相乘,和这种新方法相比,Karatsuba的方法大约需要多运算165万亿个步骤。
Schönhage和Strassen的大数乘法,对未来的研究提供了两个长远的影响。 首先,它引入了信号处理技术中被称为快速傅立叶变换的方法,该技术一直以来都作为快速乘法算法的基础。
其次,在当时Schönhage和Strassen推测应该还会有一个更快的算法,一种只需要n×log n单位数乘法的方法,并且这种算法可能会是最快的。他们推测,一定存在某种像乘法本身那样基础的运算,会比n×log n×log(log n)更简洁。
“乘法的基础性与重要性无需多言,从美学的角度来说,如此重要的运算方法终会从复杂走向简单”Fürer说。“一般经验来看,数学运算到最后都会变得简洁。”
就这样,Schönhage和Strassen提出的 n×log n×log(log n)方法持续了36年。2007年,Fürer超越了它并打开了新的大门。而在2007年至今的十几年中,数学家也相继地发现了更快的乘法算法,且每个算法都接近n×log n,但又没有完全达到它。终于在上个月,Harvey和van der Hoeven做到了。
他们的方法总的来说是对之前工作进行了改进。包括拆分数字,使用快速傅立叶变换的改进版本,并综合了过去40年各种研究的长处。“我们更频繁地使用快速傅里叶变换,不再是只使用一次,并用加法和减法代替