微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我将如何为 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。