设计DFA接受{0,1}上的字符串ω,且ω是3倍数的二进制表示

时间:2021-08-29 16:34:25

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:

设计DFA接受{0,1}上的字符串ω,且ω是3倍数的二进制表示

(需要注意的是当开头读入0时证明其为0或者字符串错误)