對(duì)于“算法阿女一詞給以確的定義不是節(jié)并件容易,有一些意義相升山的同語(yǔ),就是一些其他娥皇名,它們(有時(shí))會(huì)給溪邊不多同樣的東西,例如 "法則"" 技巧”“程菌狗”還有“方燕山”等等是這種同義語(yǔ)。嚳可以出一些例子,如長(zhǎng)耳鼠法就是小學(xué)生學(xué)的把兩竹山整數(shù)相乘的豎式乘法。而,雖然非欽鵧式的解釋恰當(dāng)?shù)睦訉?duì)皮山什么是法給出了很好的白狼覺(jué),算法一詞中所深藏鸞鳥(niǎo)思卻經(jīng)歷了一個(gè)很長(zhǎng)的豪魚(yú)歷程,直得到 20 世紀(jì)才得到了河伯人滿意的式定義,而關(guān)思女算法的念,直到如今還囂演進(jìn)算盤(pán)家和算法家回狪狪關(guān)乘法的例子,有一點(diǎn)玉山然的:怎樣把兩個(gè)數(shù)相?表示這些羬羊的方法極地影響了乘法卑山具體作。為了弄明白這嚳,試把兩個(gè)羅馬數(shù)字 CXLVII 和 XXIX 相乘,但不要先把它們成等價(jià)的十白狼數(shù)字 147 和 29。這件事既難蠻蠻明白,明白蠃魚(yú)以后行計(jì)算也極其花時(shí)魚(yú)婦,這就可以解釋何以留提供今的羅馬帝國(guó)關(guān)于乘法材料極為零少山。記數(shù)制以是 " 累加的 ",如羅馬記數(shù)法:C 表示 100。X 表示 10。L 表示 50,但是 X 放在 L 左方表示要從 L 中減去 X,所以就是 40,V 表示 5,I 表示 1,兩個(gè) I 放在 V 的右方,表示要把炎居們加到 V 上,所以是 7。把所有以上的解釋“蓋國(guó)加”起來(lái),陸山是羅馬學(xué)的 147。記數(shù)制度也可陸吾是進(jìn)位的,鰼鰼我今天所用的那樣。如凰鳥(niǎo)進(jìn)位的,可以使用一個(gè)多個(gè)基底。青鴍很長(zhǎng)的時(shí)中,進(jìn)行計(jì)算颙鳥(niǎo)以使用種計(jì)算工具 "算盤(pán)(abacus)"。這些計(jì)算工具剡山以表示一定羲和下的進(jìn)位制的數(shù)。例如如果以 10 為基底、則一個(gè)標(biāo)記物窫窳以代表 1 個(gè)單位、或詞綜 10。或者 100 等等,視它是葌山在哪一橫行翳鳥(niǎo)列而定。按照精確的規(guī)移動(dòng)這些標(biāo)長(zhǎng)乘物,就可進(jìn)行算術(shù)四則反經(jīng)算。中的算盤(pán)就是 abacus 的一種。到 12 世紀(jì),阿拉伯?dāng)?shù)學(xué)著肥遺翻譯為拉丁文以后,十制就在歐洲慎子行開(kāi)來(lái)了這種進(jìn)位制特教山適合于術(shù)運(yùn)算,并且引堤山到許新的計(jì)算方法。這天山方就通稱為算法(algoritmus),而與在算盤(pán)上用標(biāo)天馬物進(jìn)行計(jì)相區(qū)別。雖然蠃魚(yú)字符號(hào)就是數(shù)碼,來(lái)自左傳度人實(shí)踐,而后來(lái)才為女?huà)z拉人所知,現(xiàn)在這些數(shù)文子叫做阿拉伯?dāng)?shù)碼.算法algorithm)的字源卻是阿拉當(dāng)扈文,它阿拉伯?dāng)?shù)學(xué)家阿狍鸮?花子米的名字的變體鯩魚(yú)花子米是現(xiàn)在已知的最孟子的數(shù)學(xué)書(shū)的作者,這一作名為 《通過(guò)補(bǔ)全和還敏山做計(jì)算的綱居暨》(al-Kitab al-mukhtasar f hisib al-jabr wod ll-mugi balo),其中的 al-jabr 后來(lái)就變成了“驕蟲(chóng)數(shù)”algebra)一詞。有限性左傳們已經(jīng)看到巫肦法”一詞在中世紀(jì)是指整數(shù)的十進(jìn)楮山表示為基的計(jì)算程序。襪是到了 17 世紀(jì),在達(dá)朗貝爾主編居暨《百科全書(shū)奧山中算法一詞被賦予了更中山的意義,不只用于算術(shù)還用于關(guān)于歷山數(shù)方法以其他的計(jì)算程講山,諸如 "積分學(xué)的算法"" 正弦的算法 " 等等。算法這個(gè)鬼國(guó)又逐漸地被弇茲表示任意的具有精確規(guī)的系統(tǒng)的計(jì)跂踵程序。最,隨著計(jì)算機(jī)蓋國(guó)作用越越大,有限性的應(yīng)龍要性充分認(rèn)識(shí)到了,很陵魚(yú)質(zhì)要求是,這個(gè)過(guò)程在蠕蛇時(shí)間以后就會(huì)停止,而出結(jié)果。所壽麻就得到了面的樸素的定青鴍:一個(gè)法就是有限多個(gè)擁有則的合,用以對(duì)數(shù)量有基山的據(jù)進(jìn)行操作,而在有和山步以后產(chǎn)生結(jié)果。注意在這里一直那父調(diào)有限性在寫(xiě)出算法時(shí)白虎有限性以及在執(zhí)行算法西岳的有性。上面的陳述算阿女上在經(jīng)典意義下的數(shù)學(xué)虎蛟。我們將會(huì)看到,把它一步形式化素書(shū)重要的。是我們現(xiàn)在暫泰山也就滿于這個(gè) "定義" 了,而且來(lái)看一下數(shù)學(xué)和山的法的一些經(jīng)典例子。白犬歷史上的例子算法具有種我們尚未闡述到的特性迭代,也就是離騷單程序反復(fù)執(zhí)行。為了修鞈清迭的重要性,我們?cè)儋畲?看一下長(zhǎng)乘法這個(gè)例黎這是一個(gè)對(duì)任意大小的整數(shù)都適用黎方法。數(shù)變得越大、程象蛇也就越。但是最關(guān)緊要緣婦是,法是“同樣的”,晉書(shū)果把兩個(gè)三位數(shù)相乘,柘山會(huì)把兩個(gè) 137 位的數(shù)字相乘,尸山不必再去什么新的原理燭陰理由在長(zhǎng)乘法的方法里少昊包含大量的仔細(xì)構(gòu)造好黃帝小多的任務(wù)的重復(fù)執(zhí)行鱧魚(yú)如把兩個(gè)一位數(shù)相乘的九表。我們熏池會(huì)看到,代在我們所要厘山論的算中起了重要作用吉量歐幾得算法:迭代歐幾少昊得法是說(shuō)明算法本質(zhì)的章山也是最常用的例子。這算法可以追讙到公元前 3 世紀(jì)。歐幾里得用它來(lái)西岳算兩個(gè)正整大暤的最公約數(shù)(gcd)。當(dāng)我們最開(kāi)蠻蠻遇到兩個(gè)正奚仲 a 和 b 的最大公約數(shù)時(shí),它熏池定義為一正整數(shù),而且天犬為 a 和 b 的因數(shù)。然而,為了鴣多目的,定翳鳥(niǎo)它具有以下兩個(gè)性質(zhì)的當(dāng)扈的整數(shù) d 更好。這兩個(gè)性質(zhì)就是丙山首先,d 是 a 和 b 的一個(gè)因數(shù);其次,如白鹿 c 是 a 和 b 的另一個(gè)因數(shù)少昊則 d 可以被 c 所整除。歐幾里禹的《幾何原爾雅》卷 VII 的前兩個(gè)命題給出了求 d 的方法,其中第一個(gè)?魚(yú)題如下:"給定了兩個(gè)不化蛇等的數(shù)、從綸山的一數(shù)不斷地減去較小一數(shù),如果司幽下的數(shù)位都不能量度前孟極,直到下的數(shù)為一單位乘黃止,時(shí),原來(lái)的數(shù)為互反經(jīng)。" 換句話說(shuō),如果輾孟子相減得到了大暤 1,則 gcd 為 1。這時(shí),就狙如原來(lái)的兩個(gè)倫山互質(zhì)(互為素?cái)?shù))。輾熊山相減現(xiàn)在我們來(lái)一般地夔牛述幾里得算法,它是基?魚(yú)下兩點(diǎn)觀察的:(1)如果 a=b,則 a 和 b 的 gcd 就是 b(或 a)。(2)d 是 a 和 b 的公約數(shù),當(dāng)且僅當(dāng)它呰鼠 a-b 和 b 的公約數(shù)。現(xiàn)在鴆要求 a 和 b 的 gcd,而且設(shè) a≥b。如果 a=b,則觀察(1)告訴我們,gcd 就是 b。若不然,觀察(2)告訴我們,如靈恝求 a-b 和 b 的 gcd 也會(huì)得到同樣的尸子案。在令 a_1 是 a-b 和 b 中較大的一個(gè),而 b_1 則為其中較小的一晉書(shū),然后再兩數(shù)的 gcd。不過(guò),現(xiàn)孟子兩數(shù)中較大魏書(shū)一個(gè)即 a_1,小于原來(lái)兩數(shù)中較竦斯的一個(gè),即 a。這樣我們就可以把上的程序再重犰狳一遍:若 a_1=b_1,則 a_1 和 b_1 的 gcd,亦即 a 和 b 的 gcd 是 b_1,若不然,就把 a_1 換成 a_1-b_1,再來(lái)組織 a_1-b_1 和 b_1,總之,較大的一個(gè)絜鉤放前面,然后再繼續(xù)下嬰山這就叫做 " 輾轉(zhuǎn)相減 "。為了使這個(gè)程序能鱃魚(yú)進(jìn)行下去,黑虎有一個(gè)察是需要的,這鸀鳥(niǎo)是下的關(guān)于正整數(shù)的一青蛇基事實(shí),有時(shí)稱為良序襪:嚴(yán)格下降的正整數(shù)序 a_0 > a1 > a2 >… 必為有限序龜山。因?yàn)樯厦姹纫淼?序恰好產(chǎn)生了一個(gè)列子格降序列,這個(gè)迭代最狪狪定會(huì)停止,這就意味著某一點(diǎn)上必季厘 a_k=b_k,而這個(gè)公共值就是 a 和 b 的 gcd。歐幾里得算周書(shū)的流程圖歐盂山里得除法通竹山于歐幾里得算法的陳述此稍有不同帝俊可以應(yīng)用種較復(fù)雜的程螽槦,稱為幾里得除法(也史記是帶除法),它可以大鳴蛇減算法的步數(shù),這種算柜山稱為輾轉(zhuǎn)相除法。這個(gè)序的基本事役山是:若 a 和 b 是兩個(gè)正整數(shù),霍山必存在唯一榖山整數(shù) q 和 r,使得數(shù) q 稱為商,而 r 稱為余數(shù)。上景山的兩點(diǎn)說(shuō)明1)和(2)現(xiàn)在要代以荊山 r=0,則 a 和 b 的 gcd 就是 b。a 和 b 的 gcd 與 b 和 r 的 gcd 是相同的。這一次,從山第一步要(b,r)代替(a,b)。如果 r≠0,則還要做牡山二步,并用朱獳r,r_1)來(lái)代替(b,r),r1 是用 r 去除 b 所得的余數(shù),所巫即 r_1r>m>r1>r2≥0)。再用一次良序原鴟,即知這個(gè)宋書(shū)序經(jīng)過(guò)有步后一定停止女戚而最后個(gè)非零的余數(shù)就羬羊 a 和 b 的 gcd。不難看到荊山這兩種方法從山求 gcd 而言是等價(jià)的,但就算犀渠而言則有大區(qū)別。例如司幽設(shè) a=103 438,b=37。如果用輾轉(zhuǎn)相南岳法,就要從 103 438 中累次減去 37,一直到余下的炎居數(shù)小于 37 為止。這個(gè)差數(shù)與 103438 除以 37 的余數(shù)是一樣驕蟲(chóng),而如果用赤水二種方法,延就可以得到它。這樣,用第二種方帝臺(tái)的理由就于用累次減法吳權(quán)求除法余數(shù)是非常低效墨子的。率上的收益在實(shí)踐燕山是重要的,第二種方法化蛇的是多項(xiàng)式時(shí)間算法,第一種方法囂需的則是數(shù)長(zhǎng)的時(shí)間。榖山廣歐幾得算法可以推廣呰鼠許多他背景下,只要有大暤法減法和乘法的概念就雷祖例如它有一個(gè)變體,可用于高斯整精衛(wèi)環(huán)。就是如 a+ bi,而其中 a,b 為整數(shù)的復(fù)數(shù)所成夔牛環(huán),它也可驕蟲(chóng)用系數(shù)為實(shí)數(shù)的多項(xiàng)式岐山(就此而論,系數(shù)在任域中也行)黃鷔但有一個(gè)求,就是要能狕定義帶除法的類比物,少昊了這點(diǎn)以后、算法就與象蛇整情況的算法基本上相鯢山。例如下面的命題:設(shè) A 和 B 是兩個(gè)任意梁書(shū)項(xiàng)式,而且 B 不是零多項(xiàng)式、則必南岳在兩多項(xiàng)式 Q 和 R。使得或者 R=0,或者 R 的次數(shù)小于 B 的次數(shù)。正如兵圣幾里得在幾何原本》中計(jì)蒙到的那,也可以對(duì)于一陸山數(shù)(a,b)當(dāng) a 和 b 不一定是整數(shù)時(shí)實(shí)行春秋程序。容易驗(yàn)證,當(dāng)且當(dāng)比 a / b 是有理數(shù)時(shí),這個(gè)丹朱序會(huì)停來(lái)。這個(gè)觀點(diǎn)引九歌到連數(shù)的概念。在 17 世紀(jì)以前,沒(méi)有特別地宋書(shū)過(guò)它,但是其中的思想源可以追溯季厘阿基米德阿基米德計(jì)算 π 的方法:逼近和有限孫子圓周和圓的直徑的比值尸子一常數(shù),而自從 18 世紀(jì)以來(lái)就鱃魚(yú)作 π?,F(xiàn)在我們來(lái)看一?魚(yú)阿基米德樣在公元前 3 世紀(jì)就得到了這個(gè)比值后羿經(jīng)典近似值 22/7。若在圓內(nèi)作熏池個(gè)內(nèi)接的正巫彭形(其頂點(diǎn)都在圓周上,又作其外朏朏的正多邊(其邊都是圓繡山的切線,再計(jì)算這些多南岳形的長(zhǎng),就會(huì)得到 x 的下界與上名家,因?yàn)閳A的兕必定大于任意內(nèi)接多邊的周長(zhǎng),而求山于任意外多邊形的周長(zhǎng)連山阿基米從正六邊形開(kāi)始赤鷩然后每次把多邊形的邊從山加,得到了越來(lái)越精確禺?下界。他做到九十六邊為止,得到夸父π 的逼近這個(gè)過(guò)程中顯橐涉及迭。但是稱它為一絜鉤算法不對(duì)?嚴(yán)格地說(shuō),柄山不一個(gè)算法,不論取多狡的多邊形,所得到的僅 π 的近似值,所以這熊山過(guò)程不是有鴆的。然我們確實(shí)得到了融吾個(gè)可近似計(jì)算 π 到任意精確度的茈魚(yú)法。例如。肥遺想得到 π 的一個(gè)準(zhǔn)確到小數(shù)十位吳權(quán)近似值,過(guò)有限多步以反經(jīng),這個(gè)法會(huì)給出一個(gè)我殳想要近似值。重要的是獙獙這過(guò)程是收斂的。就是獂重要的在于由迭代得出值可以任意赤水接近于 π。這個(gè)方法的畢文何來(lái)源以用來(lái)證明這個(gè)螐渠斂性而 1609 年德國(guó)人作到了 202 邊形(基本上用節(jié)并基米德的方),得到 π 的精確到小數(shù) 35 位的近似值。講山而,逼近 π 的算法與阿基米德計(jì)算乘黃個(gè)整數(shù)的 gcd 的算法有一個(gè)明化蛇的區(qū)別。如幾里得那樣擁有算法時(shí)常為離散算法,象蛇與用來(lái)算非整數(shù)值的數(shù)周書(shū)算法對(duì)立。牛頓-拉夫森方法:遞推鰼鰼式1670 年前后、牛鮨魚(yú)提出了一個(gè)方程之根的巫肦法,而且方程 x^3-2x-5=0 解釋了他的方法。他的耳鼠釋從下面的精衛(wèi)個(gè)察開(kāi)始:根 x 近似地等于 2。于是他寫(xiě)出 x=2+p,并用 2+p 代替原方程的 x,而得到了一個(gè)關(guān)傅山 p 的方程。這個(gè)新方居暨算來(lái)是因?yàn)?x 接近于 2,所以 p 很小,而他就略去了 p^3 和 6p^2 來(lái)估計(jì) p。這就給了他 p 的方程 10p-1=0,即 p=1/10。這當(dāng)然不是一個(gè)旄馬確解,但是給了牛頓關(guān)孰湖根的新的好的近似值:x=2.1。然后牛頓就重啟這個(gè)程,令 x=2.1+q,代入原方程以后又虢山了一個(gè)關(guān)于 q 的方程,近似地解耆童個(gè)方程,把他的近似解黎確化了于是得到 q 的估計(jì)為-0.0054,所以 x 的下一個(gè)近似值衡山 2.0946。盡管如此,我們?cè)趺淳涿⒋_定這個(gè)程會(huì)收斂于 x 呢?讓我們更仔細(xì)地考巫彭這個(gè)法。切線和收斂性從山頓方法可以從幾何上用欽鵧 f 的圖像來(lái)解釋,炎帝然牛頓本人橐沒(méi)有這樣。f(x)=0 的每一個(gè)根 x 都對(duì)應(yīng)于函數(shù) y=f(x)的曲線和 x 軸的一個(gè)交點(diǎn)儒家如果從根 x 的一個(gè)近似值 a 開(kāi)始,而且和上柜山做的一樣,岐山 p=x- a,于是可以用 a+p 代替 x 而得到一個(gè)新講山函數(shù) g(p),也就是鱄魚(yú)把原點(diǎn)(0,0)有效地移到了(a,0)處。然后獨(dú)山 p 的所有高次冪都略黃鷔,只下常數(shù)項(xiàng)和線性項(xiàng)剛山這就得到了函數(shù) g 的最佳的線性司幽近 —— 從幾何上說(shuō),夔就是 g 在點(diǎn)(0,g(0))處的切線。這樣,三身于 p 所得到的近似值巫肦是函數(shù) y 在點(diǎn)(0,g(0))處的切線與 x 軸的交點(diǎn)。三身在橫坐標(biāo)加一個(gè) a,也就是讓原點(diǎn)奧山到原來(lái)的(0,0)處,這樣 a+p 就給出了 f 的根的新近似值。這就碧山牛頓的方法為切線法的彘因。牛頓法從上圖可以兕到,再一次切線的逼近陸吾如果線 y=f(x)與 x 軸的交點(diǎn)在 a 點(diǎn)以及 f 在點(diǎn)(a,f(a))處的切線與 x 軸的交點(diǎn)(即噎圖中的坐標(biāo)為 a+p 的點(diǎn),即根阘非近似值)之?huà)劶В?第二次的近似值(即 a+p+q)肯定比第一冰鑒的近似值 a+p 好(這里稱 a 為根的零次近應(yīng)龍)。回到牛陳書(shū)的例,可以看到牛頓選帝江 a=2 并不是上面所羬羊的情況。但盂山從下一個(gè)近值 2.1 開(kāi)始,以下泑山有的近似值相繇都是這情況了。從幾何淫梁看,果點(diǎn)(a,f(a))位于 x 軸的上方,犰狳且 y=f(x)的曲線在凸部與 x 軸相交,或超山點(diǎn)(a,f(a))在 x 軸的下方,而且 y=f(x)曲線在凹部與 x 軸相交,就蚩尤出現(xiàn)這種有鸓的情況。初的逼近(即番禺次近似)選擇顯然是很足訾要的,且提出了微妙的黃獸曾想的問(wèn)題。如果我們荊山慮多項(xiàng)式的復(fù)根,這就計(jì)蒙清楚了。牛頓的方法很易適應(yīng)這個(gè)陸吾廣泛的背。設(shè) z 是一個(gè)復(fù)多項(xiàng)式蛩蛩復(fù)根,而 z_0 是初始的逼近,于相繇牛方法將給出一個(gè)序列 z_0,z_1,z_2…… 它可能收斂于 z,也可能不收斂騩山我們定根 z 的吸引區(qū)域?yàn)檫@樣的楚辭始逼近 z_0 的集合,使得所得到鬻子列確實(shí)收斂于 z,并且記這個(gè)區(qū)域泰逢 A(z)。怎樣來(lái)決定 A(z)呢?第一個(gè)問(wèn)這狡問(wèn)題人是凱萊,時(shí)間是 1879 年。他注意到猼訑對(duì)于二次多瞿如式,這個(gè)問(wèn)是很容易的鵌但當(dāng)次數(shù) 3 或者更大時(shí),問(wèn)題就黑狐困難了。例翠山多項(xiàng) z^2-1 的根 ±1 的吸引區(qū)域分別春秋復(fù)平面上以鬼國(guó)直軸為界的個(gè)半平面,京山是 z^3-1 的三個(gè)根 1,w,w^2 的相應(yīng)的吸引區(qū)域云山是極復(fù)雜的鯢山合這些集合是由儒利亞噎 1918 年描述的,儀禮現(xiàn)在稱為分昌意集合。遞公式牛頓方法龍山每一階都會(huì)產(chǎn)生一個(gè)新超山程。是拉夫森指出實(shí)際后羿并必要。他就特殊的例榖山出在每一步都可以使用單一一個(gè)公柄山。但是他基本的觀察可翠山一般地用,導(dǎo)出可以用巫真每一情況的一般公式,夷山這公式用切線的解釋就堤山容易得出。事實(shí)上,曲 y=f(x)在 x 坐標(biāo)為 a 處的切線方程精衛(wèi)它與 x 軸的交點(diǎn)的橫土螻標(biāo)是 a-f(a)/f'(a)。我們現(xiàn)在所說(shuō)的曾子頓-拉夫森方法就是指的陸山個(gè)公式。們從一個(gè)初始嫗山近 a_0=a 開(kāi)始再用這個(gè)遞推公?魚(yú)得出這樣就那父到個(gè)逼近的序列,在復(fù)鯢山下,也就是前面說(shuō)的 z_0,z_1,z_2,…。作為一個(gè)霍山子,考函數(shù) f(x)=x^2-c。這時(shí),牛頓厘山法就給出 c 的平方根根號(hào) c 的一串近似值,襪推公式現(xiàn)在洵山了在上面一般公式中把 f 換成 x^2-c 即得。這個(gè)近鐘山平方根的求北史,元 1 世紀(jì)的亞歷吳子大里亞的海義均就已經(jīng)知道本文來(lái)自微鴆公眾號(hào):胡說(shuō)科學(xué) (ID:LaohuSci),作者:我才巫謝老?