我将如何为 k 的十进制倍数构建广义 DFA?

问题描述

假设我有这样一种语言:L_k:={w∈Σ∗: (w)10=i·k,i∈N}。 现在使用 k 作为参数


我现在想定义一个 DFA,它接受 L_{k}- 并证明这个 DFA 是有效的。重要提示:k 是一个参数,所以条件和转移函数依赖于 k。

非常感谢您的帮助!

解决方法

一个简单的解决方案是,在每个状态中,存储当前和下一个除以k后的余数;

下一个余数在您读取 0 后的余数之后。

因此您将使用状态 S={(i,j) : 0≤i,j<k\},其中 (0,0) 是初始状态。

读完一个数字 q 后,你会从 (i,j) 移动到 (j+q mod k,10(j+q) mod k)

每个状态 (0,j) 都是最终状态,因为那里的当前余数为 0。

为了证明这是正确的,让 x 表示一些十进制数,下一个余数为 j。所以 x0 有余数 j。如果我们读取 0 以外的数字,例如 q,那么我们将得到 xq,它的余数为 j+q mod k(紧随模运算,如 xq-x0 = q),并且下一个余数是 xq0 = xq * 10 的余数,所以只需 (j+q)*10 mod k

所以 i 确实是当前的余数,j 是下一个余数。

,

我读这个的方式是你想要一个 DFA 接受语言 0,4,8,12,16,...,4n,for k = 4,or 7,14,21,28,7n,... 对于 k = 7。

为了实现这一点,您的 DFA 将始终以初始状态开始,对应于除以 0 的 k 后的余数。此状态始终可接受,因为 0 是任何 k 的整数倍。

现在,当我们读取一个数字时,我们正在做的是更新我们对到目前为止所读取数字的理解:到目前为止我们所理解的数字实际上比我们想象的要大十倍,再加上这个数字。假设我们处于对应于除以等于 m 的 k 后的余数的状态,我们读取的下一个数字是 d。然后:

m' = (10 * m + d) % k

我们可以通过对我们目前已经理解的除法后的余数进行变换,得到新理解的数除以 k 后的余数。因为我们需要跟踪这个结构的工作是到目前为止理解的数字除以 k 后的余数(我们通过读取输入免费得到 d,并且可以立即忘记它),我们只需要恰好 k 个状态在我们的 DFA 中。

k = 7 的结果如何?

m = 0,d = 0: m' = 0; transition from q0 to q0 on symbol 0
       d = 1: m' = 1; transition from q0 to q1 on symbol 1
       d = 2: m' = 2; transition from q0 to q2 on symbol 2
       d = 3: m' = 3; transition from q0 to q3 on symbol 3
       d = 4: m' = 4; transition from q0 to q4 on symbol 4
       d = 5: m' = 5; transition from q0 to q5 on symbol 5
       d = 6: m' = 6; transition from q0 to q6 on symbol 6
       d = 7: m' = 0; transition from q0 to q0 on symbol 7
       d = 8: m' = 1; transition from q0 to q1 on symbol 8
       d = 9: m' = 2; transition from q0 to q2 on symbol 9
...
m = 6,d = 0: m' = 4; transition from q6 to q4 on symbol 0
       d = 1: m' = 5; transition from q6 to q5 on symbol 1
       d = 2: m' = 6; transition from q6 to q6 on symbol 2
       d = 3: m' = 0; transition from q6 to q0 on symbol 3
       d = 4: m' = 1; transition from q6 to q1 on symbol 4
       d = 5: m' = 2; transition from q6 to q2 on symbol 5
       d = 6: m' = 3; transition from q6 to q3 on symbol 6
       d = 7: m' = 4; transition from q6 to q4 on symbol 7
       d = 8: m' = 5; transition from q6 to q5 on symbol 8
       d = 9: m' = 6; transition from q6 to q6 on symbol 9

我们得到了一个具有 7 个状态和 70 个转换的 DFA。一般来说,这种方法总是会给出一个具有 k 个状态和 10k 个转换的 DFA。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...