Język wartości funkcji afinicznej


10

Napisz n¯ dla dziesiętnego rozszerzenia n (bez wiodącego 0). Niech a i b będą liczbami całkowitymi o a>0 . Rozważmy język rozwinięć dziesiętnych wielokrotności plus stałej:a

M={ax+b¯xN}

Czy M 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ć.


Właśnie teraz zdaję sobie sprawę, że odpowiedziałem na konkretny przypadek, zgodnie z ideą @vonbrand. DFA, który akceptuje dziesiętne reprezentacje liczby naturalnej podzielnej przez 43
Hendrik

Odpowiedzi:


9

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 ).aa1qd(10q+d)modabmodab>a


1
Bardzo fajnie - znacznie lepiej niż mój!
David Lewis

8

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 otrzymujemyMa,b

M1,0={1,10,11,100,101,...}

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:aMa,0M1,0x¯ax¯Ma,0xa¯

który ˉ x ˉ x 0x¯2x¯x¯x¯0

i

x¯2x+x¯

Łą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,bMa,0bTb

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.dSdd

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ą.


Twój FA nie dostać jako wejście, więc nie widzę w jaki sposób to, co piszesz wynika, że język w zasięgu ręki jest regularny. Zauważ, że nie każdy program wykorzystujący skończoną pamięć odpowiada FA: ważne jest, aby przejść tylko raz i od lewej do prawej nad wejściem, biorąc pod uwagę każdy symbol wejściowy dokładnie raz. x¯
Raphael

@Raphael Jeśli chcesz, możesz przejść od prawej do lewej, ważne jest zachowanie spójności. Nie mogę znaleźć wady w dowodzie próbnym Davida; wywoływanie przetworników jest nieco mniej elementarne niż sobie wyobrażałem, ale wygląda na prawidłowe.
Gilles „SO- przestań być zły”

@Gilles: Po pierwsze, nie wyjaśnia, jak przeplatać mnożenie przez i dodawanie b do wyniku w jednym przejściu ; redukuje nawet mnożenie przez a do „sekwencji przesunięć i dodatków x ”. Każda zmiana i dodanie jest w porządku, ale jak zrobić sekwencję? Po drugie i, co ważniejsze, pokazuje, jak zbudować przetwornik, który oblicza ˉ x¯ a x + b ; co nie daje natychmiast FA, który akceptuje Mabax x¯ax+b¯ M. Na przykład mnożenie liczb jest łatwe, ale faktoring nie jest (rzekomo) nie. Potrzebujesz więc przynajmniej dodatkowego argumentu.
Raphael

Nie buduję FSA. Zaczynam od zestawu, który łatwo można wykazać jako regularny ( ), a następnie przekształcam w nim wszystkie łańcuchy za pomocą skończonej serii operacji, z których każda zachowuje regularność. Wymaga to kilku przebiegów (przetworników). Ale to w porządku, ponieważ sekwencja przetworników i struktura każdego z nich jest ustalona z góry tylko na podstawie a i b . Każde przejście (przetwornik) zachowuje regularność, więc nie ma potrzeby przeplatania ich w jednym przejściu. Tak, nie „elementarne”. Ale zbudowanie FSA za jednym razem, za jednym przejściem, byłoby strasznie skomplikowane. M1,0ab
David Lewis

1
@Raphael - tak, to bardzo potężne. W rzeczywistości wiele nieregularnych rodzin jest również zamkniętych w przetwornikach skończonych. I możesz użyć przetworników jako mechanizmów redukcji, uzyskując całą teorię „strukturalnej” złożoności języków nieregularnych.
David Lewis

8

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+b0xZ}

