Ciąg Thue-Morse to ciąg składających się z samych zer i jedynek. Powstaje on poprzez ciągłe dopisywanie 0 i 1 na podstawie wcześniej ustalonego fragmentu ciągu.
Ciąg Thue-Morse to ciąg składający się początkowo z 0. W każdym następnym kroku dotychczasowy kod jest negowany zgodnie z algebrą Boole'a, a następnie dopisywany na końcu obecnie wyznaczonej części ciągu. Proces ten jest powtarzany w nieskończoność.
Pierwsze 64 wyrazy ciągu to: 0110100110010110100101100110100110010110011010010110100110010110..
Pierwszym wyrazem ciągu jest zawsze 0. W celu wyznaczenia następnego wyrazu dopisujemy zanegowaną część wyznaczonego ciągu. Oto kolejne etapy powstawanie ciągu:
Ciąg | Negacja |
---|---|
0 | 1 |
01 | 10 |
0110 | 1001 |
01101001 | 10010110 |
0110100110010110 | ... |
W każdy kolejnym kroku należy wyznaczyć negację ciągu, a następnie dołączyć ją na koniec aktualnego ciągu i czynność tę powtórzyć. W teorii proces ten powinien trwać w nieskończoność, ale możliwe jest wcześniejsze zatrzymanie generowania ciągu.
Przyglądając się dokładnie w jaki sposób zmienia się ciąg można zauważyć, że każde 0 zamienia się na parę 01, a z kolei każda 1 na 10. Umożliwia to generowanie ciągu w sposób, który nie wymaga stosowania negacji. Pierwszy etap jest trywialny, ponieważ 0 przechodzi na 01. Oto jak można generować ciąg dalej:
Ciąg | 0 | 1 |
---|---|---|
Następny | 01 | 10 |
Ciąg | 0 | 1 | 1 | 0 |
---|---|---|---|---|
Następny | 01 | 10 | 10 | 01 |
Ciąg | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
Następny | 01 | 10 | 10 | 01 | 10 | 01 | 01 | 10 |
Proces ten oczywiście można kontynuować dalej.
Warto zauważyć, że ciąg po każdej kolejnym etapie jego rozszerzenia jest 2 razy dłuższy. Oznacza to, że do wygenerowanie n jego kolejnych wartości potrzeba zaledwie lg(n) powtórzeń. Z punktu widzenia implementacji na komputerze problemem będzie pomieszczenie wszystkich danych niż ich wyznaczenie, ponieważ złożoność czasowa jest relatywnie znikoma względem złożoności pamięciowej.
Co drugie wyznaczenie kolejnego fragmentu ciągu Thue-Morse jest palindromem. Patrząc kolejno są to następujące fragmenty: '0', '0110', '0110100110010110', ..
Napisz program, który wczyta od użytkownika ile pierwszych cyfr ciągu Thue-Morse ma zostać wypisanych, a następnie wypisz je na ekran. Przetestuj działanie programu.
W celu uproszczenia zapisu dane będą przetrzymywane w postaci zmiennych typu int. Oczywiście nie jest to optymalna metoda, ponieważ cyfry 0 i 1 można przechowywać chociażby na pojedynczych bitach. Strategia wyznacznia polegałaby na sprawdzeniu ile zostało wyznaczonych liczb i uruchomić pętle dla tych wszystkich cyfr. Jeśli zostaną zamienione i dopisane wszystkie to proces powtarzamy.
Poniższa funkcja generujCiag() przyjmuje jeden argument n i zwraca wygenerowany ciąg jako tablice liczb całkowitych.
(2.) Zainicjalizuj tablicę pod wynik i (3.) umieść na niej pierwszy wyraz. Następnie (4.) określ, że aktualnie jest jeden element i (5.) aktualnie ma zostać przepisany pierwszy element z listy. (6.) W pętli dopóki nie osiągniemy odpowiedniego rozmiaru: (7.) sprawdź czy jest jakiś element do przepisania z aktualnie wyznaczonego ciągu. Jeśli tak to (8.) zwiększ limit i (9.) wróć do przepisywania od początku. (11.) Niezależnie od warunku dopisz na odpowiednim miejscu następny element. Na koniec (13.) zwróć obliczoną tablicę danych.
Działanie funkcji można sprawdzić przy pomocy poniższego fragmentu kodu, który wczyta od użytkownika ile pierwszych cyfr ciągu ma zostać wypisanych.
Napisz funkcję generujCiag(), która wykorzystując metodę Wyznaczania Przez Zastępowanie obliczy n pierwszych wyrazów ciągu. Przetestuj działanie napiasnego programu. Wskazówka: nie trzeba zastępować cyfry, a można dostawić odpowiednią cyfrę.