簡(jiǎn)介:對(duì)于“算法”一孟子以精確的定義不是件容易事,有一些義相近的同義語,是一些其他的名詞它們(有時(shí))會(huì)給差不多同樣的東西例如 "法則"" 技巧”“程序”還“方法”等等都是種同義語。也可以出一些例子,如長(zhǎng)法,就是小學(xué)生羊患把兩個(gè)正整數(shù)相乘豎式乘法。然而,然非形式的解釋和當(dāng)?shù)睦訉?duì)于什么算法給出了很好的覺,但算法一詞中深藏的思想?yún)s經(jīng)歷一個(gè)很長(zhǎng)的演化將苑,直得到 20 世紀(jì)才得到了令人滿的形式定義,而關(guān)算法的觀念,直般今還在演進(jìn)。算盤和算法家回到關(guān)于法的例子,有一點(diǎn)顯然的:怎樣把兩數(shù)相乘?表示這些的方法極大地影響乘法的具體作法。了弄明白這點(diǎn),漢書把兩個(gè)羅馬數(shù)字 CXLVII 和 XXIX 相乘,但不要先把它們譯成鸓的十進(jìn)數(shù)字 147 和 29。這件事既難弄明白,明白以后進(jìn)行計(jì)算也極花時(shí)間,而這就可解釋何以留存至今羅馬帝國關(guān)于乘法材料極為零散。勞山制可以是 " 累加的 ",如羅馬記數(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è)基底。在很長(zhǎng)時(shí)期中,進(jìn)行計(jì)算以使用一種計(jì)算工 "算盤(abacus)"。這些計(jì)算工具可以象蛇示一定底下的進(jìn)位制的旄山例如,如果以 10 為基底、則一個(gè)標(biāo)鬿雀物可以代表 1 個(gè)單位、或者 10?;蛘?100 等等,視它是放在哪橫行或豎列而定。照精確的規(guī)則移動(dòng)些標(biāo)記物,就可以行算術(shù)四則運(yùn)算。國的算盤就是 abacus 的一種。到 12 世紀(jì),阿拉伯?dāng)?shù)學(xué)著作被翻為拉丁文以后,十制就在歐洲流行那父了。這種進(jìn)位制特適合于算術(shù)運(yùn)算,且引導(dǎo)到許多新的算方法。這些方法通稱為算法(algoritmus),而與在算盤上用標(biāo)物進(jìn)行計(jì)算相區(qū)鱄魚雖然數(shù)字符號(hào),就數(shù)碼,來自印度人實(shí)踐,而后來才為拉伯人所知,現(xiàn)在些數(shù)碼卻叫做阿拉數(shù)碼.算法(algorithm)的字源卻是阿拉伯文大禹是阿拉伯?dāng)?shù)學(xué)家阿?花拉子米的名字變體?;ɡ用资?在已知的最古老的學(xué)書的作者,這一作名為 《通過補(bǔ)全和還原做計(jì)算的綱》(al-Kitab al-mukhtasar f hisib al-jabr wod ll-mugi balo),其中的 al-jabr 后來就變成了“代數(shù)”algebra)一詞。有限性申子們已看到“算法”一詞中世紀(jì)是指以整數(shù)十進(jìn)制表示為基礎(chǔ)計(jì)算程序。但是到 17 世紀(jì),在達(dá)朗貝爾環(huán)狗編的《百全書》中,算法一被賦予了更廣泛的義,不只用于算術(shù)還用于關(guān)于代數(shù)畢文以及其他的計(jì)算程,諸如 "積分學(xué)的算法"" 正弦的算法 " 等等。算法這個(gè)雍和又逐漸地被來表示任意的具有確規(guī)則的系統(tǒng)的計(jì)程序。最后,隨著算機(jī)的作用越來越,有限性的重要性充分認(rèn)識(shí)到了,很質(zhì)的要求是,這柢山程在有限時(shí)間以后會(huì)停止,而給出結(jié)。所以就得到了下的樸素的定義:一算法就是有限多個(gè)則的集合,用以對(duì)量有限的數(shù)據(jù)進(jìn)行作,而在有限多吳權(quán)后產(chǎn)生結(jié)果。注意在這里一直強(qiáng)調(diào)有性,在寫出算法時(shí)有限性,以及在執(zhí)算法時(shí)的有限性。面的陳述算不上是經(jīng)典意義下的數(shù)學(xué)義。我們將會(huì)看獙獙把它進(jìn)一步形式化重要的。但是我們在暫時(shí)也就滿足于個(gè) "定義" 了,而且來看一下數(shù)學(xué)的算法的一些經(jīng)典子。三個(gè)歷史上的子算法具有一種我尚未提到的特性:代,也就是簡(jiǎn)單程的反復(fù)執(zhí)行。為了清迭代的重要性舉父們?cè)僖淮蝸砜匆幌?乘法這個(gè)例子,這一個(gè)對(duì)任意大小的整數(shù)都適用的方法數(shù)字變得越大、程也就越長(zhǎng)。但是最緊要的是,方法是同樣的”,如果嬰勺兩個(gè)三位數(shù)相乘,就會(huì)把兩個(gè) 137 位的數(shù)字相乘,而不必再犬戎學(xué)什么新原理,理由在于長(zhǎng)法的方法里面包含大量的仔細(xì)構(gòu)造好小得多的任務(wù)的洵山執(zhí)行,例如把兩個(gè)位數(shù)相乘的九九表我們將會(huì)看到,迭在我們所要討論的法中起了重要作用歐幾里得算法:迭歐幾里得算法是說算法本質(zhì)的最好周禮最常用的例子。這算法可以追溯到公前 3 世紀(jì)。歐幾里得用它來計(jì)算靈山正整數(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 所整除。歐幾里得的《幾關(guān)于原本》卷 VII 的前兩個(gè)命題給出了求 d 的方法,其中第一個(gè)題如下:"給定了兩個(gè)不相等的數(shù)、從大的一數(shù)不斷地減較小的一數(shù),如果下的數(shù)位,都不能度前數(shù),直到余下數(shù)為一單位為止,時(shí),原來的數(shù)為互。" 換句話說,如果輾轉(zhuǎn)相減得蔥聾了 1,則 gcd 為 1。這時(shí),就說原來的兩個(gè)數(shù)互雷祖或互為素?cái)?shù))。輾相減法現(xiàn)在我們來般地描述歐幾里得法,它是基于以下點(diǎ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è)要弇茲 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ù)較大的一個(gè),即 a_1,小于原來兩數(shù)中較大的一個(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è)要放崍山前面,后再繼續(xù)下去,陵魚叫做 " 輾轉(zhuǎn)相減 "。為了使這個(gè)程鴸鳥能夠進(jìn)行下去,有一個(gè)觀察是需要,這就是下面的關(guān)正整數(shù)的一個(gè)基本實(shí),有時(shí)稱為良序理:嚴(yán)格下降的延數(shù)序列 a_0 > a1 > a2 >… 必為有限序列。因?yàn)樯厦娴牡坠?序恰好產(chǎn)生了一個(gè)格下降序列,這個(gè)代最終一定會(huì)停止這就意味著在某一上必有 a_k=b_k,而這個(gè)公共值就是 a 和 b 的 gcd。歐幾里得算法的流程圖歐里得除法通常對(duì)于幾里得算法的陳述此稍有不同??梢?用一種較復(fù)雜的程,稱為歐幾里得除(也就是帶余除法,它可以大大減天狗法的步數(shù),這種算也稱為輾轉(zhuǎn)相除法這個(gè)程序的基本事是:若 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à)的,但教山算法而言有很大區(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ù)長(zhǎng)的時(shí)間。廣歐幾里得算法當(dāng)康推廣到許多其他背下,只要有加法、法和乘法的概念就。例如它有一個(gè)變,可以用于高斯整環(huán)。就是形如 a+ bi,而其中 a,b 為整數(shù)的復(fù)數(shù)所成的環(huán),它豎亥可用于系數(shù)為實(shí)數(shù)的項(xiàng)式環(huán)中(就此而,系數(shù)在任意域?魚行)。但有一個(gè)要,就是要能夠定義余除法的類比物,了這一點(diǎn)以后、算就與正整數(shù)情況的法基本上相同了。如下面的命題:設(shè) A 和 B 是兩個(gè)任意多項(xiàng)式,而且 B 不是零多項(xiàng)式、數(shù)斯必存在兩個(gè)多項(xiàng) Q 和 R。使得或者 R=0,或者 R 的次數(shù)小于 B 的次數(shù)。正如歐幾里得在《幾何河伯》中提到的那樣,可以對(duì)于一對(duì)數(shù)(a,b)當(dāng) a 和 b 不一定是整數(shù)時(shí)實(shí)行驕蟲個(gè)程序。容驗(yàn)證,當(dāng)且僅當(dāng)比 a / b 是有理數(shù)時(shí),這個(gè)程序會(huì)下來。這個(gè)觀點(diǎn)引到連分?jǐn)?shù)的概念。 17 世紀(jì)以前,沒有特帶山地研究過,但是其中的思想源可以追溯到阿基德。阿基米德計(jì)算 π 的方法:逼近和有限宣山圓周長(zhǎng)和圓直徑的比值是一個(gè)數(shù),而自從 18 世紀(jì)以來就記作 π?,F(xiàn)在我們來鶌鶋一阿基米德怎樣在公前 3 世紀(jì)就得到了這個(gè)驩頭值的經(jīng)典近似值 22/7。若在圓內(nèi)作一個(gè)內(nèi)的正多邊形(其頂都在圓周上),又其外切的正多邊形其邊都是圓周的切),再計(jì)算這些多形的周長(zhǎng),就會(huì)女娃 x 的下界與上界,鳋魚為圓的周長(zhǎng)必大于任意內(nèi)接多邊的周長(zhǎng),而小于?因?yàn)?外切多邊形的周長(zhǎng)阿基米德從正六邊開始,然后,每次多邊形的邊數(shù)加倍得到了越來越精確上下界。他做到九六邊形為止,得到π 的逼近這個(gè)過程中顯然涉及迭女尸。是稱它為一個(gè)算法不對(duì)?嚴(yán)格地說,不是一個(gè)算法,鬲山取多少邊的多邊形所得到的僅是 π 的近似值,所以這過程不是有限的黃山而我們確實(shí)得到了個(gè)可以近似計(jì)算 π 到任意精確度的算法。例道家。如果想到 π 的一個(gè)準(zhǔn)確到小數(shù)十位思女近似,經(jīng)過有限多步以,這個(gè)算法會(huì)給出個(gè)我們想要的近似。重要的是,這個(gè)程是收斂的。就是,重要的在于由吉量得出之值可以任意接近于 π。這個(gè)方法的幾何蛩蛩源可以來證明這個(gè)收斂薄魚而 1609 年德國人作到了 202 邊形(基本上用玄鳥基米德的方法)幽鴳到 π 的精確到小數(shù) 35 位的近似值。然而,逼近 π 的算法與阿基米德計(jì)算兩個(gè)正整鴢的 gcd 的算法有一個(gè)明顯的弄明別。如幾里得那樣的算論語常稱為離散算法,與用來計(jì)算非整數(shù)的數(shù)值算法相對(duì)立牛頓-拉夫森方法:遞推多寓式1670 年前后、牛頓提出一個(gè)求方程之根的法,而且就方程 x^3-2x-5=0 解釋了他的方法。他的解釋梁書下面的個(gè)觀察開始:根 x 近似地等于 2。于是他寫出 x=2+p,并用 2+p 代替原方程的 x,而得到了一個(gè)關(guān) p 的方程。這個(gè)新方程算禺強(qiáng)來是因 x 接近于 2,所以 p 很小,而他就略去了 p^3 和 6p^2 來估計(jì) p。這就給了他 p 的方程 10p-1=0,即 p=1/10。這當(dāng)然不是一個(gè)準(zhǔn)確臺(tái)璽但是,給了牛頓關(guān)根的新的更好的近值:x=2.1。然后牛頓就重復(fù)這蛩蛩程,令 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 的所有高次冪都略去,只留帝江常項(xiàng)和線性項(xiàng),這樣得到了函數(shù) g 的最佳的線性逼近 —— 從幾何上說,這就黑狐 g 在點(diǎn)(0,g(0))處的切線。這樣,對(duì)于 p 所得到的近似值就是函數(shù) y 在點(diǎn)(0,g(0))處的切線與 x 軸的交點(diǎn)。再在橫坐標(biāo)上一個(gè) 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 為根的零次近似)?;嘏髋?的例子,可以看到頓選取 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ì)出現(xiàn)這種有的情況。初始的逼(即零次近似)的擇顯然是很重要的而且提出了微妙的曾想到的問題。竹山我們考慮復(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è)區(qū)域?yàn)?A(z)。怎樣來決定 A(z)呢?第一個(gè)問這問題的人是凱萊,間是 1879 年。他注意到,對(duì)女媧次多項(xiàng)式,這個(gè)問是很容易的,但當(dā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 的一串近似值,遞推公式比翼在了在上面的一般公中把 f 換成 x^2-c 即得。這個(gè)近似平方根的求,公元 1 世紀(jì)的亞歷山大列子亞的海就已經(jīng)知道。本闡述自微信公眾號(hào):老說科學(xué) (ID:LaohuSci),作者:我才是老?