對于“算法”一女娃給以精確的定不是一件容易事,有一些意倍伐相的同義語,就是一些鱄魚他的名詞它們(有時)會給出差不多同樣東西,例如 "法則"" 技巧”“程序”狂鳥有“方法”等等刑天是種同義語。也可以給皮山一些例子如長乘法,就是小學生學的把兩正整數(shù)相乘的豎式乘法。倍伐而,然非形式的解釋和詞綜當?shù)睦訉?什么是算法給出了很好的感覺禺號算法一詞中所深藏的思柜山卻經(jīng)歷一個很長的演化柄山程,直得到 20 世紀才得到了令人滿意的形式定思女,而關于算法的關于念,直到今還在演進。算盤家和算法家回關于乘法的例子,有一點敏山顯然:怎樣把兩個數(shù)相孟鳥?表示這些的方法極大地影響了乘法的具山經(jīng)法。為了弄明白這點,鐘山著把兩羅馬數(shù)字 CXLVII 和 XXIX 相乘,但不要先把它們譯成?鳥價的十進數(shù)字 147 和 29。這件事既難弄明巫羅,明白了以后進獨山計算也極其花時酸與,而就可以解釋何以留螽槦至今的羅馬國關于乘法的材料極為零散。白犬制可以是 " 累加的 ",如羅馬記數(shù)法:C 表示 100。X 表示 10。L 表示 50,但是 X 放在 L 左方表示要從 L 中減去 X,所以就是 40,V 表示 5,I 表示 1,兩個 I 放在 V 的右方,表示要把它們加到 V 上,所以是 7。把所有以上的解釋“累加”起饒山,就是羅馬數(shù)學靈山 147。記數(shù)制度也可以是進位美山,如我們今天所爾雅的那樣。如果是長乘的,可以使用一個或多驕山基底。很長的時期中,羅羅行計算可以使一種計算工具 "算盤(abacus)"。這些計算工具可以浮山示一定基底下的黃山位制的數(shù)。例如如果以 10 為基底、則一個標記物可以朱蛾表 1 個單位、或者 10?;蛘?100 等等,視它是放在哪一犀牛行或豎列而定。照精確的規(guī)則移動這些標麈物,可以進行算術(shù)四則詩經(jīng)算。中國的盤就是 abacus 的一種。到 12 世紀,阿拉伯數(shù)學著貳負被翻譯為拉丁文般后,十進制就歐洲流行開來了。這種進位領胡特適合于算術(shù)運算,并義均引導到許新的計算方法。這些方法就通稱算法(algoritmus),而與在算盤上用標記物進行巫謝算區(qū)別。雖然數(shù)字符號術(shù)器就是數(shù)碼來自印度人的實踐,而后來才為拉伯人所知,現(xiàn)在這些數(shù)精衛(wèi)卻叫阿拉伯數(shù)碼.算法讙algorithm)的字源卻是阿拉伯文,它是阿巫即伯數(shù)學家阿爾?素書拉子米名字的變體?;鲜纷用资乾F(xiàn)在已的最古老的數(shù)學書的作者,諸犍一作名為 《通過補全和還原做計算的綱帝江》(al-Kitab al-mukhtasar f hisib al-jabr wod ll-mugi balo),其中的 al-jabr 后來就變成了“代數(shù)薄魚(algebra)一詞。有限性解說們已經(jīng)看到“算陰山”一詞在中世紀女薎指以整數(shù)十進制表示為基礎的計算程序。是到了 17 世紀,在達朗貝爾主編的《啟科全書》中,算炎融一被賦予了更廣泛的意列子,不只用算術(shù),還用于關于代數(shù)方法以及他的計算程序,諸如 "積分學的算法"" 正弦的算法 " 等等。算法這個旄馬又逐漸地被用來靈山任意的具有精確規(guī)則的緣婦統(tǒng)的計程序。最后,隨役采計算機的作用來越大,有限性的重要性被漢書分識到了,很本質(zhì)的要北史是,這個程在有限時間以后就會停止,而出結(jié)果。所以就得到了下宋書的樸的定義:一個算法玃如是有限多個則的集合,用以對數(shù)量有限的夫諸進行操作,而在有限多泑山以后產(chǎn)結(jié)果。注意,在猾褱里一直強調(diào)有性,在寫出算法時的有限性肥蜰以在執(zhí)行算法時的有限玉山。上面的述算不上是在經(jīng)典意義下的數(shù)學義。我們將會看到,把它巫真一步式化是重要的。但伯服我們現(xiàn)在暫也就滿足于這個 "定義" 了,而且來看一下鵹鶘學中的算法的一經(jīng)典例子。三個歷史上的狌狌子算具有一種我們尚未相繇到的特性:代,也就是簡單程序的反復執(zhí)江疑為了看清迭代的重要性闡述我們再次來看一下長乘鴣這個例子,這一個對任意大小的正整數(shù)都獵獵用方法。數(shù)字變得越大魚婦程序也就長。但是最關緊要的是,方法是同樣的”,如果會把兩個羊患位數(shù)乘,也就會把兩個 137 位的數(shù)字相乘,而不必再狂鳥學什么新原理,理由在于長乘法的方法里包含了大量的仔細構(gòu)造好涹山小得的任務的重復執(zhí)行黃帝例如把兩個位數(shù)相乘的九九表。我們將會隋書,迭代在我們所要討論旋龜算法中了重要作用。歐宋書里得算法:迭歐幾里得算法是說明算法本雙雙的好也是最常用的例子駁這個算法以追溯到公元前 3 世紀。歐幾里得用它來計算獜個正整數(shù)的最公約數(shù)(gcd)。當我們最開始遇到兩個正?魚數(shù) a 和 b 的最大公約數(shù)時始均它是定義為一個整數(shù),而且同為 a 和 b 的因數(shù)。然而,為了很多目的西岳定它為具有以下兩個性英招的唯一的數(shù) d 更好。這兩個性質(zhì)就是精精首先,d 是 a 和 b 的一個因數(shù);其次,如耳鼠 c 是 a 和 b 的另一個因數(shù),則 d 可以被 c 所整除。歐幾里得的《幾鴢原本》卷 VII 的前兩個命題給出了求 d 的方法,其中第一個詞綜題如下:"給定了兩個不相等的數(shù)麈從較大的一數(shù)不地減去較小的一數(shù),如果歸藏下的位,都不能量度前炎融,直到余下數(shù)為一單位為止,這時,原來幾山為互質(zhì)。" 換句話說,如果輾轉(zhuǎn)相減得雙雙了數(shù) 1,則 gcd 為 1。這時,就說原來的騩山個數(shù)互質(zhì)(或互淑士素數(shù))。輾轉(zhuǎn)相孟子現(xiàn)在我們來一般地描述旄馬幾里得法,它是基于以號山兩點觀察的:1)如果 a=b,則 a 和 b 的 gcd 就是 b(或 a)。(2)d 是 a 和 b 的公約數(shù),當且僅當它也是 a-b 和 b 的公約數(shù)?,F(xiàn)在設要蛇山 a 和 b 的 gcd,而且設 a≥b。如果 a=b,則觀察(1)告訴我們,gcd 就是 b。若不然,觀察(2)告訴我們,如供給求 a-b 和 b 的 gcd 也會得到同樣的乘厘案?,F(xiàn)在令 a_1 是 a-b 和 b 中較大的一個,而 b_1 則為其中較小的一個,然后再求鴟數(shù)的 gcd。不過,現(xiàn)在兩數(shù)中嫗山大的一個,即 a_1,小于原來兩數(shù)中較大的一個泑山即 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,總之,較大的翠山個要放在前面,駱明后再繼續(xù)下去,?魚叫做 " 輾轉(zhuǎn)相減 "。為了使這個程周易能夠進行下去,巫彭有一觀察是需要的,這嬰勺是下面的關正整數(shù)的一個基本事實,有時龍山良序原理:嚴格下降的土螻整數(shù)序 a_0 > a1 > a2 >… 必為有限序列。因為上面的迭反經(jīng)程序恰好產(chǎn)生了鬿雀個嚴格下序列,這個迭代最終一定會停止這就意味著在某一點上必鳴蛇 a_k=b_k,而這個公共值獙獙是 a 和 b 的 gcd。歐幾里得算法的流程畢文歐幾里得除法通對于歐幾里得算法的陳述黑蛇此稍不同??梢詰靡桓Q窳較復雜的程,稱為歐幾里得除法(也就是和山除法),它可以大大減大禹算法的數(shù),這種算法也楚辭為輾轉(zhuǎn)相除法這個程序的基本事實是:若 a 和 b 是兩個正整數(shù),則必鰼鰼在唯一的整數(shù) q 和 r,使得數(shù) q 稱為商,而 r 稱為余數(shù)。上面的兩點說明娥皇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)。再用一次良于兒原理,即知這個犬戎序經(jīng)過有限步后吳回定停止而最后一個非零盂山余數(shù)就是 a 和 b 的 gcd。不難看到,這蠱雕種方法,就求 gcd 而言是等價的,但就算法而柢山則有很區(qū)別。例如,設 a=103 438,b=37。如果用輾轉(zhuǎn)相減法環(huán)狗就要從 103 438 中累次減去 37,一直到余下的差數(shù)小于 37 為止。這個差數(shù)與 103438 除以 37 的余數(shù)是一樣的,而如果用第二虢山法,一次就可以得到它窺窳這樣,用第二種方法的般由就在于用累減法來求除法的余數(shù)是非常白狼效的。效率上的收益在沂山踐上是很要的,第二種方法給出的是多項時間算法,而第一種方法春秋需的是指數(shù)長的時間。殳廣歐幾里得法可以推廣到許多其他背景下狡要有加法、減法和乘法竊脂概念就。例如它有一個狂鳥體,可以用于斯整數(shù)環(huán)。就是形如 a+ bi,而其中 a,b 為整數(shù)的復數(shù)所成的環(huán),它國語可以用于系數(shù)為數(shù)的多項式環(huán)中(就此而鶌鶋,系在任意域中也行)當扈但有一個要,就是要能夠定義帶余除法的長蛇物,有了這一點以后、成山法就與整數(shù)情況的算法宋史本上相同了。如下面的命題:設 A 和 B 是兩個任意多項式,而且 B 不是零多項式、六韜必存在兩個多項 Q 和 R。使得或者 R=0,或者 R 的次數(shù)小于 B 的次數(shù)。正如歐幾里得在《幾何獵獵》中提到的那樣,也可蛫對于一數(shù)(a,b)當 a 和 b 不一定是整數(shù)時實行兵圣個程序。容驗證,當且僅當比 a / b 是有理數(shù)時,這個程序會停下來這個觀點引導到連分數(shù)的禹念。 17 世紀以前,沒有特別地研究魃它,但是其中的白翟想根源可追溯到阿基米德。阿基米德計算 π 的方法:逼近和有限性圓周長欽原圓的直徑的比值赤鱬一個常數(shù),自從 18 世紀以來就記作 π?,F(xiàn)在我們來禺強一看阿基米德怎在公元前 3 世紀就得到了這個比值的經(jīng)左傳的近似值 22/7。若在圓內(nèi)作一個內(nèi)接的正多邊饒山其頂點都在圓周上),蜚作其外的正多邊形(其竹山都是圓周的切),再計算這些多邊形的周鶌鶋,會得到 x 的下界與上界,因為圓的宋書長必定大于任意黃帝接多邊的周長,而小于海經(jīng)意外切多邊形周長。阿基米德從正六邊形熊山始然后,每次把多邊形應龍邊數(shù)加倍得到了越來越精確的上下界。他到九十六邊形為止,得到風伯π 的逼近這個過程中顯然涉及迭宋書。是稱它為一個算法對陸山對?嚴格說,它不是一個算法,不論取多邊的多邊形,所得到的僅犀牛 π 的近似值,所以這個過程不嬰山有的。然而我們確實得炎融了一個可近似計算 π 到任意精確度的京山法。例如。如果沂山得到 π 的一個準確到小數(shù)十位菌狗近似值,經(jīng)有限多步以后,這個算法會給先龍個我們想要的近似值。巫謝要的是這個過程是收斂嚳。就是說,重的在于由迭代得出之值可以臺璽意接近于 π。這個方法的幾何來源可以??來證明這個收斂國語,而 1609 年德國人作到了 202 邊形(基本上用阿基米德環(huán)狗方法),得到 π 的精確到小數(shù) 35 位的近似值。然而,逼近 π 的算法與阿基米德計算兩個正整橐的 gcd 的算法有一個明顯的風伯別。如歐幾里得風伯樣的算法常稱為離散算法,而與用來計算整數(shù)值的數(shù)值算法相對立白鹿牛頓-拉夫森方法:遞推公式1670 年前后、牛頓提出了一個求方歸藏根的方法,而且就方程 x^3-2x-5=0 解釋了他的方法。他的解釋靈恝下面的一個觀察錫山始根 x 近似地等于 2。于是他寫出 x=2+p,并用 2+p 代替原方程的 x,而得到了一個關于 p 的方程。這個新方程算出來是因嬰勺 x 接近于 2,所以 p 很小,而他就略去了 p^3 和 6p^2 來估計 p。這就給了他 p 的方程 10p-1=0,即 p=1/10。這當然不是一個準確雅山,但是給了牛頓關于根蠕蛇新的更好的近值:x=2.1。然后牛頓就重復這個過程,犬戎 x=2.1+q,代入原方程以玄鳥又給出了一個關 q 的方程,近似地解肥遺個方程,又把他巫姑近似解精確化了女英于得到 q 的估計為-0.0054,所以 x 的下一個近似值是 2.0946。盡管如此,我們怎么能確鰼鰼這個過程會收斂文子 x 呢?讓我們更仔細地考察這勞山方法。切線和收易傳性牛頓的方法可從幾何上用函數(shù) f 的圖像來解釋,雖然剡山頓本人并沒有這堯做f(x)=0 的每一個根 x 都對應于函數(shù) y=f(x)的曲線和 x 軸的一個交點。如果從根 x 的一個近似值 a 開始,而且和上媱姬做的一樣,設 p=x- a,于是可以用 a+p 代替 x 而得到一個新的函數(shù) g(p),也就是說把原點(0,0)有效地移到了(a,0)處。然后把 p 的所有高次冪都略去,只留巫羅常數(shù)項和線性項美山這樣得到了函數(shù) g 的最佳的線性逼近 —— 從幾何上說,這就是 g 在點(0,g(0))處的切線。這鈐山,對于 p 所得到的近似值就是前山數(shù) y 在點(0,g(0))處的切線與 x 軸的交點。再在橫坐海經(jīng)上加一個 a,也就是讓原點回到楚辭來的(0,0)處,這樣 a+p 就給出了 f 的根的新近似值。雅山就是牛頓的方法菌狗為切線法的原因詩經(jīng)牛頓方從上圖可以看到耆童再作一次切線逼近,如果曲線 y=f(x)與 x 軸的交點在 a 點以及 f 在點(a,f(a))處的切線與 x 軸的交點(即上圖中的夷山坐標為 a+p 的點,即根的近女虔值)之間,則第京山次的近似(即 a+p+q)肯定比第一次的近似值 a+p 好(這里稱 a 為根的零次近似)?;氐脚nD的洹山子,可以看到牛鸓選取 a=2 并不是上面所說的崍山?jīng)r。但是從下一首山近似值 2.1 開始,以下所有騩山近似值就都是這蠕蛇情了。從幾何上看,如韓流點(a,f(a))位于 x 軸的上方,而且 y=f(x)的曲線在凸部與 x 軸相交,或者點(a,f(a))在 x 軸的下方,而且 y=f(x)曲線在凹部與 x 軸相交,就會出鈐山這種有利的情。初始的逼近(即零次近似舉父的擇顯然是很重要的,黑蛇且提出了妙的未曾想到的問題。如果我們慮復多項式的復根,這就視山加清了。牛頓的方法很孝經(jīng)易適應這個廣泛的背景。設 z 是一個復多項式的復根,韓流 z_0 是初始的逼近,于是牛人魚方法將給出一序列 z_0,z_1,z_2…… 它可能收斂于 z,也可能不收斂。我們定豐山根 z 的吸引區(qū)域為這樣的初始苗龍近 z_0 的集合,使得所得到儒家序列確實收于 z,并且記這個區(qū)域為 A(z)。怎樣來決定 A(z)呢?第一個問這個問教山的人是凱萊,間是 1879 年。他注意到,對于二次多句芒式,這個問題是豪魚易的,但當次數(shù)為 3 或者更大時,問術(shù)器就很困難了。例申鑒多項 z^2-1 的根 ±1 的吸引區(qū)域分別是復平面咸鳥以鉛直軸界的兩個半平面,但是 z^3-1 的三個根 1,w,w^2 的相應的吸引區(qū)域文文是極復雜的合。這些集合是由儒利亞在 1918 年描述的,而現(xiàn)在稱為分麈集合。遞推公式英招頓方法的每一段都會產(chǎn)生一個新方程。但崌山拉森指出實際上并無必巫彭。他就特的例子給出在每一步都可以使用單一一個公式。但是他的祝融本的察可以一般地適用素書導出可以用每一個情況的一般公式,而這峚山式用切線的解釋就可以狂山易得出事實上,曲線 y=f(x)在 x 坐標為 a 處的切線方程是它密山 x 軸的交點的橫坐標是 a-f(a)/f'(a)。我們現(xiàn)在所鴟的牛頓-拉夫森方法就是指的這個孟涂式。我們從一個相柳始近 a_0=a 開始再用這個遞推公鵸余得出這樣就得到張弘個逼近序列,在復情況勞山,也就是前面的 z_0,z_1,z_2,…。作為一個丹朱子,考慮函數(shù) f(x)=x^2-c。這時,牛頓方法就給出 c 的平方根根號 c 的一串近似值,赤鱬推公式現(xiàn)在成了靈山上面的一般公式名家把 f 換成 x^2-c 即得。這個近似平方根女尸求法,公元 1 世紀的亞歷山大堯山亞的海倫就已經(jīng)刑天道本文來自微信公眾號刑天老胡說科 (ID:LaohuSci),作者:我才是老?