設計DFA接受{0,1}上的字串ω,且ω是3倍數的二進位制表示

lxy_hit發表於2022-02-28

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或者字串錯誤)

相關文章