Napisz dla dziesiętnego rozszerzenia (bez wiodącego 0
). Niech i będą liczbami całkowitymi o . Rozważmy język rozwinięć dziesiętnych wielokrotności plus stałej:
Czy regularne? bez kontekstu?
(Kontrast z językiem wykresu funkcji afinicznej )
Myślę, że byłoby to dobre pytanie o pracę domową, więc odpowiedzi, które zaczynają się od podpowiedzi lub dwóch i wyjaśniają nie tylko, jak rozwiązać pytanie, ale także jak zdecydować, jakie techniki zastosować.
formal-languages
context-free
regular-languages
integers
Gilles „SO- przestań być zły”
źródło
źródło
Odpowiedzi:
Bardzo proste: załóżmy, że liczby są zapisywane dziesiętnie (inne podstawy są obsługiwane przez trywialną modyfikację). Budowanie DFA z stanach 0, 1, ..., - 1 . Stan początkowy to 0, a od stanu q na wejściu cyfra d przechodzi do stanu ( 10 q + d ) mod a . Stanem akceptacji jest b mod a (może potrzebować poprawki, jeśli b > a ).a a−1 q d (10q+d)moda bmoda b>a
źródło
To jest normalne. Pierwsze prace Spójrzmy prawdzie w systemie binarnym, który będzie uogólnić do jakiejkolwiek podstawy> 1. Niech być dany język. Dla a = 1, b = 0 otrzymujemyM.a , b
który zawiera wszystkie łańcuchy powyżej bez wiodących zer, który jest regularny (konstruuj dla niego wyrażenie regularne).{0,1}
Teraz dla każdego , b z jeszcze 0 otrzymujemy M a , 0 z M 1 , 0 , mnożąc przez numerycznie, czyli wykonując transformację ˉ x → ¯ x na każdy ciąg M a , 0 . Można to zrobić bitowo przez sekwencję przesunięć i dodatków x, które zależą od bitów ustalonego ciągu ˉ a . Dwie potrzebne nam transformacje to:a Ma,0 M1,0 x¯→ax¯¯¯¯¯¯ Ma,0 x a¯
który ˉ x → ˉ x 0x¯→2x¯¯¯¯¯ x¯→x¯0
i
Łączenie 0 po prawej stronie wyraźnie zachowuje regularność. Musimy zatem tylko udowodnić, że druga operacja zachowuje prawidłowość. Sposobem na to jest o skończonej stan pracy przetwornika na od prawej do lewej. To najtrudniejszy krok. Sugeruję robienie tego za pomocą programu pseudokodowego i pewnej skończonej pamięci pomocniczej (jak niektóre zmienne bitowe) zamiast używania stanów. Tak długo, jak pamięć ma stały rozmiar na wszystkich wejściach i skanujesz ściśle od prawej do lewej, jest to transdukcja stanu skończonego i zachowuje regularność.x¯
Na koniec, aby dostać od M a , 0 musimy numerycznie dodać B do każdej struny, ale to się robi z podobnym przetwornik T b , która zależy od ustalonej liczby b.Ma,b Ma,0 b Tb
Aby zrobić to samo w dowolnej bazie, pokaż dodatkowo, jak wykonać mnożenie przez pojedynczą cyfrę w tej bazie, używając przetwornika S d, który zależy od d. Dzięki temu możemy pomnożyć liczby wielocyfrowe i nadal pozostać w zwykłych językach. Lub możemy to wyrafinować, mówiąc, że mnożenie przez d jest po prostu powtarzanym dodawaniem.d Sd d
Chciałeś tylko podpowiedzi. Każdy z tych kroków zależy od dość złożonego twierdzenia / techniki, więc udowodnienie, że uzyskanie pełnego dowodu będzie dodatkową pracą.
źródło
Wskazówka 1 : najpierw rozwiąż bardziej popularny problem „napisz automat rozpoznający dziesiętne / binarne reprezentacje liczb podzielnych przez 3”, gdy najpierw pojawi się bit najmniej znaczący .
Pytanie pośrednie: udowodnij, że jest regularne.{ax+b¯¯¯¯¯¯¯¯¯¯¯¯¯¯∣ax+b≥0x∈Z}
Wskazówka 2 : Wykres funkcji(n↦10n+d) „modulo ” jest skończony. Możesz to obliczyć dla każdego d w { 0 , … , 9 }, który jest zarówno zbiorem cyfr, jak i językiem twojego automatu.a d {0,…,9}
Podpowiedź 3 : teraz wymienić z x ∈ N . Co to zmienia? Spróbuj wykorzystać fakt, że zwykłe języki są stabilne przez skrzyżowanie zamiast budować automat ad-hoc .x∈Z x∈N
Wskazówka 4 : teraz załóż, żea jest liczbą pierwszą (tak, że to pole) i że nadal jesteśmy w przypadku, gdy x ∈ Z . Teraz używamy reprezentacji, w której pierwszy bit jest najbardziej znaczący . Czy możesz zbudować automat w ten sam sposób?Z/aZ x∈Z
Wskazówka 5 : nie zawsze musisz zbudować automat, aby udowodnić, że język jest prawidłowy. Jak wykorzystać poprzednie wyniki, aby udowodnić, że jest regularny? (z najważniejszym bitem na początku)M
źródło
Podążam za pomysłem @vonbrand:
Wskazówka 1:
Rozwiąż najpierw dla . Możesz użyć twierdzenia Myhill-Nerode .b=0
Wskazówka 2:
Rozwiąż ogólny przypadek, użyj ponownie automatu wywołanego przez przypadek .b=0
źródło
Język jest regularny.
Wskazówka: wyrzuć dziewiątki
Dowód na pomysł
Dla i b < 9 ,a=9 b<9
To handle other values ofa that are coprime with 10 ,
To handle values ofa whose only prime factors are 2 and 5 ,
To generalize to all values ofa and b ,
Note that we use whichever technique is convenient; the three main elementary techniques (regular expressions, finite automata, set-theoretic properties) are all represented in this proof.
Detailed proof
Leta=2p5qa′ with a′ coprime with 10 .
Let M′={a′x+b¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯∣x∈Z∧a′x+b≥0} and M′′={2p5qx+b¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯∣x∈Z∧2p5qx+b≥0} . By elementary arithmetic, the numbers equal to b modulo a are exactly the numbers equal to b modulo a′ and to b modulo 2p5q , so M∩{x¯¯¯∣x≥b}=M′∩M′′∩{x¯¯¯∣x≥b} . Since the intersection of regular languages is regular, and {x¯¯¯∣x≥b} is regular because it is the complement of a finite (hence regular) language, if M′ and M′′ are also regular, then M∩{x¯¯¯∣x≥b} is regular; and M is therefore regular since it is the union of that language with a finite set.
So to conclude the proof it suffices to prove that M′ and M′′ are regular.
Let us start withM′′ , i.e. numbers modulo 2p5q . The integers whose decimal expansion is in M′′ are characterized by their last max(p,q) digits, since changing digits further left means adding a multiple of 10max(p,q) which is a multiple of 2p5q . Hence 0∗M′′=ℵ∗F where ℵ is the alphabet of all digits and F is a finite set of words of length max(p,q) , and M′′=(ℵ∗F)∩((ℵ∖{0})ℵ∗) is a regular language.
We now turn toM′ , i.e. numbers modulo a′ where a′ is coprime with 10 . If a′=1 then M′ is the set of decimal expansions of all naturals, i.e. M′={0}∪((ℵ∖{0})ℵ∗) , which is a regular language. We now assume a′>1 . Let k=a′−1 .
By Fermat's little theorem, 10a′−1≡1moda′ , which is to say that a′ divides 10k−1 . We build a deterministic finite automaton that will recognize 0∗M′ as follows:
The state(i,u) reached from a word x¯¯¯ satisfies i≡|x¯¯¯|modk and u≡xmod10k−1 . This can be proved by induction over the word, following the transitions on the automaton; the transitions are calculated for this, using the fact that 10k≡1mod10k−1 . Thus the automaton recognizes the decimal expansions (allowing initial zeroes) of the numbers of the form u+y10k with u≡bmoda′ ; since 10k≡1moda′ , the automaton recognizes the decimal expansions of the numbers equal to b modulo a′ allowing initial zeroes, which is 0∗M′ . This language is thus proved regular. Finally, M′=(0∗M′)∩((ℵ∖{0})ℵ∗) is a regular language.
To generalize to bases other than10 , replace 2 and 5 above by all the prime factors of the base.
Formal proof
Left as an exercise for the reader, in your favorite theorem prover.
źródło