Karatsuba's Algorithm Karatsuba 算法

1 復數乘法

假如現在有兩個復數:
a*i + bc*i + d
則,兩個復數相乘,則是:
(a*i + b) * (c*i + d)
= (ac - bd) + (cb + ad)i
也就是說,共需要計算
4次乘法,3次加法

2 一個更好的方法:

  1. 計算a*c
  2. 計算b*d
  3. 計算(a+b)*(c+d)
  4. 結合1和2,得到 ac - bd
  5. 結合1,2,3,得到ad + bc

共需要:
3次乘法,5次加法

3 用于計算整數相乘:

如計算5822*4104:
5822 = 5 * 1000 + 822
4104 = 4 * 1000 + 104

  1. computea*c = 5*4 = 20;
  2. compute b*d = 822*104 = 85488;
  3. compute (a+b)*(c+d) = (5+822)*(4+104) = 89316;
  4. ac+bd = 20 + 85488 = 85508;
  5. ad + bc = (a+b)*(c+d)-a*c-b*d = 89316 - 85488 - 20 = 3808;
  6. (ac)*(i*i) + bd + (ad+bc)i = 20*1000*1000 + 85488 + 3808*1000 = 23893488
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 今天我們談談一個“土豪”算法——Strasen矩陣算法之說以說它“土豪”就是因為其帶來了巨大的空間開銷。先來考察一...
    LRC_cheng閱讀 1,584評論 0 1
  • 問題大數相乘 計算123×456,其實12345和6789就是大數。 思路 這是分治算法思想的典型體現。計算機只會...
    Stroman閱讀 2,706評論 0 2
  • 將原問題分解為一組子問題,每個子問題都與原問題類型相同,但是比原問題的規模小 遞歸求解這些子問題 將子問題的求解結...
    芥丶未央閱讀 1,422評論 2 1
  • 普通大數乘法 普通大數乘法模擬兩個數字豎式相乘,為了方便操作,數字的個位在數組的第0位,時間復雜度為O ( n2 ...
    Gitfan閱讀 960評論 0 0
  • 引論 算法與數據結構與程序的區別算法是求解問題的過程描述:從蠻力到策略數據結構是數據的組織與存儲:從雜亂無章到井然...
    FakeCSer愛去網吧閱讀 1,955評論 0 3