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

2021-01-14 IT之家

新浪科技訊北京時間5月5日消息,據國外媒體報導,四千年前,巴比倫人發明了乘法,而最近數學家們又對乘法進行了完善,兩位研究人員描述了迄今為止發現的將兩個非常大的數字相乘的最快方法。這篇論文具有重要的意義,標誌著長期以來尋找最高效乘法步驟的努力達到了新的高度。

「基本上,每個人都認為你在學校學習的(相乘)方法是最好的,但實際上這是一個活躍的研究領域,」法國國家科學研究中心的數學家、論文合著者約裡斯·范德霍芬說道。該論文發表在法國的國家開放存取文獻資料庫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)更優雅的極限。

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

肖恩哈格和斯特拉森提出的n×log n×log(log n)方法直到36年後才被取代。2007年,富勒提出了新的方法,閘門打開了。在過去的十年裡,數學家們相繼發現了更快的乘法算法,每一種算法都在一點點逼近n×log n,但都沒有完全達到。最終在上個月,哈維和範德霍芬做到了。

他們的方法主要是對前人工作進行了改進,包括拆分數字,使用改進版的快速傅立葉變換,並利用了過去40年取得的其他進展。範德霍芬說:「我們以更加頻繁的方式使用(快速傅立葉變換),而不是只使用一次,並且用加法和減法取代更多的乘法。」

哈維和範德霍芬的算法證明了乘法可以在n×log n步內完成,但這並不能證明沒有更快的方法。要確定這是可能的最佳方法要困難得多。今年二月底,丹麥奧爾胡斯大學的一個計算機科學家小組發表了一篇論文,認為如果另一個未經證實的猜想也是正確的話,那麼哈維和範德霍芬確實提出了最快的乘法運算方法。

雖然新算法在理論上具有重要意義,但在實踐中還不會帶來太大的變化,因為它只比已有的算法好一點點。「我們所期望的是,這種方法的運算速度能比現在快三倍,」範德霍芬說,「不會太過驚人。」

此外,計算機硬體的設計也發生了變化。20年前,計算機的加法運算比乘法運算快得多。經過過去20年的發展,乘法和加法之間的速度差距已經大大縮小,在一些晶片架構中,乘法甚至可以比加法更快。哈維表示,利用一些硬體,「你實際上可以通過讓計算機做乘法來加快做加法的速度,這簡直太瘋狂了。」

硬體會隨著時代而改變,但一流的算法是永恆的。不管未來的計算機是什麼樣子,哈維和範德霍芬的算法仍然是最高效的乘法算法。

