簡體   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