跳至內容

卡拉楚巴算法

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 15:18 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Karatsuba 算法Karatsuba 乘法卡拉楚巴乘法卡拉楚巴算法(俄語:Алгоритм Карацубы), 是一種快速乘法算法,由一九六空年阿納托利 ・ 阿列克謝呢維奇 ・ 卡拉楚巴提出並且佇一九六二年發表。伊將這兩个 $ n $ 位數字相乘所需要的一位數乘法次數減到上濟 $ 三 n ^ { \ log _ { 二 } 三 } \ approx 三 n ^ { 一爿五八五 } $(若是 $ n $ 是二的所在,愛做拄好的為 $ n ^ { \ log _ { 二 } 三 } $)。 因此伊比欲 $ n ^ { 二 } $ 次個位數乘法的經典算法愛緊。比如講,對兩个一千空二十四位的數相乘($ n=一千空二十四=二 ^ { 十 } $), 卡拉楚巴算法需要 $ 三 ^ { 十 }=五交九千空四十九 $ 次個位數乘法,經典算法需要 $ ( 二 ^ { 十 } ) ^ { 二 }=一百空四石八千五百七十六 $ 次。Toom–Cook 算法是此算法閣較緊的泛型。對充分大的 $ n ( n \ gg 一 ) $,Schönhage-Strassen 做算法甚至閣較緊,算法的時間複雜度做 $ O ( n \ log n \ log \ log n ) $。

價值咧講的是,㧎拉楚巴算法是第一个比小學二擺乘法算法漸漸進快速的算法。

算法

基本步數

㧎拉楚巴算法主要是用佇兩个大數的乘法,真大提高了運算效率,佮普通乘法比較低複雜度,並佇咧其中運用著遞歸的思想。基本的原理佮做法是將位數真濟的兩个大數 $ x $ 和 $ y $ 分做位數較少的數,逐家攏是原來 $ x $ 和 $ y $ 位數的一半。按呢處理了後,簡化為做三擺乘法,閣附帶少量的加法操作佮移位操作。

示例

愛計算一鼻兩千三百四十五佮六千七百八十九的乘積:


一孵兩千三百四十五=十二·_ 一千 _ + 三百四十五


六千七百八十九=六·_ 一千 _ + 七百八十九嘿干焦三个數進行運算的乘法結果:


_ z _ 二=十二 × 六=七十二


_ z _ 零=三百四十五 × 七仔八十九=二十七石兩千兩百空五


_ z _ 一=( 十二 + 三百四十五 ) × ( 六 + 七仔八十九 ) − _ z _ 二 − _ z _ 零=三仔五十七 × 七仔九十五 − 七十二 − 二十七石兩千兩百空五=二十八學三千八百十五 − 七十二 − 二十七石兩千兩百空五=一爿一千五百三十八葩將三部份結果相加並相應地移位:


結果=_ z _ 二·( _ B _ m ) 二 + _ z _ 一·( _ B _ m ) 一 + _ z _ 零·( _ B _ m ) 零 , i . e .


結果=七十二 ・ _ 一千 _ 二 + 一孵一千五百三十八·_ 一千 _ + 二十七石兩千兩百空五=八千三百八十一孵空兩百空五 .

注意:中央第三擺乘法運算的輸入域小於前兩擺乘法的兩倍,其實輸出域較細佇前兩擺乘法的四倍,並且基數為一千的進位是根據前兩改的乘法計算的,佇咧計算這兩个減法的時著愛考慮。

實現

偽代碼實現

Python 代碼實現

參考文獻

  • Karatsuba's Algorithm for Polynomial Multiplication
  • 埃里克 ・ 韋斯坦因為 . Karatsuba Multiplication . MathWorld .
  • Bernstein , D . J . , " Multidigit multiplication for mathematicians " . Covers Karatsuba and many other multiplication algorithms .

外部鏈接

  • 卡拉楚巴多項式乘法算法
  • 埃里克 ・ 韋斯坦因為 . Karatsuba Multiplication(卡拉楚巴乘法). MathWorld .
  • Bernstein , D . J . , " Multidigit multiplication for mathematicians " . Covers Karatsuba and many other multiplication algorithms .