Wskazówka 2 : Wykres funkcji (n10n+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.ad{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 .xZxN

Wskazówka 4 : teraz załóż, że a 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/aZxZ

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


Skomentuj, jeśli uważasz, że nie jest to właściwe.
jmad

Wskazówka 1 to duży krok. W podpowiedź # 4, ważne jest, aby uświadomić sobie, że { 2 , 5 } i 10 są różne. Jadąc przez Z czujesz się jak objazd, musisz zarządzać znakiem: dlaczego nie zostać w N ? a{2,5}a10ZN
Gilles „SO- przestań być zły”

@Gilles: I chce mówić , gdy x + b 0 i x Z , ponieważ 3 x + 1234 jest uciążliwe do rozpoznania. ax+b¯ax+b0xZ3x+1234
jmad

@Gilles: Myślę, że wskazówka nr 1 jest zbyt fajna, aby ją zepsuć. Prawdopodobnie masz rację co do wskazówki nr 4.
jmad

5

Podążam za pomysłem @vonbrand:

Wskazówka 1:

Rozwiąż najpierw dla . Możesz użyć twierdzenia Myhill-Nerode .b=0

Definiujemy następującą relację . Jest to oczywiście relacja równoważności. Ponadto jest to zgodne z prawem, ponieważ jeśli dodamy cyfrę d , otrzymamy ˉ xˉ yx¯y¯:xymodad. Wreszcie nasycaL, ponieważLjest klasą równoważności[0]. Ponieważma skończoną liczbę klas według twierdzenia Myhill-Nerode, że jest on regularny. Związane FSA jest minimalny i maAx¯y¯10x+d10y+dmodax¯dy¯dLL[0]a stanów.

Wskazówka 2:

Rozwiąż ogólny przypadek, użyj ponownie automatu wywołanego przez przypadek .b=0

Wiemy, że język jest regularny dla . Stąd po prostu wziąć stan FSA M dla b = 0 języka. Teraz budujemy FSA dla L . Załóżmy, że b ma k cyfr. Następnie FSA rozgałęzia się jak 10-ary drzewo o głębokości k i zawiera wszystkie ścieżki do liczb z k cyfr. Wszystkie stany, które można osiągnąć za pomocą liczby innej niż x + b, odrzucają inaczej. Na koniec łączymy drzewną część FSA z automatem Mb=0aMb=0Lbkkkax+bM, zgodnie z pozostałą częścią przez podział przez .a


Rozumiem technikę, ale nie szczegóły. Czy wskazówka 1 nie odnosi się również do przypadku ? Co więcej, dla mod 10 spodziewałbym się 10 stanów (nie a )? a=1a
Hendrik Jan

3

Język jest regularny.

Wskazówka: wyrzuć dziewiątki


Dowód na pomysł

Dla i b < 9 ,a=9b<9

zbuduj automat z stanami oznaczonymi od 0 do 8 . 0 to stan początkowy, a jeden stan końcowy to b . Ze stanu s na cyfrze d przejście do stanu ( s +9080bsd(s+d)mod9.

To handle other values of a that are coprime with 10,

group digits in packets to find some k such that a divides 10k1 (e.g. take k=3 if a=37 because 999=27×37).

To handle values of a whose only prime factors are 2 and 5,

note that it's all about a finite number of digits at the end.

To generalize to all values of a and b,

use the fact that union and intersection of regular languages are regular, that finite languages are regular, and that the multiples of a1a2 are exactly the multiples of both when a1 and a2 are coprime.

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

Let a=2p5qa with a coprime with 10. Let M={ax+b¯xZax+b0} and M={2p5qx+b¯xZ2p5qx+b0}. 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¯xb}=MM{x¯xb}. Since the intersection of regular languages is regular, and {x¯xb} is regular because it is the complement of a finite (hence regular) language, if M and M are also regular, then M{x¯xb} 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 with M, 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 0M=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 to M, 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=a1. By Fermat's little theorem, 10a11moda, which is to say that a divides 10k1. We build a deterministic finite automaton that will recognize 0M as follows:

  • The states are [0,k1]×[0,10k2]. The first part represents a digit position and the second part represents a number modulo 10k1.
  • The initial state is (0,0).
  • There is a transition labeled d from (i,u) to (j,v) iff vd10i+umod10k1 and ji+1modk.
  • A state (i,u) is final iff ubmoda (note that a divides 10k1).

The state (i,u) reached from a word x¯ satisfies i|x¯|modk and uxmod10k1. 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 10k1mod10k1. Thus the automaton recognizes the decimal expansions (allowing initial zeroes) of the numbers of the form u+y10k with ubmoda; since 10k1moda, the automaton recognizes the decimal expansions of the numbers equal to b modulo a allowing initial zeroes, which is 0M. This language is thus proved regular. Finally, M=(0M)(({0})) is a regular language.

To generalize to bases other than 10, 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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.