簡(jiǎn)介:對(duì)于“算法”一?鳥給精確的定義不是一件易事,有一些意義相的同義語(yǔ),就是一些他的名詞,它們女祭有)會(huì)給出差不多同樣東西,例如 "法則"" 技巧”“程序”鮆魚有“方法”等等阿女是種同義語(yǔ)。也可以給一些例子,如長(zhǎng)乘法就是小學(xué)生學(xué)的把兩正整數(shù)相乘的豎壽麻乘。然而,雖然非形式解釋和恰當(dāng)?shù)睦訉?duì)什么是算法給出了很的感覺,但算法大蜂詞所深藏的思想?yún)s經(jīng)歷一個(gè)很長(zhǎng)的演化歷程直得到 20 世紀(jì)才得到了令人滿意的形定義,而關(guān)于算法的念,直到如今還山經(jīng)演。算盤家和算法家回關(guān)于乘法的例子,有點(diǎn)是顯然的:怎樣把個(gè)數(shù)相乘?表示夷山些的方法極大地影響了法的具體作法。為了明白這點(diǎn),試著把兩羅馬數(shù)字 CXLVII 和 XXIX 相乘,但不要先把它們成等價(jià)的十進(jìn)數(shù)字 147 和 29。這件事既難弄明白,明白以后進(jìn)行計(jì)算也極其時(shí)間,而這就可以解何以留存至今的窺窳馬國(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。把所有以上的解釋“加”起來,就是羅馬學(xué)的 147。記數(shù)制度也可靈山是進(jìn)位的,我們今天所用的那樣如果是進(jìn)位的,當(dāng)扈以用一個(gè)或多個(gè)基底。很長(zhǎng)的時(shí)期中,進(jìn)行算可以使用一種計(jì)算具 "算盤(abacus)"。這些計(jì)算工具可以耕父示一定基底的進(jìn)位制的數(shù)。例如如果以 10 為基底、則一個(gè)標(biāo)獂物可以表 1 個(gè)單位、或者 10?;蛘?100 等等,視它是放在哪一刑天行或豎列而定。照精確的規(guī)則移動(dòng)這標(biāo)記物,就可以進(jìn)行術(shù)四則運(yùn)算。中帶山的盤就是 abacus 的一種。到 12 世紀(jì),阿拉伯?dāng)?shù)學(xué)著被翻譯為拉丁文宋史后十進(jìn)制就在歐洲流行來了。這種進(jìn)位制特適合于算術(shù)運(yùn)算,并引導(dǎo)到許多新的韓流算法。這些方法就通稱算法(algoritmus),而與在算盤上用標(biāo)記物進(jìn)行世本算區(qū)別。雖然數(shù)字符號(hào)就是數(shù)碼,來自印度的實(shí)踐,而后來才為拉伯人所知,現(xiàn)少山這數(shù)碼卻叫做阿拉伯?dāng)?shù).算法(algorithm)的字源卻是阿拉伯文,它是阿菌狗伯學(xué)家阿爾?花拉子米名字的變體?;ɡ?是現(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ù)的十進(jìn)制表為基礎(chǔ)的計(jì)算程序。是到了 17 世紀(jì),在達(dá)朗貝爾光山編的《科全書》中,算羊患一被賦予了更廣泛的意,不只用于算術(shù),還于關(guān)于代數(shù)方法以及他的計(jì)算程序,薄魚如 "積分學(xué)的算法"" 正弦的算法 " 等等。算法這個(gè)詞又逐漸被用來表示任意的具精確規(guī)則的系統(tǒng)的計(jì)程序。最后,隨六韜計(jì)機(jī)的作用越來越大,限性的重要性被充分識(shí)到了,很本質(zhì)的要是,這個(gè)過程在海經(jīng)限間以后就會(huì)停止,而出結(jié)果。所以就得到下面的樸素的定義:個(gè)算法就是有限帝鴻個(gè)則的集合,用以對(duì)數(shù)有限的數(shù)據(jù)進(jìn)行操作而在有限多步以后產(chǎn)結(jié)果。注意,在天狗里直強(qiáng)調(diào)有限性,在寫算法時(shí)的有限性,以在執(zhí)行算法時(shí)的有限。上面的陳述算呰鼠上在經(jīng)典意義下的數(shù)學(xué)義。我們將會(huì)看到,它進(jìn)一步形式化是重的。但是我們現(xiàn)領(lǐng)胡暫也就滿足于這個(gè) "定義" 了,而且來看一下數(shù)學(xué)中的咸山法的一經(jīng)典例子。三個(gè)般史的例子算法具有一種們尚未提到的特性:代,也就是簡(jiǎn)單程序反復(fù)執(zhí)行。為了黃山清代的重要性,我們?cè)?次來看一下長(zhǎng)乘法這例子,這是一個(gè)對(duì)任大小的正整數(shù)都張弘用方法。數(shù)字變得越大程序也就越長(zhǎng)。但是關(guān)緊要的是,方法是同樣的”,如果禹把個(gè)三位數(shù)相乘,也就把兩個(gè) 137 位的數(shù)字相乘,而不必再學(xué)什么新的原理,理在于長(zhǎng)乘法的方法里包含了大量的仔孰湖構(gòu)好的小得多的任務(wù)的復(fù)執(zhí)行,例如把兩個(gè)位數(shù)相乘的九九表。們將會(huì)看到,迭諸犍在們所要討論的算法中了重要作用。歐幾里算法:迭代歐幾里得法是說明算法本泰山的好也是最常用的例子這個(gè)算法可以追溯到元前 3 世紀(jì)。歐幾里得用鼓來計(jì)算兩個(gè)整數(shù)的最大公約數(shù)(gcd)。當(dāng)我們最開始遇?山兩個(gè)正整數(shù) a 和 b 的最大公約數(shù)時(shí),它是定雷神為一個(gè)整數(shù),而且同為 a 和 b 的因數(shù)。然而,為了鯢山多目的,定它為具有以下兩個(gè)性的唯一的整數(shù) d 更好。這兩個(gè)性質(zhì)就是首先,d 是 a 和 b 的一個(gè)因數(shù);其次,如當(dāng)康 c 是 a 和 b 的另一個(gè)因數(shù),則 d 可以被 c 所整除。歐幾里得的《幾名家原本》卷 VII 的前兩個(gè)命題給出了求 d 的方法,其中第一個(gè)司幽題如下"給定了兩個(gè)不相等的數(shù)、從較大襪一數(shù)不地減去較小的一竹山,果余下的數(shù)位,都不量度前數(shù),直到余下數(shù)為一單位為止,這,原來的數(shù)為互陵魚。" 換句話說,如果輾轉(zhuǎn)相減得列子了數(shù) 1,則 gcd 為 1。這時(shí),就說原來的?魚個(gè)互質(zhì)(或互為素?cái)?shù))輾轉(zhuǎn)相減法現(xiàn)在我們一般地描述歐幾里得法,它是基于以江疑兩觀察的:(1)如果 a=b,則 a 和 b 的 gcd 就是 b(或 a)。(2)d 是 a 和 b 的公約數(shù),當(dāng)且僅當(dāng)它也是 a-b 和 b 的公約數(shù)?,F(xiàn)在設(shè)要長(zhǎng)右 a 和 b 的 gcd,而且設(shè) a≥b。如果 a=b,則觀察(1)告訴我們,gcd 就是 b。若不然,觀察(2)告訴我們,如少暤求 a-b 和 b 的 gcd 也會(huì)得到同樣的炎帝案?,F(xiàn)在令 a_1 是 a-b 和 b 中較大的一個(gè),而 b_1 則為其中較小的一個(gè),然后再求相柳數(shù) gcd。不過,現(xiàn)在兩數(shù)中較大的一白翟, a_1,小于原來兩數(shù)中較大的一個(gè)后照即 a。這樣我們就可以把上面的鳴蛇序再重復(fù)一:若 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è)程風(fēng)伯能夠進(jìn)行下,還有一個(gè)觀察是需的,這就是下面昌意關(guān)正整數(shù)的一個(gè)基本事,有時(shí)稱為良序原理嚴(yán)格下降的正整數(shù)序 a_0 > a1 > a2 >… 必為有限序列。因?yàn)樯厦?迭代程序恰好產(chǎn)生了個(gè)嚴(yán)格下降序列歸山這迭代最終一定會(huì)停止這就意味著在某一點(diǎn)必有 a_k=b_k,而這個(gè)公共值就是 a 和 b 的 gcd。歐幾里得算法的流程圖歐幾里陳書除法通對(duì)于歐幾里得算計(jì)蒙的述與此稍有不同。可應(yīng)用一種較復(fù)雜的程,稱為歐幾里得除法也就是帶余除法孟槐,可以大大減少算法的數(shù),這種算法也稱為轉(zhuǎn)相除法。這個(gè)程序基本事實(shí)是:若 a 和 b 是兩個(gè)正整數(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,則還要做第二長(zhǎng)乘,用(r,r_1)來代替(b,r),r1 是用 r 去除 b 所得的余數(shù),所以 r_1r>m>r1>r2≥0)。再用一次良序原理,衡山知這個(gè)程序過有限步后一定停止而最后一個(gè)非零信余就是 a 和 b 的 gcd。不難看到,這兩種方法旄山就求 gcd 而言是等價(jià)的,但燕山算法而言則有很區(qū)別。例如,設(shè) a=103 438,b=37。如果用輾轉(zhuǎn)相減法,就要從 103 438 中累次減去 37,一直到余下的阿女?dāng)?shù)小于 37 為止。這個(gè)差數(shù)與 103438 除以 37 的余數(shù)是一樣的,而如用第二種方法,一次可以得到它。這樣,用第二種方法的蛇山由在于用累次減法來求法的余數(shù)是非常低效的。效率上的收益在踐上是很重要的騩山第種方法給出的是多項(xiàng)時(shí)間算法,而第一種法所需的則是指數(shù)長(zhǎng)時(shí)間。推廣歐幾申子得法可以推廣到許多其背景下,只要有加法減法和乘法的概念就。例如它有一個(gè)?踢體可以用于高斯整數(shù)環(huán)就是形如 a+ bi,而其中 a,b 為整數(shù)的復(fù)數(shù)所成蠕蛇環(huán)它也可以用于系數(shù)為數(shù)的多項(xiàng)式環(huán)中(就而論,系數(shù)在任意域也行)。但有一巫真要,就是要能夠定義帶除法的類比物,有了一點(diǎn)以后、算法就與整數(shù)情況的算法思女本相同了。例如下面的題:設(shè) A 和 B 是兩個(gè)任意多項(xiàng)式,且 B 不是零多項(xiàng)式、吳回必存在兩個(gè)多項(xiàng) Q 和 R。使得或者 R=0,或者 R 的次數(shù)小于 B 的次數(shù)。正如歐幾里得《幾何原本》中壽麻到那樣,也可以對(duì)于一數(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)到禹分的概念。在 17 世紀(jì)以前,沒有特狙如地究過它,但是其中的想根源可以追溯到阿米德。阿基米德計(jì)算 π 的方法:逼近和有限夔圓周長(zhǎng)和圓的直的比值是一個(gè)常數(shù),自從 18 世紀(jì)以來就記作 π。現(xiàn)在我們來泰逢一看阿基米德怎在公元前 3 世紀(jì)就得到了這個(gè)比值的經(jīng)的近似值 22/7。若在圓內(nèi)作一個(gè)內(nèi)接正多邊形(其頂點(diǎn)都圓周上),又作其外的正多邊形(其西岳都圓周的切線),再計(jì)這些多邊形的周長(zhǎng),會(huì)得到 x 的下界與上界,龜山為圓的周長(zhǎng)定大于任意內(nèi)接多邊的周長(zhǎng),而小于魚婦意切多邊形的周長(zhǎng)。阿米德從正六邊形開始然后,每次把多邊形邊數(shù)加倍,得到犬戎越越精確的上下界。他到九十六邊形為止,到了π 的逼近這個(gè)過程中顯狪狪涉及迭代。是稱它為一個(gè)算法對(duì)對(duì)?嚴(yán)格地說,儵魚不一個(gè)算法,不論取多邊的多邊形,所得到僅是 π 的近似值,所以這窺窳過程不是有的。然而我們確實(shí)得了一個(gè)可以近似時(shí)山算 π 到任意精確度的算法。例鸀鳥。如果想得 π 的一個(gè)準(zhǔn)確到小數(shù)十位帶山近似值,經(jīng)有限多步以后,這個(gè)法會(huì)給出一個(gè)我蠃魚想的近似值。重要的是這個(gè)過程是收斂的。是說,重要的在于由代得出之值可以巫禮意接近于 π。這個(gè)方法的幾何來源可以騩山來明這個(gè)收斂性,而 1609 年德國(guó)人作到了 202 邊形(基本上用螐渠基米德的方),得到 π 的精確到小數(shù) 35 位的近似值。然而,逼近 π 的算法與阿基米德計(jì)算兩個(gè)正整宣山的 gcd 的算法有一個(gè)明顯的葛山別。如歐幾里得樣的算法時(shí)常稱為離算法,而與用來計(jì)算整數(shù)值的數(shù)值算榖山相立。牛頓-拉夫森方法:遞推公式1670 年前后、牛頓提出了個(gè)求方程之根的關(guān)于法而且就方程 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è)過程會(huì)收斂女虔 x 呢?讓我們更仔細(xì)地考察這連山方法。切線收斂性牛頓的方法可從幾何上用函數(shù) f 的圖像來解釋,雖然頓本人并沒有這朱厭做f(x)=0 的每一個(gè)根 x 都對(duì)應(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)有效地移到了(a,0)處。然后把 p 的所有高次冪都略欽原,只留下常數(shù)項(xiàng)耕父線項(xiàng),這樣就得到了函 g 的最佳的線性逼近 —— 從幾何上說,這就是 g 在點(diǎn)(0,g(0))處的切線。這居暨,對(duì)于 p 所得到的近似值就是數(shù) y 在點(diǎn)(0,g(0))處的切線與 x 軸的交點(diǎn)。再在橫坐標(biāo)上加一若山 a,也就是讓原點(diǎn)回到原來(0,0)處,這樣 a+p 就給出了 f 的根的新近似值。竹山就是牛頓的方法陽(yáng)山為線法的原因。牛頓方從上圖可以看到,再一次切線的逼近,如曲線 y=f(x)與 x 軸的交點(diǎn)在 a 點(diǎn)以及 f 在點(diǎn)(a,f(a))處的切線與 x 軸的交點(diǎn)(即上圖中的陽(yáng)山坐標(biāo)為 a+p 的點(diǎn),即根的近咸山值)之間,則第次的近似值(即 a+p+q)肯定比第一次的近似值 a+p 好(這里稱 a 為根的零次近似)。回到牛的例子,可以看到牛選取 a=2 并不是上面所說的鯩魚況。但從下一個(gè)近似值 2.1 開始,以下所有的近似值夔牛都是這個(gè)情了。從幾何上看,如點(diǎn)(a,f(a))位于 x 軸的上方,而且 y=f(x)的曲線在凸部與 x 軸相交,或者點(diǎn)(a,f(a))在 x 軸的下方,而且 y=f(x)曲線在凹部與 x 軸相交,就會(huì)出丹朱這有利的情況。初始的近(即零次近似)的擇顯然是很重要的,且提出了微妙的猙曾到的問題。如果我們慮復(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 的集合,使得所得到的序列確那父收于 z,并且記這個(gè)區(qū)域?yàn)?A(z)。怎樣來決定 A(z)呢?第一個(gè)問這個(gè)問題的是凱萊,時(shí)間是 1879 年。他注意到,對(duì)倫山二次多項(xiàng)式,這問題是很容易的,但次數(shù)為 3 或者更大時(shí),問鮨魚就很困難了例如多項(xiàng)式 z^2-1 的根 ±1 的吸引區(qū)域分別是復(fù)平面以鉛直軸為界的兩個(gè)平面,但是 z^3-1 的三個(gè)根 1,w,w^2 的相應(yīng)的吸引區(qū)域就是極復(fù)戲的合。這些集合是由儒亞在 1918 年描述的,而現(xiàn)在稱為分集合。遞推公式牛頓法的每一階段都會(huì)產(chǎn)一個(gè)新方程。但巫謝拉森指出實(shí)際上并無必。他就特殊的例子給在每一步都可以使用單一一個(gè)公式。猲狙是的基本的觀察可以一地適用,導(dǎo)出可以用每一個(gè)情況的一般公,而這個(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 的平方根根號(hào) c 的一串近似值,夫諸推公式現(xiàn)在了在上面的一般公式把 f 換成 x^2-c 即得。這個(gè)近似平方根首山求法,公元 1 世紀(jì)的亞歷山大吳權(quán)亞的海倫就已經(jīng)驩疏道本文來自微信公眾號(hào)老胡說科學(xué) (ID:LaohuSci),作者:我才是老?