Karatsuba算法(更快的乘法)

Karatsuba算法(更快的乘法)

25*63

传统的算法:

A:20*60 B:5*3 C:20*3 D:60*5       答案E=A+B+C+D=1575

Karatsuba算法

A:将乘数拆分成几个部分

25------2  5

63------6  3

B:将每个乘数的十位数彼此相乘

2*6=12

C:将每个乘数的个位数彼此相乘

5*3=15

D:将每个乘数的十位数和个位数相加

2+5=7

6+3=9

E:将上一步的相加结果相乘

7*9=63

F:用e步得到的结果去减b和c的步骤的结果

63-15-12=36

G:将上面的b,f,c的结果按照一定的秩序排列好,然后相加

                  12

               +    36

               +      15

              =   1575

后者看似步骤比较多,但其优势在特大数相乘时就显现出来了,主要体现在节省个位数之间相乘的次数上:当乘数的位数很多时,可以重复进行 Karatsuba过程,将原来的乘数拆分成更小的部分。所进行的拆分的次数越多,相比传统算法,你就节省了越多次个位数之间的相乘。

宾夕法尼亚州立大学数学家 Martin Fürer 说道:“另外,比起竖式计算方法,你可以在学校里提前一年学会这种方法,因为这种方法更容易,你可以在线性的时间内快速完成运算,这几乎和从右到往左阅读数字一样快”。Martin Fürer 在 2007 年也创造了当时世界上最快的乘法算法。在处理大数乘法时,可以重复进行 Karatsuba 过程,将原始数字拆分为几乎与数字的位数一样多个部分。通过每一次拆分,你都可以将本需要许多许多次的乘法以需要的运算次数少的加法和减法来替代。新南威尔士大学的数学家,同时也是这篇新论文的共同作者之一 David Harvey 说:“Karatsuba 算法可以把一些乘法变成加法,而对于计算机来说加法会更快。”使用 Karatsuba 的方法,可以达到在 n 的 1.58 次方次个位数的乘法后,完成两个 n 位数的乘数之间的相乘。然后在 1971 年,Arnold Schönhage 和 Volker Strassen 发表了一种能够以 n×log n×log(log n)次个位数的相乘来完成大数相乘方法,其中 log n 是 n 的对数。而利用 Karatsuba 的方法进行两个 10 亿位数字之间的相乘时,则大约需要 165 万亿个额外的步骤.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章