最高效的乘法:迄今最快計算兩個非常大的數字相乘的算法!

2021-03-01 新浪探索

  

四千年前,巴比倫人發明了乘法,而最近數學家們又對乘法進行了完善,兩位研究人員描述了迄今為止發現的將兩個非常大的數字相乘的最快方法。這篇論文具有重要的意義,標誌著長期以來尋找最高效乘法步驟的努力達到了新的高度。

  

「基本上,每個人都認為你在學校學習的(相乘)方法是最好的,但實際上這是一個活躍的研究領域,」法國國家科學研究中心的數學家、論文合著者約裡斯·范德霍芬說道。該論文發表在法國的國家開放存取文獻資料庫Archive ouverte HAL(https://hal.archives-ouvertes.fr/hal-02070778/document)上。

  

從計算圓周率的新位數到尋找大質數,許多計算問題的複雜性都可以歸結為乘法運算的速度。按照範德霍芬的描述,他們的研究結果其實是為許多其他類型的問題的求解速度設定了一種數學極限。

  

「在物理學中,有一些重要的常數,比如光速,可以用來描述各種現象,」範德霍芬說,「如果你想知道計算機解決某些數學問題的速度能有多快,那麼就可以將整數乘法視為某種基礎,你可以用它來表示這些速度。」

  

大多數人都用同樣的方法學習乘法。我們把兩個數分兩排寫,用下面數字的每一位乘以上面數字的每一位,最後排列好再做加法。如果是兩個兩位數的數相乘,那你一共要做四個較簡單的乘法來得到最終的乘積。

  

這種小學中所教的方法或稱「進位」法需要n^2個步驟,其中n是每個相乘數字的位數。所以3位數需要9次乘法,而100位數需要10000次乘法。

  

這種進位法適用於只有幾個位數的數字,但是當我們將具有數百萬或數十億位數的數字相乘(比如計算機精確計算圓周率,或者尋找大型質數)時,這種方法就會陷入停滯。兩個10億位數的數字相乘需要運行10^18次(10億的平方)的乘法——這將花費現代計算機大約30年的時間。

  

幾千年來,人們普遍認為沒有更快的相乘方法。1960年,23歲的俄羅斯數學家安納託利·卡拉蘇巴參加了由20世紀最偉大數學家之一的安德烈·科爾莫戈羅夫主持的研討會。柯爾莫戈羅夫在會上斷言,沒有少於n^2個步驟的通用乘法過程。卡拉蘇巴認為並非如此。經過一周的努力,他找到了更快進行乘法運算的新方法。

  

卡拉蘇巴的方法涉及將數字按數位分解,並以一種新穎的方式重新組合它們,允許使用少量的加法和減法替換大量的乘法。該方法可以節省時間,因為加法只需2n步,而不是n^2步。

  

「如果用加法的話,你可以在學校裡提早一年就使用這一方法,因為它容易得多。你可以連續地相乘,幾乎就像從右到左閱讀數字一樣快,」賓夕法尼亞州立大學的數學家馬丁·富勒說道。他在2007年建立了當時最快的乘法算法。

  

當處理大數時,你可以重複卡拉蘇巴的過程,將原始數字分解為幾乎與數位同樣多的部分。每進行一次拆分,就可以用加法和減法來代替乘法,從而減少很多步驟。澳大利亞新南威爾斯大學的數學家、這篇新論文的合著者大衛·哈維說:「你可以把一些乘法轉化為加法,重點在於,對電腦來說,做加法的速度會更快。」

  

卡拉蘇巴的方法使得僅使用n^1.58個一位數乘法就可以進行大數的相乘。然後在1971年,德國數學家阿諾德·肖恩哈格和沃克爾·斯特拉森發表了一種方法,可以在n×log n×log(log n)個步驟內完成的大數乘法,其中log n是n的對數。對於兩個10億位數的數字,卡拉蘇巴的方法需要大約額外運算165萬億個步驟。

  

肖恩哈格和斯特拉森的方法主要是關於計算機如何運算大數乘法,對未來的研究產生了兩個重要的長期影響。首先,該方法引入了一種來自信號處理領域的技術,即快速傅立葉變換。該技術一直是所有快速乘法算法的基礎。

  

其次,在同一篇論文中,肖恩哈格和斯特拉森推測應該有一種更快的算法,一種只需要n×log n個單位數運算的方法,而且這種算法可能是最快的。他們的推測基於一種直覺,即像乘法這樣的基本運算必須有一個比n×log n×log(log n)更優雅的極限。

  

「人們普遍認為,乘法運算是一項非常重要的基本運算,以至於從美學的角度來看,這麼重要的運算需要一個很好的複雜度邊界,」富勒說,「從一般經驗來說,基本事物的數學最終總是優雅的。」

 

相關焦點

  • 最高效的乘法:兩個非常大的數字相乘迄今最快算法
    四千年前,巴比倫人發明了乘法,而最近數學家們又對乘法進行了完善,兩位研究人員描述了迄今為止發現的將兩個非常大的數字相乘的最快方法。這篇論文具有重要的意義,標誌著長期以來尋找最高效乘法步驟的努力達到了新的高度。
  • 人類用四千年碰到乘法運算天花板:史上最快乘法算法誕生
    而歷史上,數學家也在不斷簡化乘法的步驟,直到上個月,兩位數學家發表了迄今步驟最簡潔的乘法運算方法。乘法是數學中最基本的運算方式之一,長期以來,科學家都致力於尋找最高效的乘法運算方式,該研究成果的出現標誌著數學家在此方面的探索到達了一個新的高度。   「大家可能會覺得,自己在學校學到的計算方法就是最佳的那種,但事實上,科學家一直都在繼續優化數學運算方法,」法國國家科學研究中心的數學家Joris van der Hoeven說道,他是論文的共同作者。
  • 乘法的完美算法是什麼?數學家可能才剛剛找到答案
    現有的方法雖然簡單且看似高效,但它卻不適用於極度大的數字,例如那些超過十億位的數字。無論是計算圓周率還是尋找大的質數,其中所涉及的計算問題的複雜性歸根結底都源自於乘法的速度。
  • 「史上最快乘法算法」太快了!發明者正在想怎麼讓它「慢」下來
    數學家們找到了一種更快的方法來計算乘法,但是它適用的數字極其龐大,需要經過改進才能得到實際應用,用於計算「僅有」數十億位的數字。長乘法還真是一種漫長的算法呢。例如,運用 Karatsuba 的方法,將兩個四位數相乘只用做 9 次乘法,而不是 42 = 16 次。他的方法在位數翻倍時工作量只增至三倍,與傳統方法相比,在數字更大時展現了巨大的優勢。對於 1000 位的數字,Karatsuba 的方法需要的乘法運算次數只有長乘法的大約 17 分之一。但究竟為什麼要把這麼大的數字相乘呢?
  • 「史上最快乘法算法」太快了,發明者正在想怎麼讓它「慢」下來
    1960 年,23 歲的俄羅斯數學系學生 Anatoly Karatsuba 發現了一種代數技巧,能夠減少需要相乘的次數。例如,運用 Karatsuba 的方法,將兩個四位數相乘只用做 9 次乘法,而不是 42 = 16 次。他的方法在位數翻倍時工作量只增至三倍,與傳統方法相比,在數字更大時展現了巨大的優勢。
  • 數學家找到了理論上最快的大數乘法算法
    但是將兩個數字相乘,特別當數位超過十億時,那就得可一會兒了。我們從小學裡學到的進位豎式長乘法步驟,對於非常大的數字相乘,會過於費時而無法使用。現在,有來自澳大利亞和法國的兩位數學家表示,他們已經找到了理論上最快的乘法算法。兩人聲稱已經實現了乘法算法的優化上限——這一極限在差不多半個世紀前被首次提出。3月18日HAL文檔檔案網站通報了他們的結果,目前論文尚未通過同行評審。
  • 趣味速算 個位是1的兩個兩位數相乘的簡便算法
    兩個個位是1的兩位數相乘,口算非常簡單,也非常有趣。計算方法是:把十位上的兩個數相乘的積放在第一個因數的前面,把後面那個乘數的十位上的數字加在十位上,結果就是這個兩位數的乘積。例【1】:51×31計算過程:
  • 2名數學家或發現史上最快超大乘法運算法
    上個月,兩位數學家發表的論文指出,他們發現了至今大數字之間計算速度最快的乘法運算。乘法是數學中最基本的運算方式之一,長期以來,科學家都致力於尋找最高效的乘法運算方式,該研究成果的出現標誌著數學家在此方面的探索到達了一個新的高度。
  • 最快大數乘法運算
    最近,兩位研究人員有可能發現有史以來最快的計算兩個超大數的乘法運算方式。這篇論文的誕生,也意味著數學界最基本的運算方式又有了更新更有效的運算過程,有望破解了一個已經存在近半個世紀的數學問題。將兩個乘數排成兩行,用下面的乘數中的每一位數字分別去乘以上面的乘數的每一位數字,然後將所有的相乘結果相加。比如說,如果是兩個兩位數的乘法運算,你需要進行四次兩個一位數的相乘,然後將這四個相乘的結果相加。
  • 為孩子乘法發狂的家長有福了!2數學家或發現史上最快超大乘法運算法【中國科訊】
    早在數千年之前,巴比倫人就已經發明了乘法。而就在上個月,數學家們又對這一運算方式進行了優化,使它越來越完美。近日,兩位研究人員有可能發現有史以來最快的計算兩個超大數的乘法運算方式。這篇論文的誕生,也意味著數學界最基本的運算方式又有了更新更有效的運算過程,有望破解了一個已經存在近半個世紀的數學問題。
  • 【CODE】大數相乘的KaraTsuba算法
    上一次寫了大數求和的代碼,從原理上來看,只需要用小學數學就可以解決了,大數相乘也一樣可以用小學數學的豎式乘法來解決,但是除此之外還有更好的方法。
  • 2名數學家或發現史上最快超大乘法運算法,欲破解困擾人類近半個世紀的問題
    3 月 18 日,兩位研究人員有可能發現有史以來最快的計算兩個超大數的乘法運算方式。這篇論文的誕生,也意味著數學界最基本的運算方式又有了更新更有效的運算過程,有望破解了一個已經存在近半個世紀的數學問題。
  • Python 實現大整數乘法算法
    介紹原理karatsuba 算法要求乘數與被乘數要滿足以下幾個條件,第一,乘數與被乘數的位數相同;第二,乘數與被乘數的位數應為  2 次冪,即為 2 ^ 2,  2 ^ 3, 2 ^ 4, 2 ^ n 等數值。下面我們先來看幾個簡單的例子,並以此來了解 karatsuba 算法的使用方法。兩位數相乘我們設被乘數 A = 85,乘數 B = 41。
  • 《任意兩位數相乘》計算練習——玩數字讓你數學頂呱呱
    這樣的算式,需要有豎式輔助計算,如下面習題類型的第2項《首數相同的兩位數相乘》、第3項《尾數相同的兩位數相乘》、第4項《任意的兩位數乘以同數》。第三個層次,是在計算過程中會出現3個加數。需要先將前兩個加數口算合併,再用豎式輔助計算,如習題類型的第5項《任意的兩個兩位數相乘》。
  • 10億位超級大整數相乘僅需30秒,半個世紀的猜測終被證明
    近日,該猜測終於被實現:2個10億位超級大整數相乘,僅需30秒!   超級大整數相乘極限速度實現了!   整數相乘是每個人必學的一個運算,我們通常採用的思路是:第一個數字的n位乘以第二個數字的n位,這就意味著要進行n2次的乘法運算。但當這兩個整數大到一定程度時,這個過程的計算量是相當龐大且驚人的。
  • 細數那些改變計算技術的偉大算法
    在過去,很多巧妙的計算機算法設計,改變了我們的計算技術。通過操作標準計算機中提供的中間運算符,可以產生很多的高效函數。這些函數導致了電腦程式的複雜性和多樣性,這也是今天計算機時代快速發展的重要原因。如下所示,我們列舉了一些算法,它們改變了我們的計算機使用。
  • 多項式乘法、十字相乘法與三位數的乘法
    十字相乘法的實質是多項式的乘法,一個三位數也可以寫成多項式的形式,所以兩個三位數的乘法,可以利用多項式的乘法橫向展開來做,還可以利用十字相乘法列豎式劃十字來做。本文只是在初中學過多項式乘法和十字相乘法之後,回頭再驗證小學數的乘法法則的正確性,以及多項式的乘法與十字相乘法在具體應用方面做一點探討,給學生和數學愛好者提供一個看問題的視角,絕無意取代小學所學的方法,特此說明。
  • 數字與數字相乘乘號能省略嗎?
    A觀點:2與括號之間是相乘的關係,只是把乘號省略了而已,按照運算順序,應該先算括號,再算除法,最後算乘法。原式=6÷2×3=3×3=9.為什麼即使是計算器,計算結果也不一樣呢?因為計算器只是按照固定程序來運行,如果定義「數字與括號」只是省略數字的乘法,按照運算順序就只能是先算除法後算乘法,得數就是9;如果定義數字與括號的優先級高於乘除法,得數就是1.因為該型號卡西歐計算器默認省略乘號的乘法優先級高於一般的乘除法,所以得數是1.
  • 計算機大數乘法引發的思考|CSDN 博文精選
    通俗來講,一個計算的所有步驟就是一個算法,算法的時間複雜度其實就是計算的規模和步驟數量之間的關係。以乘法豎式為例,如果我們將一次十進位一位乘法(即99乘法表的乘法)作為一個步驟,那麼兩個n位乘數相乘需要n的二次方個步驟,其時間複雜度就是O(n2) ,但是如果我們採用某種「巧算」,那麼計算步驟將會大大減少。
  • 小姐姐帶你學習算法,不信你還學不會
    為什麼要學算法有以下好處:算法對計算機科學的所有分支都重要: 想要完成實質性工作,理解算法的基礎知識並掌握算法密切相關的數據結構知識是必不可少的。算法是技術革新的推動力: 一個例子是搜尋引擎使用一系列算法高效的計算與特定搜索項相關聯的各個web頁面出現的頻率。