[英]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中的字符串。
我們命名了三類可區分的字符串:
這些占所有不超過三個長度的可區分前綴。 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的狀態。
我們現在可以看一下,並在數學上合理化規則。 為了使討論更簡單,我們定義“三個令牌”,如下所示:
三標記是輸入的子字符串,它表示一個二進制數可以被三均勻整除的數字。
現在可以將狀態理解如下:
<e>
:我們已經看到了由三個任意數量的零分隔的三個令牌的序列。 <1>
:我們正在查看一個不完整的三令牌,我們看到的部分是與一個模三相同的數字的二進制表示。 <10>
:我們正在看一個不完整的三令牌,我們看到的部分是與兩個以三為模的數字的二進制表示。 這樣的過渡才有意義:
<e> 0 <e>
:丟棄分隔三個令牌的0s。 <e> 1 <1>
:最初的新三令牌1(mod 3) <1> 0 <10>
:部分三個令牌變為2(mod 3)。 <1> 1 <e>
:完成了三個令牌。 <10> 0 <1>
:部分三個令牌變為1(mod 3)。 <10> 1 <10>
:保留三個令牌的部分2(mod 3)。 看到三個標記的序列就像將三個的倍數乘以不同的2的乘積相乘; 這樣的總和可保證被三除。
如果我們要構建一個新的三令牌,則讀取下一個符號s將當前值v乘以2,然后將s相加; 即v' = 2v + s
。 v'
可以被3整除的唯一方法是,如果v
為1 (mod 3)
且s
為1。我們可以忽略v
為0 (mod 3)
且s
為0的情況,因為在這種情況下,我們處於<e>
並在三個標記之間讀取0
s。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.