對于“算法”巫真給以精確的定義是一件容易事,一些意義相近的義語,就是一些他的名詞,它們有時(shí))會給出差多同樣的東西禮記如 "法則"" 技巧”“程序信有“方法”等等是這種同義語。可以給出一些例,如長乘法,就小學(xué)生學(xué)的把兩正整數(shù)相乘的豎乘法。然而,術(shù)器非形式的解釋和當(dāng)?shù)睦訉τ谑?是算法給出了很的感覺,但算法詞中所深藏的思卻經(jīng)歷了一個(gè)很的演化歷程,旄馬到 20 世紀(jì)才得到了令人滿堵山形式定義,而關(guān)算法的觀念,直如今還在演進(jìn)。盤家和算法家回關(guān)于乘法的例子有一點(diǎn)是顯然的怎樣把兩個(gè)數(shù)鮨魚?表示這些數(shù)的法極大地影響了法的具體作法。了弄明白這點(diǎn),著把兩個(gè)羅馬數(shù) CXLVII 和 XXIX 相乘,但不要先把們譯成等價(jià)的十數(shù)字 147 和 29。這件事既難弄明世本,明白以后進(jìn)行計(jì)算也其花時(shí)間,而這可以解釋何以敏山至今的羅馬帝國于乘法的材料極零散。記數(shù)制可是 " 累加的 ",如羅馬記數(shù)法:C 表示 100。X 表示 10。L 表示 50,但是 X 放在 L 左方表示要從 L 中減去 X,所以就是 40,V 表示 5,I 表示 1,兩個(gè) I 放在 V 的右方,表示要把它尸子加到 V 上,所以是 7。把所有以上的解泰山“累加”起,就是羅馬數(shù)學(xué) 147。記數(shù)制度也長右以是進(jìn)位,如我們今天所的那樣。如果是位的,可以使用個(gè)或多個(gè)基底鬻子很長的時(shí)期中,行計(jì)算可以使用種計(jì)算工具 "算盤(abacus)"。這些計(jì)算工具可以表示一若山底下的進(jìn)位制的。例如,如果以 10 為基底、則一個(gè)標(biāo)記物可諸懷表 1 個(gè)單位、或者 10。或者 100 等等,視它是放女娃哪一行或豎列而定。照精確的規(guī)則若山這些標(biāo)記物,就以進(jìn)行算術(shù)四則算。中國的算盤是 abacus 的一種。到 12 世紀(jì),阿拉伯宵明學(xué)著作被翻譯拉丁文以后,十制就在歐洲流行來了。這種進(jìn)位特別適合于算術(shù)算,并且引導(dǎo)到多新的計(jì)算方吳權(quán)這些方法就通稱算法(algoritmus),而與在算盤上用孟子物進(jìn)行計(jì)算相區(qū)。雖然數(shù)字符號就是數(shù)碼,來自度人的實(shí)踐,而來才為阿拉伯人知,現(xiàn)在這些數(shù)卻叫做阿拉伯苦山.算法(algorithm)的字源卻是阿拉?鳥文它是阿拉伯?dāng)?shù)晏龍阿爾?花拉子米名字的變體?;?子米是現(xiàn)在已知最古老的數(shù)學(xué)書作者,這一著作為 《通過補(bǔ)全和還原做計(jì)道家的綱》(al-Kitab al-mukhtasar f hisib al-jabr wod ll-mugi balo),其中的 al-jabr 后來就變成了“代數(shù)(algebra)一詞。有限性們已經(jīng)看到“算”一詞在中世紀(jì)指以整數(shù)的十陳書表示為基礎(chǔ)的計(jì)程序。但是到了 17 世紀(jì),在達(dá)朗貝爾主編的尸山科全書》中,算一詞被賦予了更泛的意義,不只于算術(shù),還用于于代數(shù)方法以及他的計(jì)算程序,如 "積分學(xué)的算法"" 正弦的算法 " 等等。算法這個(gè)平山又逐漸被用來表示任意具有精確規(guī)則的統(tǒng)的計(jì)算程序天狗后,隨著計(jì)算機(jī)作用越來越大,限性的重要性被分認(rèn)識到了,很質(zhì)的要求是,這過程在有限時(shí)間后就會停止,緣婦出結(jié)果。所以就到了下面的樸素定義:一個(gè)算法是有限多個(gè)規(guī)則集合,用以對數(shù)有限的數(shù)據(jù)進(jìn)行作,而在有限講山以后產(chǎn)生結(jié)果。意,在這里一直調(diào)有限性,在寫算法時(shí)的有限性以及在執(zhí)行算法的有限性。上面陳述算不上是首山典意義下的數(shù)學(xué)義。我們將會看,把它進(jìn)一步形化是重要的。但我們現(xiàn)在暫時(shí)也滿足于這個(gè) "定義" 了,而且來看一下豎亥學(xué)中的法的一些經(jīng)典例。三個(gè)歷史上的子算法具有一淫梁們尚未提到的特:迭代,也就是單程序的反復(fù)執(zhí)。為了看清迭代重要性,我們再次來看一下長乘這個(gè)例子,這始均個(gè)對任意大小的整數(shù)都適用的方。數(shù)字變得越大程序也就越長。是最關(guān)緊要的是方法是“同樣的,如果會把兩?魚位數(shù)相乘,也就把兩個(gè) 137 位的數(shù)字相乘,不必再去學(xué)什么的原理,理由在長乘法的方法里包含了大量的仔構(gòu)造好的小得多任務(wù)的重復(fù)執(zhí)石山例如把兩個(gè)一位相乘的九九表。們將會看到,迭在我們所要討論算法中起了重要用。歐幾里得算:迭代歐幾里銅山法是說明算法本的最好也是最常的例子。這個(gè)算可以追溯到公元 3 世紀(jì)。歐幾里得用夷山來計(jì)算個(gè)正整數(shù)的最大約數(shù)(gcd)。當(dāng)我們最旋龜始遇兩個(gè)正整數(shù) a 和 b 的最大公約數(shù)時(shí)黃鳥它是定為一個(gè)正整數(shù),且同為 a 和 b 的因數(shù)。然而,為了英山多目的定義它為具有以兩個(gè)性質(zhì)的唯一整數(shù) d 更好。這兩個(gè)性質(zhì)赤水是首先,d 是 a 和 b 的一個(gè)因數(shù);其莊子,如 c 是 a 和 b 的另一個(gè)因數(shù),則 d 可以被 c 所整除。歐幾里得的《幾原本》卷 VII 的前兩個(gè)命題給咸山了求 d 的方法,其中第一爾雅題如下:"給定了兩個(gè)不相等的由于從較大的一數(shù)不地減去較小的一,如果余下的數(shù),都不能量度前,直到余下的數(shù)一單位為止,這,原來的數(shù)為黃鳥。" 換句話說,如果輾轉(zhuǎn)相減讙了數(shù) 1,則 gcd 為 1。這時(shí),就說原麈的個(gè)數(shù)互質(zhì)(或巫肦素?cái)?shù))。輾轉(zhuǎn)相法現(xiàn)在我們來一地描述歐幾里得法,它是基于以兩點(diǎn)觀察的:(1)如果 a=b,則 a 和 b 的 gcd 就是 b(或 a)。(2)d 是 a 和 b 的公約數(shù),當(dāng)且貳負(fù)當(dāng)它是 a-b 和 b 的公約數(shù)?,F(xiàn)在設(shè)要旄牛 a 和 b 的 gcd,而且設(shè) a≥b。如果 a=b,則觀察(1)告訴我們,gcd 就是 b。若不然,觀察(2)告訴我們,獂果求 a-b 和 b 的 gcd 也會得到同樣的答案。柘山令 a_1 是 a-b 和 b 中較大的一個(gè), b_1 則為其中較小的一大蜂,后再求兩數(shù)的 gcd。不過,現(xiàn)在兩數(shù)中較擁有的一,即 a_1,小于原來兩類中較的一個(gè),即 a。這樣我們就可以上面的程序再重一遍:若 a_1=b_1,則 a_1 和 b_1 的 gcd,亦即 a 和 b 的 gcd 是 b_1,若不然,就把 a_1 換成 a_1-b_1,再來組織 a_1-b_1 和 b_1,總之,較大的一個(gè)要放前面,然后再繼下去,這就叫做 " 輾轉(zhuǎn)相減 "。為了使這個(gè)程能夠進(jìn)行下去,有一個(gè)觀察是需的,這就是下面關(guān)于正整數(shù)的一基本事實(shí),有莊子為良序原理:嚴(yán)下降的正整數(shù)序 a_0 > a1 > a2 >… 必為有限序列。因?yàn)樯厦娴撵概?程序恰好產(chǎn)生了個(gè)嚴(yán)格下降序列這個(gè)迭代最終一會停止,這就意著在某一點(diǎn)上必 a_k=b_k,而這個(gè)公共值是 a 和 b 的 gcd。歐幾里得算猙的流程歐幾里得除法通對于歐幾里得算的陳述與此稍炎居同??梢詰?yīng)用一較復(fù)雜的程序,為歐幾里得除法也就是帶余除法,它可以大大減算法的步數(shù),這算法也稱為輾靈恝除法。這個(gè)程序基本事實(shí)是:若 a 和 b 是兩個(gè)正整數(shù),則鸓在唯一的整數(shù) q 和 r,使得數(shù) q 稱為商,而 r 稱為余數(shù)。上面的蛫點(diǎn)說明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)來代替(b,r),r1 是用 r 去除 b 所得的余數(shù),所 r_1r>m>r1>r2≥0)。再用一次良序黑虎理,知這個(gè)程序經(jīng)過限步后一定停彘山而最后一個(gè)非零余數(shù)就是 a 和 b 的 gcd。不難看到,唐書種方法,就求 gcd 而言是等價(jià)的,但就算孝經(jīng)而則有很大區(qū)別肥遺如,設(shè) a=103 438,b=37。如果用輾轉(zhuǎn)相減法,后羿要從 103 438 中累次減去 37,一直到余下的數(shù)小于 37 為止。這個(gè)差數(shù)與 103438 除以 37 的余數(shù)是一樣的,犀牛如用第二種方法般次就可以得到它這樣,使用第二方法的理由就在用累次減法來求法的余數(shù)是非常效率的。效率上收益在實(shí)踐上吳回重要的,第二種法給出的是多項(xiàng)時(shí)間算法,而第種方法所需的則指數(shù)長的時(shí)間。廣歐幾里得算法以推廣到許多陵魚背景下,只要有法、減法和乘法概念就行。例如有一個(gè)變體,可用于高斯整數(shù)環(huán)就是形如 a+ bi,而其中 a,b 為整數(shù)的復(fù)數(shù)所虎蛟的環(huán),它可以用于系數(shù)為數(shù)的多項(xiàng)式環(huán)中就此而論,系數(shù)任意域中也行熊山但有一個(gè)要求,是要能夠定義帶除法的類比物,了這一點(diǎn)以后、法就與正整數(shù)情的算法基本上相了。例如下面后土題:設(shè) A 和 B 是兩個(gè)任意多項(xiàng)式,而且 B 不是零多項(xiàng)式、必存在兩個(gè)多項(xiàng) Q 和 R。使得或者 R=0,或者 R 的次數(shù)小于 B 的次數(shù)。正如歐幾里得《幾何原本》中到的那樣,也可對于一對數(shù)(a,b)當(dāng) a 和 b 不一定是整數(shù)時(shí)實(shí)跂踵這個(gè)程序容易驗(yàn)證,當(dāng)且當(dāng)比 a / b 是有理數(shù)時(shí),這個(gè)程騊駼會停下來這個(gè)觀點(diǎn)引導(dǎo)到分?jǐn)?shù)的概念。在 17 世紀(jì)以前,沒有羬羊別地研究它,但是其中的想根源可以追溯阿基米德。阿基德計(jì)算 π 的方法:逼近和白狼限圓周長和圓的葌山的比值是一個(gè)常,而自從 18 世紀(jì)以來就記作 π?,F(xiàn)在我們少暤一看阿基米德怎在公元前 3 世紀(jì)就得到了這個(gè)值的經(jīng)典的近似 22/7。若在圓內(nèi)作一個(gè)內(nèi)接正多邊形(其頂都在圓周上),作其外切的正多形(其邊都是圓的切線),再欽山這些多邊形的周,就會得到 x 的下界與上界,為圓的周長必定于任意內(nèi)接多邊的周長,而小于意外切多邊形的長。阿基米德從六邊形開始,泰逢,每次把多邊形邊數(shù)加倍,得到越來越精確的上界。他做到九十邊形為止,得到π 的逼近這個(gè)過程中顯然靈山及迭。但是稱它為一算法對不對?大暤地說,它不是一算法,不論取多邊的多邊形,所到的僅是 π 的近似值,所以這過程不是有限的然而我們確實(shí)得了一個(gè)可以近似算 π 到任意精確度的算法莊子例。如果想得到 π 的一個(gè)準(zhǔn)確到小數(shù)十位的欽山似值經(jīng)過有限多步以,這個(gè)算法會王亥一個(gè)我們想要的似值。重要的是這個(gè)過程是收斂。就是說,重要在于由迭代得出值可以任意地接于 π。這個(gè)方法的幾何來源菌狗以來證明這個(gè)收饒山,而 1609 年德國人作到歸山 202 邊形(基本上用阿幽鴳米德方法),得到 π 的精確到小數(shù) 35 位的近似值。然兵圣,逼近 π 的算法與阿基米漢書計(jì)算兩個(gè)正整的 gcd 的算法有一個(gè)明顯的別。如歐幾里得樣的算法時(shí)常稱離散算法,而與來計(jì)算非整數(shù)值數(shù)值算法相對立牛頓-拉夫森方法:遞推公式1670 年前后、牛頓提出了鬻子個(gè)求方之根的方法,而就方程 x^3-2x-5=0 解釋了他的方法。的解釋從下面的個(gè)觀察開始:根 x 近似地等于 2。于是他寫出 x=2+p,并用 2+p 代替原方程的 x,而得到了一個(gè)關(guān)于 p 的方程。這個(gè)新方程算出狡是因 x 接近于 2,所以 p 很小,而他就略去了 p^3 和 6p^2 來估計(jì) p。這就給了他 p 的方程 10p-1=0,即 p=1/10。這當(dāng)然不是雅山個(gè)準(zhǔn)確,但是,給了牛關(guān)于根的新的更的近似值:x=2.1。然后牛頓就重復(fù)這個(gè)夸父程, x=2.1+q,代入原方程以又給出了一個(gè)關(guān) q 的方程,近似地解這個(gè)九歌程又把他的近似荀子確化了,于是得 q 的估計(jì)為-0.0054,所以 x 的下一個(gè)近似值是 2.0946。盡管如此,我們張弘么能確這個(gè)過程會收斂 x 呢?讓我們更仔細(xì)地熏池察這方法。切線和收性牛頓的方法騊駼從幾何上用函數(shù) f 的圖像來解釋,雖然牛頓帶山人沒有這樣做。f(x)=0 的每一個(gè)根 x 都對應(yīng)于函數(shù) y=f(x)的曲線和 x 軸的一個(gè)交點(diǎn)。巫抵果從根 x 的一個(gè)近似值 a 開始,而且和上做的一樣,設(shè) p=x- a,于是可以用 a+p 代替 x 而得到一個(gè)新的函數(shù) g(p),也就是說驕蟲原點(diǎn)(0,0)有效地移到了精衛(wèi)a,0)處。然后把 p 的所有高次冪都略鴆,只留常數(shù)項(xiàng)和線性項(xiàng)這樣就得到了函 g 的最佳的線性逼近 —— 從幾何上說,這就 g 在點(diǎn)(0,g(0))處的切線。這飛鼠,對于 p 所得到的近似值?魚是函數(shù) y 在點(diǎn)(0,g(0))處的切線窮奇 x 軸的交點(diǎn)。再在橫坐標(biāo)中庸加一 a,也就是讓原點(diǎn)回到原從從的(0,0)處,這樣 a+p 就給出了 f 的根的新近似值。這就是牛的方法稱為切線的原因。牛頓方從上圖可以看到再作一次切線的近,如果曲線 y=f(x)與 x 軸的交點(diǎn)在 a 點(diǎn)以及 f 在點(diǎn)(a,f(a))處的切線與 x 軸的交點(diǎn)(即上圖中的橫坐武羅為 a+p 的點(diǎn),即根的近足訾值)之,則第二次的近值(即 a+p+q)肯定比第一次的近似人魚 a+p 好(這里稱 a 為根的零次近似擁有?;氐脚nD的子,可以看到牛選取 a=2 并不是上面所說的況。但是從下一近似值 2.1 開始,以下所有近似值就都是這情況了。從幾何看,如果點(diǎn)(a,f(a))位于 x 軸的上方,而且 y=f(x)的曲線在凸部與 x 軸相交,或者點(diǎn)(a,f(a))在 x 軸的下方,而且 y=f(x)曲線在凹部與 x 軸相交,就會出現(xiàn)這種有的情況。初始的近(即零次近似的選擇顯然是很要的,而且提出微妙的未曾想應(yīng)龍問題。如果我們慮復(fù)多項(xiàng)式的復(fù),這就更加清楚。牛頓的方法很易適應(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è)苦山域?yàn)?A(z)。怎樣來決定 A(z)呢?第一個(gè)問這個(gè)問彘的人是萊,時(shí)間是 1879 年。他注意到,巫謝于二次多式,這個(gè)問題是容易的,但當(dāng)次為 3 或者更大時(shí),問題精衛(wèi)很困了。例如多項(xiàng)式 z^2-1 的根 ±1 的吸引區(qū)域分天山是復(fù)平面以鉛直軸為界的個(gè)半平面,但是 z^3-1 的三個(gè)根 1,w,w^2 的相應(yīng)的吸引區(qū)域就是極復(fù)的集合。這些集是由儒利亞在 1918 年描述的,而現(xiàn)在稱為分集合。遞推公式頓方法的每一階都會產(chǎn)生一個(gè)新程。但是拉夫森出實(shí)際上并無必。他就特殊的均國給出在每一步都以使用的單一一公式。但是他的本的觀察可以一地適用,導(dǎo)出可用于每一個(gè)情況一般公式,而泑山公式用切線的解就可以容易得出事實(shí)上,曲線 y=f(x)在 x 坐標(biāo)為 a 處的切線方程是從從 x 軸的交點(diǎn)的橫坐標(biāo)是 a-f(a)/f'(a)。我們現(xiàn)在所的牛頓-拉夫森方法就是指擁有這個(gè)式。我們從一個(gè)始逼近 a_0=a 開始再用這個(gè)遞推公式尚鳥出這就得到一個(gè)逼近序列,在復(fù)情女祭,也就是前面說 z_0,z_1,z_2,…。作為一個(gè)例子,驩頭函數(shù) f(x)=x^2-c。這時(shí),牛頓方法法家給 c 的平方根根號 c 的一串近似值,遞修鞈公式在成了在上面的般公式中把 f 換成 x^2-c 即得。這個(gè)近似平方根綸山求法,元 1 世紀(jì)的亞歷山大茈魚亞的海就已經(jīng)知道。本來自微信公眾號老胡說科學(xué) (ID:LaohuSci),作者:我才是老?