Michael Sipser,計算理論導引(Introduction to the Theory of Computation)Cristopher Moore & Stephan Mertens,計算本質(The Nature of Computation)Boaz Barak,理論計算機科學概論(Introduction to Theoretical Computer Science)Scott Aaronson,從德謨克裡特到量子計算(Quantum Computing Since Democritus)計算機科學
這門課的主題就是
Computer Science is no more about computers than astronomy is about telescopes.
計算機科學與計算機無關,正如天文學與望遠鏡無關。
這句話常被誤傳為是 Dijkstra 說的,但其實是 Michael Fellows 說的。
計算機科學是研究計算的科學
雖然我們已經使用了幾千年算法了,但是算法的數學化是在 20 世紀才完成的事情。
希爾伯特提出了兩個問題
這兩個問題的答案都是 NO
1936,丘奇發明了 Lambda 演算,聲稱這應該是算法的定義1936,哥德爾和 Emil Leon Post 指出丘奇的聲稱是不合理的1936,圖靈描述了一個用於計算的新模型,現在被稱作圖靈機(TM)哥德爾,Kleene,丘奇後來說,圖靈解決了這個問題,算法被定義了1937,圖靈證明了圖靈機和 Lambda 演算是等價的丘奇-圖靈假設:「可計算」指可以被圖靈機的一個函數計算1970,Matiyasevich-Robinson-Davis-Putnam 證明了,沒有算法能解決希爾伯特第十問題
1993 年,喜劇演員 Demetri Martin 在耶魯上了一門數學課《分形幾何》,他的期末項目是,寫了一首 225 個詞的迴文詩。
迴文詩和分形有什麼關係,不知道,他們是個文科學校。
這首詩的全文:
Dammit I'm mad Evil is a deed as I live. God, am I reviled? I rise, my bed on a sun, I melt. To be not one man emanating is sad. I piss. Alas it is so late. Who stops to help? Man, it is hot. I'm in it. I tell. I am not a devil. I level "Mad Dog". Ah, say burning is as a deified gulp in my halo of a mired rum tin. I erase many men. Oh, to be man, a sin. Is evil in a clam? In a trap? No. It is open. On it I was stuck. Rats peed on hope. Elsewhere dips a web. Be still if I fill its ebb. Ew, a spider ... eh? We sleep. Oh no! Deep, stark cuts saw it in one position. Part animal, can I live? Sin is a name. Both, one ... my names are in it. Murder? I'm a fool. A hymn I plug, Deified as a sign in ruby ash - a goddam level I lived at. On mail let it in. I'm it. Oh, sit in ample hot spots. Oh, wet! A loss it is alas (sip). I'd assign it a name. Name not one bottle minus an ode by me: "Sir, I deliver. I'm a dog." Evil is a deed as I live. Dammit I'm mad.
def TwoFingersPalindromeTest(S,n): # ACCEPT iff string S[1]...S[n] is a palindrome lo = 1 hi = n while (lo<hi): if S[lo] != S[hi]: return False lo = lo + 1 hi = hi - 1 return True
這個算法又是 的了。
但是 S[lo] != S[hi],比較兩個在內存上距離很遠的數,真的可以用 的時間完成嗎?hi = hi - 1 如果 hi 是一個很多位的二進位數,真的可以用 的時間減一嗎?
圖靈機模型是不合理的,因為圖靈機沒有 RAM,但是現實裡的計算機都有而 x==x[::-1] 也是不合理的,其實它的運行時間和 x 是有關的,就像 的一樣我們認為像 C 一樣的低層次代碼,或者說 RAM 模型是更合理的RAM 模型
IsPalindrome(x) // x in Σ* lo = 1 hi = n // n is the length of x loop while (lo<hi) // basic flow-control things if S[lo] != S[hi] // access any memory cell in 1 step return False lo = lo + 1 // in 1 step hi = hi - 1 end loop return True
我們真的可以用 1 步完成加一運算嗎?
當然可以,每一個 x86 處理器的計算機都有一個把兩個寄存器加起來的指令但是同時,如果一個數字有 10^6 位,它就不能保存到一個 64 位的寄存器裡了所以我們把整數分成兩類,小整數可以用 1 步完成加一,但是大整數不可以大整數在計算機中以字符串的形式存儲,大整數加法應該是一個字符串算法加法
Add(x,y) /* Assume x,y encoded as base-10 strings with array indices 0...n-1. We freely convert between digit characters and BoundedInts. */ carry = 0 for i from 0 to n-1 do columnSum = x[i] + y[i] + carry z[i] = columnSum mod 10 carry = (columnSum-z[i]) / 10 z[n] = carry return z