Saturday 25 November 2017

Dfa divisible by $ 5 binarne opcje


Im pracuje nad problemem ustalonym dla klasy, i zastanawiałem się nad pytaniem dotyczącym tego, nad czym pracowałem. Czy istnieje minimalna liczba stanów, w których musi istnieć automat skończony, aby zaakceptować ciągi binarne, które reprezentują liczby podzielne przez liczbę całkowitą? W starszym zestawie problemów udało mi się skonstruować DFA, która zaakceptowała ciągi binarne dzielące się na 3 przez 3 stany . Czy to zbieg okoliczności, czy też jest coś nieodłącznego z ogólnym problemem wykrywania ciągów podzielonych przez n, co sugeruje, że minimalna liczba stanów, które obiecuję, nie odpowie na mnie zadaniu domowym. ) zapytał 29 stycznia w godz. 0:35 HuckBennett Zgadzam się z Kaveh, że pytanie to powinno być zamknięte na ciekawostce, głównie by być spójne. Zgadzam się również z tobą: jest to zabawne pytanie, a kiedy po raz pierwszy zobaczysz DFA, zdecydowanie warto zadać sobie pytanie. Myślę, że OP powinien spróbować trochę zabawy opracowania odpowiedzi dla siebie, a następnie skonsultować się z math. SE, aby uzyskać więcej informacji. ndash Artem Kaznatcheev 9830 29 stycznia 12 w 6:10 To nie jest zadanie domowe (choć inspirowane jest to zadaniem domowym), to interesujące pytanie, nie sądzę, że jest to dobrze znany wynik, a odpowiedź na pytanie pojawiła się w czasopiśmie badawczym. Nie wiem, dlaczego powinien być zamknięty. Górna granica była praca domowa i jest rzeczywiście łatwa, ale pytanie dotyczyło dolnego. ndash Peter Shor 29 stycznia 12 w 13: 43 ja samoczynnie uczęszczam do wyrażeń regularnych i znalazłem interesujący problem z praktyką online, który polega na pisaniu wyrażenia regularnego w celu rozpoznania wszystkich liczb binarnych podzielonych na 3 (i tylko takich liczb). Szczerze mówiąc problem poproszony o utworzenie DFA dla takiego scenariusza, ale pomyślałem, że powinno być równoważnie możliwe, używając wyrażeń regularnych. Wiem, że istnieje trochę reguły w celu ustalenia, jeśli liczba binarna jest podzielna przez 3: wziąć liczbę w parzystych miejscach w liczbie i odjąć przez liczbę tych w nieparzystych miejscach w cyfrze - jeśli to jest zero , liczba jest podzielna przez 3 (na przykład: 110 - 1 na równej 2 szczelinie i 1 w nieparzystej 1 szczelinie). Mam jednak pewne problemy z dostosowaniem go do wyrażenia regularnego. Najbliższy przyjdę dochodzi do wniosku, że liczba może wynosić 0, więc to byłby pierwszy stan. Zauważyłem również, że wszystkie liczby binarne dzielące się na 3 zaczynają się od 1, więc to byłby drugi stan, ale utknąłem stamtąd. Czy ktoś mógłby pomóc w pytaniu 11 marca 13 na 1:50 Po tym jak mówi Oli Charlesworth, możesz zbudować DFA pod kątem podziału liczby b baz przez pewien dywidor d. gdzie państwa w DFA reprezentują pozostałą część podziału. Dla twojej sprawy (baza 2 - liczba binarna, dzielnik d 3 10): Zauważ, że powyżej DFA przyjmuje pusty ciąg jako liczbę dzielną przez 3. Można to łatwo ustalić, dodając jeszcze jeden stan pośredni z przodu: Konwersja na teoretyczne wyrażenie regularne można to zrobić normalnym procesem. Konwersja do praktycznego regex w smakach obsługujących regex rekurencyjny może być wykonana łatwo, gdy masz DFA. Jest to pokazane w przypadku (b baza 10, d 7 10) w tej kwestii z CodeGolf. SE. Złamanie go, możesz zobaczyć jak to jest zbudowane. Grupę atomową (lub grupę nie odwracającą ruchu) lub grupę, która zachowuje się zachowawczo) jest używany w celu upewnienia się, że wybrana jest tylko pusta alternatywa łańcucha. To jest sztuczka do naśladowania (DEFINE) w Perlu. Następnie grupy od A do G odpowiadają resztom od 0 do 6, gdy liczba jest podzielona przez 7. odpowiedziała 11 marca 13 w 6:44 Mam inny sposób na ten problem i sądzę, że jest to łatwiejsze do zrozumienia. Gdy podzielimy liczbę na 3, możemy mieć trzy pozostałości: 0,1,2. Możemy opisać liczbę dzielącą się na 3, używając wyrażenia 3t (t jest liczbą naturalną). Kiedy dodamy 0 po numerze binarnym, którego reszta wynosi 0, rzeczywista liczba dziesiętna zostanie podwojona. Ponieważ każda cyfra idzie na wyższą pozycję. 3t 2 6t, jest to również podzielne przez 3. Gdy dodamy 1 po numerze binarnym, którego reszta wynosi 0, rzeczywista liczba dziesiętna zostanie podwojona plus 1. Ponieważ każda cyfra idzie na wyższą pozycję, a następnie 1 3t 2 1. pozostałą część wynosi 1. Gdy dodamy 1 po numerze binarnym, którego reszta to 1. Prawdziwy numer dziesiętny zostanie podwojony plus jeden, a pozostała część wynosi 0 (3t 1) 2 1 6t 3 jest to podzielna przez 3. Gdy dodamy 0 po numerze binarnym, którego reszta wynosi 1. Rzeczywista liczba dziesiętna zostanie podwojona. Pozostała część będzie wynosiła 2 (3t 1) 2 6t 2. Gdy dodamy 0 po numerze binarnym, reszta to 2. Pozostała część będzie wynosiła 1. (3t 2) 2 3t 4 3 (2t 1) 1 Gdy dodamy 1 po numerze binarnym, którego reszta to 2. Pozostała pozostała będzie 2. (3t 2) 2 1 t 5 3 (2t 1) 2. Bez względu na liczbę 1 dodasz do numeru binarnego, którego pozostała 2, reszta będzie na zawsze 2. (3 (t 1) 2) 2 1 3 (t 2) 5 3 (t 3) 2 odpowiedziało 6 listopada w 20:45 Binarne liczby podzielne przez 3 wchodzą w 3 kategorie: Liczby z dwoma kolejnymi 1s lub dwoma 1s oddzielonymi równa liczba 0s. Skutecznie każda para się wycofuje. (np. 11, 110, 1100, 1001, 10010, 1111) (liczba dziesiętna: 3, 6, 12, 9, 18, 15) Liczby mają trzysekundy oddzielone nieparzystą liczbą 0s. Te trojga również się wycofują. (np. 10101, 101010, 1010001, 1000101) (dziesiętne: 21, 42, 81, 69) Niektóre kombinacje dwóch pierwszych reguł (włącznie ze sobą) (np. 1010111, 1110101, 1011100110001) (decimal: 87, 117 , 5937) Więc wyrażenie regularne uwzględniające te trzy reguły to po prostu: oznacza, że ​​poprzednia grupa numerów jest opcjonalna wskazuje wybór opcji z każdej strony w nawiasach. Poniżej, napisałem odpowiedź za n równą 5, ale można zastosować takie same podejście do narysowania DFA dla dowolnej wartości n oraz dowolnego systemu liczb pozycji np. binarnego, trzykrotnego. Pierwsze pochylenie terminu "Kompletne DFA", DFA zdefiniowane na pełnej domenie w: Q Q nazywa się pełną DFA. Innymi słowy, w diagramie przejściowym całkowitego DFA nie ma brakującej krawędzi (np. Z każdego stanu w Q jest jedna wychodząca krawędź obecna dla każdego symbolu języka). Uwaga: czasami definiujemy częściową DFA jako Q Q (Przeczytaj: Jak: Q Q przeczytać w definicji DFA). Projekt DFA akceptuje liczby binarne podzielne przez liczbę n: krok-1. Kiedy dzieli się numer o n, przypomnienie to może wynosić 0, 1. (n - 2) lub (n - 1). Jeśli reszta jest równa 0, oznacza to, że dywidenda jest podzielna przez n inaczej nie. Tak więc, w moim DFA stanie się stan q r odpowiadający pozostałej wartości r. gdzie 0 lt r (n - 1). a całkowita liczba stanów w DFA wynosi n. Po przetworzeniu ciągu liczb, stan końcowy q r oznacza, że ​​n r (operator przypomnienia). W każdym automacie cel państwa jest niczym element pamięci. Stan w atomacie przechowuje pewne informacje, takie jak przełączniki wentylatorów, które mogą stwierdzić, czy wentylator jest wyłączony czy włączony. Dla n 5, pięć stanów w DFA odpowiadających pięciu informacjom o przypomnieniech w następujący sposób: Stan q 0 osiągnięty, jeśli przypomnienie wynosi 0. Stan q 0 jest stanem końcowym (stan akceptujący). Jest to również stan początkowy. Państwo q 1 sięga, jeśli przypomnienie to 1, stanie niekonieckim. Państwo q 2 jeśli przypomnienie o wartości 2, stanie niekonieckim. Państwo q 3, jeśli przypomnienie to 3, stanie niekonieckim. Państwo q 4, jeśli przypomnienie to 4, stanie niekonieckim. Korzystając z powyższych informacji możemy zacząć rysować diagram przejściowy TD w pięciu stanach w następujący sposób: Więc 5 stanów dla 5 wartości pozostałych. Po przetworzeniu ciągu znaków, jeśli stan końcowy staje się q0, co oznacza dziesiętny odpowiednik ciągu wejściowego jest dzielny przez 5. Na powyższym rysunku q 0 oznacza stan końcowy jako dwa koncentryczne koło. Dodatkowo zdefiniowałem regułę przejścia: (q 0, 0) q 0 jako pętlę samozapłonową dla symbolu 0 w stanie q 0. jest to, że dziesiętny odpowiednik dowolnego ciągu składa się tylko z 0 i 0 jest podzielny przez n. Krok 2 . TD powyżej jest niekompletny i może przetworzyć struny 0 s. Teraz dodaj kolejne krawędzie, aby przetworzyć ciągi liczb. Poniższy schemat przedstawia nowe zasady przejścia, które można dodać następnym krokiem: Aby przetworzyć ciąg binarny 1, należy zastosować regułę przejścia: (q 0. 1) q 1 Dwa: - reprezentacja binarna to 10. stan końcowy powinien wynosić q 2 . i do przetworzenia 10. po prostu musimy dodać jeszcze jedną regułę przejścia: (q 1, 0) q 2 Ścieżka. (q 0) 1 (q 1) 0 (q 2) Trójka: - w binarnym jest 11. stan końcowy q 3. i musimy dodać regułę przejścia: (q 1. 1) q 3 Ścieżka. (q 0) 1 (q 1) 1 (q 3) Cztery: - w binarnym 100. stan końcowy q4. TD przetwarza ciąg prefiksów 10 i musimy dodać nową regułę przejścia: (q 2. 0) q 4 Ścieżka. (q 0) 1 (q 1) 0 (q 2) 0 (q 4) Krok-3. Pięć 101 Powyżej schemat przejściowy na rysunku 2 jest wciąż niekompletny i występuje wiele brakujących krawędzi, na przykład nie zdefiniowano przejścia dla: (q 2. 1) -. Powinna istnieć zasada, aby przetworzyć łańcuchy takie jak 101. Ponieważ 101 5 jest podzielne przez 5, a przyjęcie 101 dodam: (q 2. 1) q 0 na powyższym rysunku-2. Ścieżka: (q 0) 1 (q 1) 0 (q 2) 1 (q 0) z tą nową regułą przedstawia schemat przejścia w następujący sposób: Poniżej w każdym kroku wybieram kolejną następującą liczbę binarną, aby dodać krawędź brakującą, TD jako pełny DFA. Możemy przetworzyć 11 w obecnym TD na rysunku-3 jako: (q 0) 11 (q 3) 0 (). Ponieważ 6 5 1 oznacza dodanie jednej reguły: (q 3 0) q 1. Krok-6 Dodać Dwanaście, Trzynasta, Czternasta Całkowita liczba krawędzi na wykresie przejściowym -12 to 15 Q 5 3 (całkowite DFA). I ta DFA może zaakceptować wszystkie ciągi składające się z tych dziesiętnych odpowiedników jest podzielna przez 5. Jeśli zauważysz na każdym kroku, w tabeli są trzy wpisy, ponieważ na każdym kroku dodam wszystkie możliwe wychodzące krawędzie ze stanu, aby utworzyć kompletny DFA (i Dodaję krawędź tak, aby stan qr pozostał na resztę r) Aby dodać kolejne, pamiętaj o połączeniu dwóch regularnych języków są również regularne. Jeśli musisz zaprojektować DFA, która akceptuje ciągi binarne, to dziesiętne wyrażenie równe jest podzielne przez 3 lub 5, a następnie narysuj dwa osobne DFAs podzielne przez 3 i 5, a następnie złącz wszystkie DFAs w celu skonstruowania docelowego DFA (dla 1 lt n lt 10 Twój do związku 10 DFAs). Jeśli pojawi się prośba, aby narysować DFA, która akceptuje ciągi binarne, takie, że dziesiętny odpowiednik jest dzielny przez 5 i 3, to szukasz DFA podzielnej przez 15 (ale co około 6 i 8). Uwaga: DFA narysowane tą techniką zostaną zminimalizowane DFA tylko wtedy, gdy nie ma wspólnego współczynnika między liczbą n a bazą, np. w pierwszym przykładzie nie ma pomiędzy 5 a 2, albo w przedziale od 5 do 3 w obu przykładach, a zatem zarówno te DFA, które zostały skonstruowane powyżej, są zminimalizowane DFA. Jeśli jesteś zainteresowany (a) czytaniem dalej o możliwych stanach mini dla numeru n i podstawy b przeczytaj artykuł: Divisibility and State Complexity poniżej dodałem skrypt Pythona, napisałem go dla zabawy podczas nauki biblioteki Pythona pygraphviz. Dodam to Mam nadzieję, że może być pomocne dla kogoś w niedzielę. Zaprojektuj DFA dla liczb bazowych b dzielących się według liczby n: W ten sposób możemy zastosować powyższe kroki, aby narysować DFA w celu rozpoznania ciągów liczbowych w dowolnej podstawie b, które są dzielne na daną liczbę n. W tej ogólnej liczbie stanów DFA będzie n (dla n resztów), a liczba krawędzi powinna być równa b n mdash, czyli całkowity DFA: b liczba symboli w języku DFA i n liczba stanów. Używając powyższego podstępu, poniżej napisałem skrypt Pythona do narysowania DFA w celu wprowadzenia podstawy i numeru. W skrypcie, funkcja podzielona przezN przedstawia zasady przejścia DFAs w krokach podstawowej. W każdym kroku-num, konwertuję num na liczbę numerów string przy użyciu funkcji baseN (). Aby uniknąć przetworzenia każdego ciągu znaków, użyłem tymczasowej struktury wyszukiwania. W każdym kroku stan końcowy dla numerów znaków ciągowych jest oceniany i zapisywany w przeglądarce do wykorzystania w następnym kroku. Dla wykresu przejściowego DFA napisałem funkcję drawtransitiongraph za pomocą biblioteki Pygraphviz (bardzo łatwa w użyciu). Aby użyć tego skryptu, musisz zainstalować program graphviz. Aby dodać kolorowe krawędzie w diagramie przejściowym, losowo generuję kody kolorów dla każdej funkcji getcolordict symbolu. Podobnie wprowadź bazę 4 i numer 7, aby wygenerować - dfa przyjmując numer ciągu w bazie 4, podzielony przez 7 Btw, spróbuj zmienić nazwę pliku na. png lub. jpeg.

No comments:

Post a Comment