※ 引述《roger29 (=======中間選民=======)》之銘言:
: 完全只用0和1理論上應該是可以,不過應該還要經過不少轉換會很麻煩的吧,
: 但是用一些數字來寫程式倒是可以的,這其實就是一個Turing Machine(圖靈機)啊,
: 但是要用圖靈機來寫程式非常困難,一個簡單的指令實作可能要幾十甚至幾百行,
: 既然這樣為什麼不去寫寫C或是Python之類的玩玩就好勒?
: 一個標準的圖靈機是由硬體和軟體兩大部分所組成的,
: 硬體的部分就是一段理想上是無限長一格一格的記錄帶,一個記錄格可以放一個symbol。
: 還有一個讀寫頭,每一次讀寫頭可以讀取某格上的symbol,
: 還可以把這個symbol替換成別的並且選擇移動方向(左右或不動)。
: 軟體就是程式的部分啦,一個圖靈機的指令大致上這樣:
: {current state}{current symbol}{new symbol}{movement}{new state}
: 一開始圖靈機都是從state 0開始,而還沒執行程式前你記錄帶上的東西就是你的input。
: 所以你下一個指令假如是這樣:
: 0 _ 1 R 0
: 這個指令做的事就是若你的state為0且讀寫頭指向的記錄格為空(_),
: 則將此記錄格填入new symbol也就是1,接著往右移動一格(R),
: 跳到新的state(還是0)。
: 所以應該很多人知道這一行指令碼會讓圖靈機做什麼了,
: 他會一直往右寫1寫下去,所以執行之後你的記錄帶看起來大概是這樣:
: ..._ _ _ _ _ _ _ _ _ 1 1 1 1 1 1 1 1 1 1 1 1 1 1...
: ↓
: 讀寫頭起點
: 只要寫一個1的話,也很簡單,只要把上面那一行改成
: 0 _ 1 R 1
: 就可以了,這一行和上面那行的差別只在new state原本是0現在是1,
: 當第一個記錄格被寫入1之後,它會跳到state 1,
: 但由於state 1我們沒有相對應的代碼,所以這個程式就停止了(halt)。
: 像上面這樣,一些更複雜的動作可以也可以用多行指令碼來實作,
: 不過好像還沒看到怎麼用數字寫程式,
: 其實只要做一個很直觀的mapping,就可以把上面一行的五個符號對應成數字了。
: state:原本就是數字(0 1 2...)
: symbol:假設是two-symbol的話,就是0(代表空白)和1。
: movement:往左=0,往右=1,不動=2。
: 類似這樣,就可以把0 _ 1 R 1改成00111,
: 雖然這樣不是只用0和1來寫,但是再經過幾個去轉換,
: 也是可以轉成真的只用二進為來表示這段指令碼。
: 比如先把00111用某種方式轉成十進位的一個自然數,在把這個自然數用二進位表示這樣。
: 不過大概想一下就知道,用這種方法寫程式非常非常沒有效率,
: 介紹一個網站: http://morphett.info/turing/turing.html
: 這是一個圖靈機simulator,即你可以在這裡寫你的圖靈機代碼並用這個模擬器跑,
: google搜尋Turing machine simulator也有其他類似的可以玩。
: 下面這段指令碼拿去是把一串k個1的input變成2k個1的指令,就相當於是乘以2的動作,
: 0 1 2 r 1
: 1 1 1 r 1
: 1 _ 3 l 2
: 2 1 1 l 2
: 2 3 3 l 2
: 2 2 1 r 3
: 3 3 1 * 5
: 3 1 2 r 4
: 4 1 1 r 4
: 4 3 3 r 4
: 4 _ 1 l 2
: 有興趣可以複製這指令碼去跑跑看,假如你初始是111,跑完就會變成111111這樣。
: 實作一個乘以2的指令碼就這麼複雜而且不直觀,沒事幹麻用這玩意寫程式?
: 然後這段可以改寫成一大堆數字:
: 0121111111103122111223312221133312531214411144331440112
: 不過既然圖靈機要實作這麼麻煩,圖靈機還有啥用勒?
: 舉例來說,圖靈機有一個優點就是它的架構非常簡單(相比於我們用的電腦),
: 但是我們可以拿圖靈機來驗證很多東西,藉此知道某些我們電腦的限制,
: 比如一個natural number to natural number的function能不能用電腦計算出來?
: 若圖靈機可以,我們的電腦就可以,反之則不行,
: 而從圖靈機去驗證容易的多,因為它的架構非常簡單,類似這種情形。
各位真強者、pavone、E cup、30cm、勝利組、高富帥、金城武、溫拿、小妹,
大家好!打給後!胎嘎後!AV8D!口泥幾哇!
本魯的朋友說,正如r大所講的,圖靈機的計算能力跟我們用的電腦一樣,但是架構
比較簡單,這裡本魯的朋友舉一個具體的說明:
因為每一單位時間內,圖靈機的讀寫頭只能在記錄帶上面讀寫一格,並至多向左或向
右移動一格,所以每一格會發生什麼事(被讀、被改寫、讀寫頭移來或移走),可以
完全由它和它左右兩格在上一單位時間發生什麼事決定!這其實不難理解:兩格以外
發生的事情,沒辦法在一單位時間內傳遞過來。
所以,在第二單位時間,記錄帶的第i格發生什麼事,取決於在第一單位時間,記錄
帶的第i-1、i和i+1格發生什麼事,這允許我們建立一種小的電路C,C的輸入是「這
一單位時間內,記錄帶上的第i-1、i和i+1格發生什麼事」,其輸出是「下一單位時
間內,記錄帶的第i格發生什麼事」,這個電路C是固定的,只與原來的圖靈機有關,
與i的值究竟是多少無關(這個事實其實不難驗證,但我們省略之)。
現在如果我們量產上一段的電路C,就可以利用它們,從這一單位時間內記錄帶發生
的所有事情,算出下一單位時間內,記錄帶上發生的所有事情(姑且假設記錄帶為
有限長,所以你不需要製造無窮多個電路C,雖然實際上記錄帶是無限長的),例如
,有一個電路C負責從記錄帶的第1、2和3格發生什麼事,計算出下一單位時間內,
記錄帶的第2格發生什麼事,另一個電路C則負責從記錄帶的第2、3和4格發生什麼事
,計算出下一單位時間內,記錄帶的第3格發生什麼事,又一個電路C負責從記錄帶
的第3、4和5格發生什麼事,計算出下一單位時間內,記錄帶的第4格發生什麼事,
以此類推。
這告訴我們:我們可以大量生產一個簡單的小電路C,它們可以「模擬圖靈機一步」
,也就是從這一單位時間會怎樣,算出下一單位時間會怎樣,同樣的事情再做一次
,就可以模擬圖靈機一步、下下一步、下下下一步...
簡言之,圖靈機的動作可以被一大堆一模一樣的簡單小電路C所模擬,如果我們仔細
地檢驗上面的動作,就可以得到:
定理. 一個圖靈機跑t步的過程,可以被一個大小約t平方的電路模擬。
有名的NP-completeness的理論就會用到上述的觀察,在此不贅述。
還有更強大的版本:
定理(Pippenger與Fischer). 一個圖靈機跑t步的過程,可以被一個大小約
t乘以log t的電路模擬。
: ※ 引述《WeiMyWoW (...)》之銘言:
: : 很久以前,那還是我用win98的時候有次我系統崩潰了,
: : 因為我是電腦白吃,我朋友給我介紹了一個高手來幫我修電
: : 腦。
: :
: : 他看了一下電腦,問我有沒有98的光碟,我說沒有。
: :
: : 他想了一下,叫我把固定電話拿給他,我想修電腦要電
: : 話幹什麼,但人家是高手,我也不好說什麼,就把電話拔下
: : 來給他了。
: :
: : 他把電話線空著的一頭接在電腦的一個插孔內,然後進
: : 入了dos,然後就開始在電話上不停的按著鍵,他按鍵的速度
: : 非常快,但是只按0,1兩個鍵,我搞不懂這有什麼用,但也
: : 不敢問,看了半個多小時,他還是不停的按這兩個鍵,我漸
: : 漸的有些睏,我問他這東西要搞多久,他說要幾個小時,我
: : 給他倒了杯茶,就一個人去隔壁睡覺了。
: :
: : 醒來的時候,一看已經過了4個多小時,我起身到隔壁,
: : 看見他正在98裡面調試,過了一會兒,他說,你試試,我坐
: : 上椅子用了一下,真的好了,我當時也不懂電腦,謝過人
: : 家就走了。
: :
: : 後來我慢慢對電腦有了瞭解,終於瞭解,原來當時那位
: : 高手是用機器語言編了一個98系統,我後來問我朋友那位高
: : 手的下落,我朋友說前幾年去了美國之後,杳無音訊....
: :
: : 是說電子訊號本來就是高電位和低電位組成,也就是0和1,但真的可以拿來寫程式嗎?