用于生成可被3,2和5整除的二进制数的DFA已知,因为我们读取字符串例如1下一个0下一个0 100是第一个我们读取字符串的字符串并且来自基数2(二进制幂)从右到左......
假设我们以相同的顺序读取相同的字符串,但是如果我们读取1是第一位和0第二位,则首先按顺序放置数字,所以我们将读取为上面的DFA的001,我们相反地读取字符串... .so从左到右放置位数是什么DFA
答案 0 :(得分:0)
制作计算此类事物的DFA的常用方法是首先制作NFA(因为NFA必须更容易构成连接/交叉/等),然后将NFA转换为DFA。
那么如何计算二进制数是否可被3整除呢?好吧,给定base-b中的数字,你可以通过添加mod b-1的数字轻松计算它的mod b-1。给定二进制数,您只需将它们分组即可生成基数2 k 数字。因此对于mod 3,您需要基数为4位(位对)。你可以通过使用3位组来获得mod 7,使用4组可以获得mod 15.然后可以将mod 15简单地转换为mod 5和mod 3。
那你怎么做一个添加mod n的NFA?您需要一个n个状态的循环,它们对应于值0..n-1,并且在它们之间有过渡以添加位。对于基础3的情况,即3个状态
state 00 01 10 11
0 0 1 2 0
1 1 2 0 1
2 2 0 1 2
这是一个NFA,因此2位转换会通过一个未连接的中间状态。你的开始和接受状态是0.一个最后的微妙处理是奇数个位。你如何处理这取决于你的数字是big-endian还是little-endian。对于little-endian,您希望将最后的奇数位视为一个数字,因此要使边沿中间状态在0位接受状态时转换为0。对于big endian,您可以添加一个额外的启动状态,在单个0或1位上转换为0和1。
答案 1 :(得分:0)
我们可以使用Myhill Nerode定理直接指导我们使用这种语言的最小DFA。
我们首先检查长度越来越长的字符串,并询问它们是否与我们已经看过的字符串有区别。
如果字符串后跟不同的字符串集以获取目标语言的字符串,则可以区分字符串。
空字符串e后面可以跟L中的任何字符串,以获取L中的字符串。调用此方法。
字符串0也可以跟随L中的任何字符串以获取L中的字符串。我们也可以允许前导0并忽略它们。如果你想让这些字符串不是你语言的一部分,那么0与e不同。我们会让它难以区分。
字符串1是可区分的,因为并非L中的所有字符串都可以跟随它并在L中产生字符串。实际上,片刻的反射将显示L中的 no 字符串可以跟随1并导致L中的另一个字符串。调用此< 1>。
我们不需要考虑00和01,因为0与e无法区分,因此00和01与我们已经考虑过的0和1无法区分。
字符串10可以从0和1区分,因为1和11都不能跟随它以在L中产生字符串。调用此< 10>
另一方面,字符串11与e和0完全无法区分:我们可以在L中添加任何字符串来获取另一个字符串。
我们不需要考虑000,001,010,011,110或111,因为之前已经发现前缀无法区分。
字符串100可能令人惊讶地与字符串1无法区分:如果添加到100,我们可以添加到1以获取L中的字符串导致L中的字符串。
字符串101可能令人惊讶地与字符串10无法区分:如果添加到101,我们在L中获取字符串的任何内容都会导致L中的字符串。
我们命名了三类可区分的字符串:
这些占所有可区分前缀的长度不超过三个。 Myhill-Nerode保证有一个最小的DFA,其中三个状态对应于这些等效类。并且过渡不容易弄清楚:如果x = ys,则对应于y类的状态导致对应于符号s上的x类的状态。
Q s Q'
<e> 0 <e>
<e> 1 <1>
<1> 0 <10>
<1> 1 <e>
<10> 0 <1>
<10> 1 <10>
自然地,接受状态是包含L中的字符串的状态;只适合这里的账单。在我们的例子中,初始状态是包含e的状态。
我们现在可以看一下,并以数学方式合理化规则。为了使讨论更简单,我们定义了一个&#34;三个令牌&#34;如下:
三个标记是输入的子字符串,表示一个可以用二进制表示法整除的数字。
现在可以将各州理解如下:
<e>
:我们已经看到了由任意数量的零分隔的三个令牌序列。<1>
:我们正在查看一个不完整的三个标记,我们看到的部分是一个数字的二进制表示,一个模数为三个。<10>
:我们正在查看一个不完整的三个标记,我们看到的部分是一个数字的二进制表示形式,对两个模三重合一。过渡然后才有意义:
<e> 0 <e>
:丢弃分隔三个令牌的0。<e> 1 <1>
:新的三个令牌最初为1(mod 3)<1> 0 <10>
:部分三令牌变为2(mod 3)。<1> 1 <e>
:已完成三个令牌。<10> 0 <1>
:部分三标记变为1(模式3)。<10> 1 <10>
:部分三令牌保持2(模3)。看到三个令牌的序列就像添加三个的倍数,每个乘以不同的2的幂;这样的金额保证可以被三个人分割。
如果我们正在构造一个新的三个标记,则读取下一个符号s将我们当前的值v乘以2,然后加上s;也就是v' = 2v + s
。 v'
可以被3整除的唯一方法是v
是1 (mod 3)
而s
是1.我们可以忽略v
为{{1}的情况}和0 (mod 3)
为0,因为在这种情况下,我们在s
并且在三个令牌之间读取<e>
。