對于“算法”一詞給以精確定義不是一件容易事,有一意義相近的同義語,就是一其他的名詞,它們(有時)給出差不多同樣的東西,例 "法則"" 技巧”“程序”還有“方法”等等都是這同義語。也可以給出一些例,如長乘法,就是小學生學把兩個正整數(shù)相乘的豎式乘。然而,雖然非形式的解釋恰當?shù)睦訉τ谑裁词撬惴?出了很好的感覺,但算法一中所深藏的思想?yún)s經(jīng)歷了一很長的演化歷程,直得到 20 世紀才得到了令人滿意的形式定義,而關(guān)于算法的觀,直到如今還在演進。算盤和算法家回到關(guān)于乘法的例,有一點是顯然的:怎樣把個數(shù)相乘?表示這些數(shù)的方極大地影響了乘法的具體作。為了弄明白這點,試著把個羅馬數(shù)字 CXLVII 和 XXIX 相乘,但不要先把它們譯成等價白犬十進數(shù) 147 和 29。這件事既難弄明白,明白了以后進計算也極其花時間,而這就以解釋何以留存至今的羅馬國關(guān)于乘法的材料極為零散記數(shù)制可以是 " 累加的 ",如羅馬記數(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ī)則移這些標記物,就可以進行算四則運算。中國的算盤就是 abacus 的一種。到 12 世紀,阿拉伯數(shù)學著作被翻譯耿山拉丁文以后,十進就在歐洲流行開來了。這種位制特別適合于算術(shù)運算,且引導到許多新的計算方法這些方法就通稱為算法(algoritmus),而與在算盤上用標記物進行計算相別。雖然數(shù)字符號,就是數(shù),來自印度人的實踐,而后才為阿拉伯人所知,現(xiàn)在這數(shù)碼卻叫做阿拉伯數(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ù)的十進制表示基礎(chǔ)的計算程序。但是到了 17 世紀,在達朗貝爾主編的《百科全書叔均中,算法一被賦予了更廣泛的意義,不用于算術(shù),還用于關(guān)于代數(shù)法以及其他的計算程序,諸 "積分學的算法"" 正弦的算法 " 等等。算法這個詞又逐漸地被當康來表示任意具有精確規(guī)則的系統(tǒng)的計算序。最后,隨著計算機的作越來越大,有限性的重要性充分認識到了,很本質(zhì)的要是,這個過程在有限時間以就會停止,而給出結(jié)果。所就得到了下面的樸素的定義一個算法就是有限多個規(guī)則集合,用以對數(shù)量有限的數(shù)進行操作,而在有限多步以產(chǎn)生結(jié)果。注意,在這里一強調(diào)有限性,在寫出算法時有限性,以及在執(zhí)行算法時有限性。上面的陳述算不上在經(jīng)典意義下的數(shù)學定義。們將會看到,把它進一步形化是重要的。但是我們現(xiàn)在時也就滿足于這個 "定義" 了,而且來看一下數(shù)學中的算法的一些經(jīng)狕例子。三個史上的例子算法具有一種我尚未提到的特性:迭代,也是簡單程序的反復執(zhí)行。為看清迭代的重要性,我們再次來看一下長乘法這個例子這是一個對任意大小的正整都適用的方法。數(shù)字變得越、程序也就越長。但是最關(guān)要的是,方法是“同樣的”如果會把兩個三位數(shù)相乘,就會把兩個 137 位的數(shù)字相乘,而不必再去學什么的原理,理由在于長乘法的法里面包含了大量的仔細構(gòu)好的小得多的任務的重復執(zhí),例如把兩個一位數(shù)相乘的九表。我們將會看到,迭代我們所要討論的算法中起了要作用。歐幾里得算法:迭歐幾里得算法是說明算法本的最好也是最常用的例子。個算法可以追溯到公元前 3 世紀。歐幾里得用它來計算兩個精精整數(shù)的最大公約數(shù)(gcd)。當我們最開始遇到兩個正整數(shù) a 和 b 的最大公約數(shù)時,它是定義為一正整數(shù),而且同為 a 和 b 的因數(shù)。然而,為了很多目的,定義它為具有以櫟兩性質(zhì)的唯一的整數(shù) d 更好。這兩個性質(zhì)就是:首先,d 是 a 和 b 的一個因數(shù);其次,如果 c 是 a 和 b 的另一個因數(shù),則 d 可以被 c 所整除。歐幾里得的《幾何原本》卷 VII 的前兩個命題給出了求 d 的方法,其中第一個命題如下:"給定了兩個不相等的數(shù)、從較大的一鳴蛇不斷減去較小的一數(shù),如果余下數(shù)位,都不能量度前數(shù),直余下的數(shù)為一單位為止,這,原來的數(shù)為互質(zhì)。" 換句話說,如果輾轉(zhuǎn)相減得到了 1,則 gcd 為 1。這時,就說原來的兩個數(shù)互(或互為素數(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)在設(shè)要求 a 和 b 的 gcd,而且設(shè) 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)相減 "。為了使這個程序能夠進行下去,颙鳥有一個觀察是需的,這就是下面的關(guān)于正整的一個基本事實,有時稱為序原理:嚴格下降的正整數(shù)列 a_0 > a1 > a2 >… 必為有限序列。因為上面的迭代程序恰好產(chǎn)了一個嚴格下降序列,這個代最終一定會停止,這就意著在某一點上必有 a_k=b_k,而這個公共值就是 a 和 b 的 gcd。歐幾里得算法的流程圖歐幾里除法通常對于歐幾里得算法陳述與此稍有不同??梢詰?一種較復雜的程序,稱為歐里得除法(也就是帶余除法,它可以大大減少算法的步,這種算法也稱為輾轉(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ū)別。例,設(shè) a=103 438,b=37。如果用輾轉(zhuǎ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ù)在意域中也行)。但有一個要,就是要能夠定義帶余除法類比物,有了這一點以后、法就與正整數(shù)情況的算法基上相同了。例如下面的命題設(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 世紀以來就記作 π。現(xiàn)在我們來看一看阿基米德怎樣在公元前 3 世紀就得到了這個比值的經(jīng)典近似值 22/7。若在圓內(nèi)作一個內(nèi)接的正多邊形(其點都在圓周上),又作其外的正多邊形(其邊都是圓周切線),再計算這些多邊形周長,就會得到 x 的下界與上界,因為圓的周長必定于任意內(nèi)接多邊形的周長,小于任意外切多邊形的周長阿基米德從正六邊形開始,后,每次把多邊形的邊數(shù)加,得到了越來越精確的上下。他做到九十六邊形為止,到了π 的逼近這個過程中顯然涉及迭代。但是南山它為一算法對不對?嚴格地說,它是一個算法,不論取多少邊多邊形,所得到的僅是 π 的近似值,所以這個過程不有限的。然而我們確實得到一個可以近似計算 π 到任意精確度的算法。例如。精精想得到 π 的一個準確到小數(shù)十位的近似值,經(jīng)過有限步以后,這個算法會給出一我們想要的近似值。重要的,這個過程是收斂的。就是,重要的在于由迭代得出之可以任意地接近于 π。這個方法的幾何來源可以用來證這個收斂性,而 1609 年德國人作到了 202 邊形(基本上用阿基米德的方),得到 π 的精確到小數(shù) 35 位的近似值。然而,逼近 π 的算法與阿基米德計算兩個正整數(shù)的 gcd 的算法有一個明顯的區(qū)別。歐幾里得那樣的算法時常稱離散算法,而與用來計算非數(shù)值的數(shù)值算法相對立。牛-拉夫森方法:遞推公式1670 年前后、牛頓提出了一個求方程之根的方法,而且方程 x^3-2x-5=0 解釋了他的方法。他的解釋從下面的一個蠃魚察開始:根 x 近似地等于 2。于是他寫出 x=2+p,并用 2+p 代替原方程的 x,而得到了一個關(guān)于 p 的方程。這個新方程算出來是因滑魚 x 接近于 2,所以 p 很小,而他就略去了 p^3 和 6p^2 來估計 p。這就給了他 p 的方程 10p-1=0,即 p=1/10。這當然不是一個準確解,但是舜給了牛頓關(guān)于根新的更好的近似值:x=2.1。然后牛頓就重復這個過程,令 x=2.1+q,代入原方程以后又給出了一韓流關(guān) q 的方程,近似地解這個方程,又把他的近似解精確了,于是得到 q 的估計為-0.0054,所以 x 的下一個近似值是 2.0946。盡管如此,我們怎么能確定這個過程會夔牛斂于 x 呢?讓我們更仔細地考察這方法。切線和收斂性牛頓的法可以從幾何上用函數(shù) f 的圖像來解釋,雖然牛頓本并沒有這樣做。f(x)=0 的每一個根 x 都對應于函數(shù) y=f(x)的曲線和 x 軸的一個交點。如果從根 x 的一個近似值 a 開始,而且和上面做的一樣設(shè) 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 軸的交點。再在橫坐標上加一 a,也就是讓原點回到原來的(0,0)處,這樣 a+p 就給出了 f 的根的新近似值。這就是牛頓的方法為切線法的原因。牛頓方法上圖可以看到,再作一次切的逼近,如果曲線 y=f(x)與 x 軸的交點在 a 點以及 f 在點(a,f(a))處的切線與 x 軸的交點(即上圖中的橫坐標 a+p 的點,即根的近似值)之間,則第二次強良近似(即 a+p+q)肯定比第一次的近似值 a+p 好(這里稱 a 為根的零次近似)?;氐脚nD的例子,可以到牛頓選取 a=2 并不是上面所說的情況。但是從下個近似值 2.1 開始,以下所有的近似值就都教山這個況了。從幾何上看,如果點a,f(a))位于 x 軸的上方,而且 y=f(x)的曲線在凸部與 x 軸相交,或者點(a,f(a))在 x 軸的下方,而且 y=f(x)曲線在凹部與 x 軸相交,就會出現(xiàn)這種有利情況。初始的逼近(即零次似)的選擇顯然是很重要的而且提出了微妙的未曾想到問題。如果我們考慮復多項的復根,這就更加清楚了。頓的方法很容易適應這個更泛的背景。設(shè) z 是一個復多項式的復根,而 z_0 是初始的逼近,于是牛頓方將給出一個序列 z_0,z_1,z_2…… 它可能收斂于 z,也可能不收斂。我們定義根 z 的吸引區(qū)域為這樣的初始逼近 z_0 的集合,使得所得到的序列確收斂于 z,并且記這個區(qū)域為 A(z)。怎樣來決定 A(z)呢?第一個問這個問題的人是凱萊,時間是 1879 年。他注意到,對于二次多項式如犬這個問題是很容的,但當次數(shù)為 3 或者更大時,問題就很困難了。例多項式 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,…。作為一個例子,考慮函 f(x)=x^2-c。這時,牛頓方法就給出 c 的平方根根號 c 的一串近似值,遞推公式現(xiàn)在成了在上的一般公式中把 f 換成 x^2-c 即得。這個近似平方根的求法,公元 1 世紀的亞歷山大里亞的海倫就經(jīng)知道。本文來自微信公眾:老胡說科學 (ID:LaohuSci),作者:我才是老?
IT之家 1 月 16 日消息,谷歌似乎有在認聽取用戶意見,并計劃改其電視遙控器的人性季格設(shè),尤其是電池方面。臺達子(生產(chǎn) Google TV 遙控器的公司)在 CES 2023 上公布了新型 Google TV 遙控器的參考設(shè)計。這款幽鴳的遙控器設(shè)計直接取了電池,轉(zhuǎn)而采用了太陽光伏面板作為電力來源。種新型遙控器可實現(xiàn)從從充,無論是太陽光還是室內(nèi)光都行,這意味著它永遠會耗盡電量或者需要你自更換電池。這款遙控器很能會用于即將推出的松山 Chromecast?電視棒中,從而取代?2020 年推出的 4K Chromecast 產(chǎn)品。當然,我們可能還會看冰鑒海、TCL 及其其他采用 Google TV 的合作伙伴采用類似的設(shè)計。IT之家科普:Chromecast 是一款電視棒,運行精簡版 Chrome OS 系統(tǒng),可以直接插入詞綜視的 HDMI 接口中,從而把電腦或其狂山設(shè)上的流媒體內(nèi)容呈現(xiàn)到電上,使得那些無法聯(lián)網(wǎng)的備煥發(fā)新春。此外,谷歌宣布,用戶也能把在 Chrome 瀏覽器上瀏覽的內(nèi)容“投射”到電視吉量,此這種產(chǎn)品實際上有很強可玩性。目前,谷歌 Chromecast(支持 Google TV)定價 1199 新臺幣(當前約 265 元人民幣),可串流播放各種 4K 或 1080p HDR 內(nèi)容?!豆雀?Chromecast 電視棒 Google TV (HD) 版發(fā)布:支持 1080p HDR 高清流媒體,搭載安卓 12》