繁体   English   中英

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

[英]DFA for binary number equivalent decimal divisible by 3

DFA用于生成可被3、2&5整除的二进制数,这是众所周知的,因为我们首先读取字符串,例如1下一个0接下来0 100是字符串,这是我们首先读取字符串并从右到左分配基数2(二进制幂)。 ....

假设如果我们以相同的顺序读取相同的字符串,但是如果首先读取数字,则首先以2的幂顺序放置数字,如果我们读取1,则它是第一位,而第二位是0,因此对于以上DFA,我们将其读为001,那么我们相反地读取了字符串....那么通过从左到右放置位来实现DFA

制作可计算出类似内容的DFA的通常方法是先制作NFA(因为必须使NFA相对于联合/交叉点等易于编写),然后将NFA转换为DFA。

那么,如何计算二进制数是否可以被3整除呢? 好吧,给定以b为底的数字,您可以通过将mod b-1的数字相加来轻松计算其mod b-1。 给定一个二进制数,您只需简单地将它们成组就可以生成2 k个基数。 因此,对于mod 3,您需要基数4位(成对的位)。 您可以通过使用3位的组来获得mod 7,而将mod 15与4组一起使用,则可以将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。最后一个细微之处是处理奇数位数。 如何处理取决于您的号码是大端还是小端。 对于little-endian,您要将最后的奇数位视为一个数字,因此使边缘中间状态在接受状态的0位上转换为0。 对于大字节序,您可以添加一个附加的开始状态,该状态在单个0或1位上转换为0和1。

我们可以使用Myhill Nerode定理直接指导我们朝该语言的最低DFA迈进。

我们首先检查长度增加的字符串,并询问它们是否与我们已经看到的字符串区分开。

如果字符串后面跟随不同的字符串集以获取目标语言中的字符串,则它们是可区分的。

空字符串e后面可以跟有L中的任何字符串,以获得L中的字符串。将此称为。

字符串0也可以跟在L中的任何字符串之后,以得到L中的字符串。我们也可以允许前导0并忽略它们。 如果您希望使这样的字符串不属于您的语言,则0不同于e。 我们将使其与众不同。

字符串1是可区分的,因为不是L中的所有字符串都可以跟随它并在L中产生一个字符串。的确,片刻的反思将表明L中没有字符串可以跟随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不可区分:我们可以加到1以得到L中的字符串的任何东西,如果也加到100,也会导致L中的字符串。

可能令人惊讶的是,字符串101与字符串10是无法区分的:如果将10加到101,我们可以得到10以得到L中的字符串的任何结果也会导致L中的字符串。

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

  • :e,0、11等
  • <1>:1、100等。
  • <10>: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的状态。

我们现在可以看一下,并在数学上合理化规则。 为了使讨论更简单,我们定义“三个令牌”,如下所示:

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

现在可以将状态理解如下:

  1. <e> :我们已经看到了由三个任意数量的零分隔的三个令牌的序列。
  2. <1> :我们正在查看一个不完整的三令牌,我们看到的部分是与一个模三相同的数字的二进制表示。
  3. <10> :我们正在看一个不完整的三令牌,我们看到的部分是与两个以三为模的数字的二进制表示。

这样的过渡才有意义:

  1. <e> 0 <e> :丢弃分隔三个令牌的0s。
  2. <e> 1 <1> :最初的新三令牌1(mod 3)
  3. <1> 0 <10> :部分三个令牌变为2(mod 3)。
  4. <1> 1 <e> :完成了三个令牌。
  5. <10> 0 <1> :部分三个令牌变为1(mod 3)。
  6. <10> 1 <10> :保留三个令牌的部分2(mod 3)。

看到三个标记的序列就像将三个的倍数乘以不同的2的乘积相乘; 这样的总和可保证被三除。

如果我们要构建一个新的三令牌,则读取下一个符号s将当前值v乘以2,然后将s相加; v' = 2v + s v'可以被3整除的唯一方法是,如果v1 (mod 3)s为1。我们可以忽略v0 (mod 3)s为0的情况,因为在这种情况下,我们处于<e>并在三个标记之间读取0 s。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM