[英]How would I change this regular expression to accept a single decimal of .5 at the end?
[英]how would I build a generalized DFA for decimal Multiples of k?
假設我有這樣的語言:L_k:={w∈Σ∗: (w)10=i·k, i∈N}。 現在使用 k 作為參數
我現在想定義一個接受 L_{k}- 的 DFA,然后證明這個 DFA 是有效的。 重要提示:k 是一個參數,因此條件和轉換 function 取決於 k。
我將不勝感激任何幫助!
一個簡單的解決方案是在每個 state 中存儲除以 k 后的當前余數和下一個余數;
下一個余數是在你讀到 0 之后的余數。
因此,您將使用狀態S={(i,j): 0≤i,j<k\}
,其中 (0,0) 是初始 state。
讀取數字 q 后,您將從(i,j)
移動到(j+q mod k, 10(j+q) mod k)
。
每個 state (0,j)
都是最終的,因為那里的當前余數為 0。
為了證明這是正確的,讓x
表示一些十進制數,下一個余數為j
。 所以x0
數j
。 如果我們讀取一個非 0 的數字,比如q
,那么我們將得到xq
,它有余數j+q mod k
(緊跟模算術,如 xq-x0 = q),下一個余數是xq0 = xq * 10
的余數xq0 = xq * 10
,所以很簡單(j+q)*10 mod k
。
所以 i 確實是當前的余數,而 j 是下一個余數。
我讀這篇文章的方式是你想要一個接受語言 0、4、8、12、16、...、4n、...,對於 k = 4 或 7、14、21、28 的 DFA。 .., 7n, ... 對於 k = 7。
要實現這一點,您的 DFA 將始終從初始 state 開始,對應於除以 0 的 k 后的余數。此 state 始終接受,因為 0 是 Z157DB7DF530023575515D366C9B67 的任意倍數
現在,當我們讀到一個數字時,我們正在做的是更新我們對迄今為止所讀到的數字的理解:到目前為止,我們所理解的數字實際上比我們想象的要大十倍,加上這個數字。 假設我們在 state 中,對應於除以 k 后的余數等於 m,我們讀取的下一個數字是 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.