DFA設計
設計DFA接受{0,1}上的字符串ω,且ω是3倍數的二進制表示
先敘述下思路:
要想證明某數是3的倍數可以讓其除以3看余數是否為零即可,現在我們的問題就是如何計算一串二進制數除以3所得的余數
而二進制表示的一串數可以通過一系列的步驟從短位數除以2所得的值逐漸構造出長位數除以2所得的值我們以5位二進制數10010(18)為例計算
1) 第1位1取余3得1
2) 第2位為0此時數10是1乘以2所得,其除以3的余數為 2 * 1 = 2
3) 第3位為0此時數為100是10乘以2所得,其除以3的余數為(2 * 2) % 3 = 1
4) 第3位為1此時數為1001是100乘以2加1所得,其除以3的余數為(1 * 2 + 1) % 3 = 0
...
我們可以發現最終余數的可能取值只有三種而每兩種之間可以通過讀入的當前最低位為1或者0進行轉換(例如當前余數為0讀入1則余數為((2 * 0) + 1) % 3 = 1)因此我們可以按余數為幾來設計DFA構造如下的DFA:

(需要注意的是當開頭讀入0時證明其為0或者字符串錯誤)