相關焦點

  • 數學家找到了理論上最快的大數乘法算法
    但是將兩個數字相乘,特別當數位超過十億時,那就得可一會兒了。我們從小學裡學到的進位豎式長乘法步驟,對於非常大的數字相乘,會過於費時而無法使用。現在,有來自澳大利亞和法國的兩位數學家表示,他們已經找到了理論上最快的乘法算法。兩人聲稱已經實現了乘法算法的優化上限——這一極限在差不多半個世紀前被首次提出。3月18日HAL文檔檔案網站通報了他們的結果,目前論文尚未通過同行評審。
  • 趣味速算 個位是1的兩個兩位數相乘的簡便算法
    兩個個位是1的兩位數相乘,口算非常簡單,也非常有趣。計算方法是:把十位上的兩個數相乘的積放在第一個因數的前面,把後面那個乘數的十位上的數字加在十位上,結果就是這個兩位數的乘積。例【1】:51×31計算過程:
  • 乘法萬能法 九宮格算法
    乘法萬能法 九宮格算法學過我們的線段樓梯法的同學們,這節課並不陌生!下面請看題目Eg:553×557=?橫著三個格子對應數字分別是5 5 3 ,豎著的格子對應數字分別是5 5 7 。從右邊往左邊畫對稱線。第一步,最右上角的數字3,和豎著的格子右上角數字5相乘,得到的結果是15,填入最右邊的大格子。
  • 數字與數字相乘乘號能省略嗎?
    A觀點:2與括號之間是相乘的關係,只是把乘號省略了而已,按照運算順序,應該先算括號,再算除法,最後算乘法。原式=6÷2×3=3×3=9.B觀點:2(1+2)同2x一樣,是一個整體,應先算2(1+2),原式=6÷6=1.C觀點:用計算器算一下就知道了!在百度中輸入算式,結果顯示是9。
  • 計算機大數乘法引發的思考|CSDN 博文精選
    通俗來講,一個計算的所有步驟就是一個算法,算法的時間複雜度其實就是計算的規模和步驟數量之間的關係。以乘法豎式為例,如果我們將一次十進位一位乘法(即99乘法表的乘法)作為一個步驟,那麼兩個n位乘數相乘需要n的二次方個步驟,其時間複雜度就是O(n2) ,但是如果我們採用某種「巧算」,那麼計算步驟將會大大減少。
  • 《任意兩位數相乘》計算練習——玩數字讓你數學頂呱呱
    這樣的算式,需要有豎式輔助計算,如下面習題類型的第2項《首數相同的兩位數相乘》、第3項《尾數相同的兩位數相乘》、第4項《任意的兩位數乘以同數》。第三個層次,是在計算過程中會出現3個加數。需要先將前兩個加數口算合併,再用豎式輔助計算,如習題類型的第5項《任意的兩個兩位數相乘》。
  • 計算機大數乘法引發的思考 | CSDN 博文精選
    以乘法豎式為例,如果我們將一次十進位一位乘法(即99乘法表的乘法)作為一個步驟,那麼兩個n位乘數相乘需要n的二次方個步驟,其時間複雜度就是O(n2) ,但是如果我們採用某種「巧算」,那麼計算步驟將會大大減少。小學,中學老師教的各種「巧算」技巧,其宗旨都是減少計算量。我們已經承蒙了12年有餘的教誨,現在讓我們進入計算機世界。計算機乘法和我們用豎式計算乘法沒有本質區別。
  • 細數那些改變計算技術的偉大算法
    這種方法被證明,是最有效的編碼方法。由於這種方法簡單、高效,這種方法被用在很多的壓縮方法中比如:DEFLATE(PKZIP壓縮軟體中的算法),以及很多的多媒體編碼包括JPEG和MP3中。密碼學公共秘鑰加密
  • 孩子乘法計算總馬虎,學會這4個速算「竅門」,小學數學少丟分
    很多家長總在我留言下面吐槽,說自家孩子乘法明明會算,但一到考試就粗心大意、總馬虎,於是沒少丟分。結果遇到乘法計算題,孩子越來越沒信心!接下來瑩姨為大家分享幾個乘法速算的竅門,讓孩子輕鬆應對數學考試,以後少丟分,寶媽們快幫孩子收藏起來,學起來吧。一、新豎式算法很多孩子的在算乘法時,會使用列豎式的方法,但一涉及到進位就會忘記。
  • No.3 矩陣乘法
    下面我們考慮兩個矩陣相乘。從數字相乘推廣過來就是無限的可能,我們羅列一下(1)兩個相同維數矩陣相乘         比如:  和相乘,一個很自然的想法就是:對應元素相乘!喔!喔!喔!
  • Cortex―M0單片機二-十進位整數轉換的快速算法
    該快速算法的核心內容是通過高效的彙編語言來實現常數除法,無論在程序代碼的運行時間和存儲空間上,都遠勝於sprintf函數。關鍵詞:Cortex-M0;單片機;二-十進位轉換BCD碼;常數除法;快速算法引言 在單片機應用系統中,一般都需要高效快速地完成系統所需要的任務,並在任務完成後使系統進入睡眠或低功耗狀態,以便最大限度地節省系統功耗,增強系統的抗幹擾能力。
  • 兩位數相乘的內涵,你都了解嗎
    今天跟大家一起研究一下兩位數的乘法,一起去窺探2位數乘法的一些內涵,幫助我們更好的理解和應用2位數的乘法。我們很多同學都對2位數的乘法下過很多功夫,也了解了很多的方法。但是很少有人真正去了解這些方法背後的含義,今天我們就一起來解密一下這些方法背後的內涵。
  • 數學定律 | 乘法交換律、結合律、分配律
    三個數相乘,先把前兩個數相乘,或先把後兩個數相乘,再和第三個數相乘,它們的積不變。它是一種簡算定律,在小學四年級均有涉及。
  • 「快樂」和「樂快」相乘,等於「三個樂」,求它們各自代表哪個數字?
    下面這個乘法算式中,「快」字代表的是一個奇數,即代表1、3、5、7、9中的一個數字。「樂」字代表的是一個偶數,即代表0、2、4、6、8中的一個數字。 如果這個乘法算式成立,它們各自代表的數字都是幾?
  • 多位數乘法速算法,邊扔邊寫,比計算器快
    對於心算速算,人們的理解,大多只停留在電視機中的「某強大腦」節目,一位選手出來,面對屏幕上令人眼花繚亂的大數字,然後從容不迫、飛速在紙上寫出答案。那速度,比正常人按計算器的速度,還要快,觀眾瞠目結舌之間,選手就已經遞交上了正確的答案。許多人因此驚嘆:這心算速算法,太神奇了吧!
  • 任意數乘以9、99、999以及多種方法速算乘法
    在這裡,你會看到,補數在減法中的作用,用好它會非常快速得出結果,熟練掌握後你就再也不會回到傳統方法了。下面帶你多做一些乘法練習,拿過來一本書,不管看到什麼類型,就按自己的方法速算,儘量多想一些思路,看看誰的更簡單。為了顯示人家的方法,我儘量截圖。 1、我覺得上面兩個都不方便,因為還有兩位數相乘,技巧不夠好。
  • 小學數學乘法速算方法專題
    乘法是小學數學中計算問題的重點,熱點,同時,也是困擾許多學生的難點問題,對於個位數乘法,我們可以通過背誦乘法表來解決,但是對於十位數甚至更高位數的乘法,很多同學往往一籌莫展,在計算中要麼計算時間太長要麼出現各類計算錯誤。
  • 小數乘法計算的7大技巧,你都知道嗎?考前衝刺,期末滿分!
    2、幾個因數相乘時,因數中—共有幾位小數,積就有幾位小數。三、積與因數的大小關係一個數(0除外)乘比1大的數,積比原來的數大; —個數(0除外)乘比1小的數,積比原來的數小; 一個數(0除外)乘等於1的數,積與原來的數相等。
  • 8.大數乘法
    在加密及科學計算時,經常需要用到128x128位或256x256位的大整數乘法。
  • 擺渡者速算14 快捷高效的驗算方法:棄九數驗算法
    所以,這期我們先暫時拋開加法的內容,繼續講解棄九法:棄九數驗算法。先明確一個概念:棄九數。所謂棄九數,是指把一個數的各位數字相加,然後棄九,從而得出的數字。注意,如果數位較多,數值較大,則需反覆棄九。棄九數驗算法,就是把加減乘除的結果計算出來後,將等式兩邊的數字轉化為棄九數,如果等式兩邊的棄九數相同,則一般情況下,該計算結果為正確,反之則是錯誤的。一、加法驗算例如:1234+5678=6912驗算過程:1、加數1234各位相加,1+2+3+4=10,棄九後得1。