二进制数等效十进制的DFA可被3整除

时间:2017-07-07 16:53:49

标签: automata

用于生成可被3,2和5整除的二进制数的DFA已知,因为我们读取字符串例如1下一个0下一个0 100是第一个我们读取字符串的字符串并且来自基数2(二进制幂)从右到左......

假设我们以相同的顺序读取相同的字符串,但是如果我们读取1是第一位和0第二位,则首先按顺序放置数字,所以我们将读取为上面的DFA的001,我们相反地读取字符串... .so从左到右放置位数是什么DFA

2 个答案:

答案 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中的字符串。

我们命名了三类可区分的字符串:

  • :e,0,11等
  • < 1>:1,100等
  • < 10&gt ;:10,101等

这些占所有可区分前缀的长度不超过三个。 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;如下:

  

三个标记是输入的子字符串,表示一个可以用二进制表示法整除的数字。

现在可以将各州理解如下:

  1. <e>:我们已经看到了由任意数量的零分隔的三个令牌序列。
  2. <1>:我们正在查看一个不完整的三个标记,我们看到的部分是一个数字的二进制表示,一个模数为三个。
  3. <10>:我们正在查看一个不完整的三个标记,我们看到的部分是一个数字的二进制表示形式,对两个模三重合一。
  4. 过渡然后才有意义:

    1. <e> 0 <e>:丢弃分隔三个令牌的0。
    2. <e> 1 <1>:新的三个令牌最初为1(mod 3)
    3. <1> 0 <10>:部分三令牌变为2(mod 3)。
    4. <1> 1 <e>:已完成三个令牌。
    5. <10> 0 <1>:部分三标记变为1(模式3)。
    6. <10> 1 <10>:部分三令牌保持2(模3)。
    7. 看到三个令牌的序列就像添加三个的倍数,每个乘以不同的2的幂;这样的金额保证可以被三个人分割。

      如果我们正在构造一个新的三个标记,则读取下一个符号s将我们当前的值v乘以2,然后加上s;也就是v' = 2v + sv'可以被3整除的唯一方法是v1 (mod 3)s是1.我们可以忽略v为{{1}的情况}和0 (mod 3)为0,因为在这种情况下,我们在s并且在三个令牌之间读取<e>