📜  构造解释为二进制数可被 2、3、4 整除的 DFA

📅  最后修改于: 2021-09-28 11:05:49             🧑  作者: Mango

先决条件:有限自动机介绍,设计有限自动机
问题 1:
构造 DFA,它接受 {0, 1} 上所有字符串的集合,这些字符串解释为可以被 2 整除的二进制数。

解释:
考虑以下输入,

{0, 01, 10, 11, 100, 101, 110........}

语言的状态转换图如下:

在这个 DFA 中有两个状态 q0 和 q1,输入是 {0, 1} 的字符串,它被解释为二进制数。
状态 q0 是最终状态,q1 是非最终状态。状态 q0 将表示所有可被 2 整除的数字,即 {0, 10, 100, 110 …..}。
状态 q1 将代表所有不能被 2 整除的数字,即 {01, 11, 101, ……}。

def stateq0(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq0 
        if(n[0]=='0'):
            stateq0(n[1:])
              
        #else if '1' found 
        #call function q1.    
        elif (n[0]=='1'):
            stateq1(n[1:])
  
def stateq1(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq0 
        if(n[0]=='0'):
            stateq0(n[1:])
              
        #else if '1' found 
        #call function q1.    
        elif (n[0]=='1'):
            stateq1(n[1:])            
          
  
#take number from user
n=int(input())
#converting number to binary
n = bin(n).replace("0b", "") 
  
#call stateA
#to check the input
stateq0(n)
INPUT: 5
OUTPUT: String Not Accepted

上面的自动机将接受 {0, 1} 上所有字符串的集合,当解释为二进制数时,它可以被 2 整除。
每当数字不能被 2 整除时,它就会从状态 q0 转到 q1。当该数字可被 2 整除时,它将从状态 q1 转到 q0,或者如果它最初在 q0 中,则它将接受它。

问题 2:
构造 DFA,它接受 {0, 1} 上所有字符串的集合,这些字符串解释为可以被 3 整除的二进制数。

解释:
请参阅解决方案:使用 DFA 的 3 的二进制字符串倍数。

问题 3:
构造 DFA,它接受 {0, 1} 上所有字符串的集合,这些字符串解释为可以被 4 整除的二进制数。

解释:
考虑以下输入,

{0, 01, 10, 11, 100, 101, 110........}

语言的状态转换图如下:

解释:
在这个 DFA 中有三个状态 q0、q1、q2、q3,输入是 {0, 1} 的字符串,它被解释为二进制数。状态 q0 是最终状态,q1、q2、q3 是非最终状态。

  • 状态 q0 将代表所有可以被 4 整除的数字,即 {0, 100, 1000 …..}。
  • 状态 q1 将表示所有不能被 4 整除且被 4 除时余数为 1 的数字,即 {01, 101,,……}。
  • 状态 q2 将表示所有不能被 4 整除的数,除以 4 的余数为 2,即 {10, 110, ……}。
  • 状态 q4 将代表所有不能被 4 整除的数,除以 4 的余数为 3,即 {11, 111, ……}。

上面的自动机将接受 {0, 1} 上所有字符串的集合,当解释为二进制数时,它可以被 4 整除。

  • 状态 每当数字不能被 4 整除并给出 1 的余数时,它将进入状态 q1。
  • 状态 每当数字不能被 4 整除并给出 2 的余数时,它将进入状态 q2。
  • 状态 每当数字不能被 4 整除并给出 3 的余数时,它将进入状态 q3。
  • 状态 每当数字可以被 4 整除时,它就会进入状态 q0,或者如果它最初在 q0 中,那么它将接受它。
def stateq0(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq0 
        if(n[0]=='0'):
            stateq0(n[1:])
              
        #else if '1' found 
        #call function q1.    
        elif (n[0]=='1'):
            stateq1(n[1:])
  
def stateq1(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq2 
        if(n[0]=='0'):
            stateq2(n[1:])
              
        #else if '1' found 
        #call function q3.    
        elif (n[0]=='1'):
            stateq3(n[1:])            
          
def stateq2(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq0 
        if(n[0]=='0'):
            stateq0(n[1:])
              
        #else if '1' found 
        #call function q1.    
        elif (n[0]=='1'):
            stateq1(n[1:])   
              
def stateq3(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:    
          
        #if at index 0 
        #'0' found call 
        #function stateq2
        if(n[0]=='0'):
            stateq2(n[1:])
              
        #else if '1' found 
        #call function q3.    
        elif (n[0]=='1'):
            stateq3(n[1:])            
                      
                  
  
#take number from user
n=int(input())
#converting number to binary
n = bin(n).replace("0b", "") 
  
#call stateA
#to check the input
stateq0(n)