㈠ 神奇的乘法(四)
最最平常的乘法,也是一種卷積。
例如,計算 123×456,可以這樣做:
製作如圖的兩個滑塊,123豎著往下寫,456倒著往上寫。
然後,讓456從123的旁邊滑下來。
每滑動一格,都把兩個數重疊的部分進行點積運算,結果記錄下來。每次結果的個位向後移動一位。
當滑動結束以後,把那些結果加起來,即可。
這種運算就是卷積的直觀展示。
類比乘法的卷積方法,可以定義兩個序列的乘積。讓一個序列從另一個序列旁邊滑過,形成很多的點積,把這些點積加起來,得到序列積。
序列可以是有限的,也可以是無限的。
無限的序列可以有生成函數,生成函數,就是類似對等比數列求和的結果。用那結果,就可以生成等比數列。
序列乘積的時候,一個序列可以轉化成向量,另外一個轉化為矩陣。用矩陣,意味著乘法不可交換。
卷積常用在傅立葉分析。
印度乘法,是指普通的數字乘法,特別的地方有兩處。
格子乘法最早記載在1150年印度數學家婆什迦羅的《麗羅娃提》一書,後來傳到阿拉伯,再後來傳到歐洲,由義大利人傳到中國,中國數學家程大位給起了個好聽的名字,叫「鋪地錦」。
但中國人還是習慣用珠算,用「一口清」來計算乘法。
中國傳統的大九九乘法口訣,只是把普通的小九九擴充一倍,例如「三九二十七」成為兩句口訣「三九二七」與「九三二七」。而印度的大九九則更大,要求背誦所有的兩位數乘以兩位數,背誦以後,計算速度無疑會大大提升。
當然,背誦是有技巧的。不是單純的死記硬背。例如十幾乘以十幾,方法就是,把乙的個位數加在甲的末尾,添零,再加上兩數個位與個位相乘,得結果。
例如:18×13,(18+3)=21,添零以後是210,個位乘積是8×3=24,結果就是210+24=234。
俄羅斯農民的乘法,直觀思想十分樸素,舉個特殊例子來看:
16×17=8×34=4×68=2×136=1×272=272
指導思想就是,不斷的把被乘數減半,把乘數加倍,直到被乘數變為1,結果就出來了。
上面的例子,碰巧被乘數減半的過程中,一直是偶數,如果是奇數,怎麼辦呢?如果是奇數,就單獨記錄下那一步的乘數,把被乘數減一,繼續運算,在最後,把記錄的結果加上去即可。
例如:
35×37
=34×37+37
=17×74+37
=16×74+74+37
=8×148+111
=4×296+111
=2×592+111
=1×1184+111
=1295
這種運算,表面上看,步驟很多,很笨拙。但正應了中國的古訓「大巧若拙」,其實這種演算法,是極其迅速的。尤其到了計算機的時代,到了二進制的時代。
俄羅斯農民的演算法,可以用極快的速度完成大數的乘法。所謂大數,就是幾百位或者幾千位的數字相乘。
用普通的乘法是很慢的,要做多次的乘法和加法,復雜程度一般是N的平方;而俄羅斯農民演算法的復雜度是N×(log N)。因此,是及其迅速的。並且,計算機中,除以2或者乘以2,很多時候是不需要計算的,只需要移動一位,因為計算機經常使用2進制。
俄羅斯農民演算法可以擴展為使用4進制,16進制都可以,64進制等都可。
在大數乘法中,能比俄羅斯農民的乘法更快的演算法並不多。
離散傅立葉變換,可以用來計算乘法。
但如果不是快速傅立葉變換,復雜度仍然是N的平方。
如果用快速傅立葉變換,就可以超越俄羅斯農民演算法。
僅僅因為,傅立葉變換應用太廣泛,人們針對傅立葉變換,研究了各種快速演算法,使得快速傅立葉變換可以達到N(log N)的復雜度。
本質上講,快速傅立葉變換的速度並沒有超過俄羅斯農民的演算法。僅僅因為,它已經有了各種成熟的庫,各種優化的演算法,因此,應用更廣泛,就得到更多的優化,速度更快了。
如果對俄羅斯農民演算法進行適當的優化,也可以達到快速傅立葉變換的速度。
日常如果要做大數乘法,用俄羅斯農民演算法足矣。如果有更高的要求,可以用GNU的庫函數,其中各種演算法的實現都有,尤其是用快速傅立葉變換來計算乘法。
大數的乘法有什麼用處呢?一般的,還真沒什麼用處。無聊的時候,可以把圓周率計算個幾萬位,就只有這種用處。
而幾萬位的圓周率,本身就沒有什麼用處。50位以內的小數,足夠地球上的天文學家和物理學家用了。
大數乘法的其它用處包括:彰顯科技,比拼電腦的計算速度,RSA加密,破解RSA加密等。
傅立葉變換怎樣做乘法,以及為什麼能做乘法,需要專門來討論。
在沒有計算器的年代裡,三角函數專門有一個表,叫做三角函數表。已知角度,可以查詢三角函數值。已知三角函數值,如正弦值,也可以查到角度。
利用這個表,可以進行乘法運算。把需要相乘的兩個數字,通過適當的移位,變成三角函數可以表示的范圍。然後查到對應的兩個角度,用積化和差公式來計算。最後,對結果重新移位恢復。
例如,計算 4766×8848
先變成 0.4766×0.8848,
然後假設這是兩個角度的正弦,查表的到兩個角度:
28.463575度
62.22692度
根據公式
sinA × sin B = [cos (A-B) - cos(A+B)]/2
需要查計算:
兩個角度的差是33.763344度,差表得餘弦為 0.83134;
兩個角度的和是90.6905度,差表得餘弦為 -0.01205;
兩者做差,平均以後,為0.421695。
按照這個結果,移位,原來乘積就是 42169500。
實際上,前面的部分都很精確,只有最後兩位不同。
真實的結果是42169568。
在精確程度允許的情況下,足夠了。
關鍵是,這種方法,只用加減法來計算乘法。
對數非常神奇,甚至可以說吊詭:
對數最自然的底,竟然就是自然對數底。一開始,人們各種嘗試,就使得底非常接近自然對數底。
自然對數底,無疑是神秘的,歐拉對此剖析的最透徹,關於e的故事,三天三夜也說不完。
後來,有了常用對數,對數用來做乘法就更方便了。
外國人,有一種精神,是我們所沒有的:在沒有對數表格的情況下,他們可以經過幾代人的努力,來編制長長的表格,做這樣的苦功,枯燥且乏味。然後印刷下來,供大家使用,世界人民共享勞動成果。在有了表格的情況下,他們又嘗試發明各種儀器,來簡化運算,終於把計算尺,計算器和計算機搞出來了,還是大家都能用。這里,既有厚德載物的精神,又有自強不息的精神。
我們,卻還在培養珠心算,用「一口清」這些高端乘法技術。盡量的,連筆和紙都不使用,來完成計算。這些技術,只能適用於少數有天賦的兒童,而且要經過辛苦的訓練才能掌握。並且,這種技能的傳承非常困難。並且,如果不經常使用,很快就會退化。
有工具,為什麼不用呢?人類最高超的技能,不就是製造和使用工具嗎?其實,根本不用擔心加減乘除的技能退化。
現在,沒有多少人會手動開平方。加減乘除並不比開平方重要。所以,就算大多數人不懂口算,也沒什麼關系。
能機械運算的,就用機械運算。能查表的,就查表。這樣,才是真正的解放生產力,發展生產力。
數學需要運算。但運算不是數學的本質。
我們常常嘲笑外國人太笨,但他們才是真正的大智若愚啊!他在菜市場或者超市不會口算,是因為他們不需要計算,所以不需要會算。
中國古人,鄙視會算術的人,認為這些是屬於底層人民的東西。屬於「奇擠淫巧」一類。上層社會的人完全不懂得算術。這樣的做法似乎也不妥。
理想的狀態應該是:不同職業的人都得到應有的尊重,有體面的收入。職業平等,不分高低貴賤。