• Nie Znaleziono Wyników

Generowanie minimalnych leksykograficznie ciągów de Bruijna za pomocą słów Lyndona

N/A
N/A
Protected

Academic year: 2021

Share "Generowanie minimalnych leksykograficznie ciągów de Bruijna za pomocą słów Lyndona"

Copied!
56
0
0

Pełen tekst

(1)

Uniwersytet Warszawski

Wydział Matematyki, Informatyki i Mechaniki

Jakub Radoszewski

Nr albumu: 214565

Generowanie minimalnych

leksykograficznie ciągów de Bruijna za pomocą słów Lyndona

Praca magisterska

na kierunku INFORMATYKA

Praca wykonana pod kierunkiem prof. dr. hab. Wojciecha Ryttera Instytut Informatyki UW

Wrzesień 2008

(2)

Oświadczenie kierującego pracą

Potwierdzam, że niniejsza praca została przygotowana pod moim kierunkiem i kwa- lifikuje się do przedstawienia jej w postępowaniu o nadanie tytułu zawodowego.

Data Podpis kierującego pracą

Oświadczenie autora (autorów) pracy

Świadom odpowiedzialności prawnej oświadczam, że niniejsza praca dyplomowa została napisana przeze mnie samodzielnie i nie zawiera treści uzyskanych w sposób niezgodny z obowiązującymi przepisami.

Oświadczam również, że przedstawiona praca nie była wcześniej przedmiotem pro- cedur związanych z uzyskaniem tytułu zawodowego w wyższej uczelni.

Oświadczam ponadto, że niniejsza wersja pracy jest identyczna z załączoną wersją elektroniczną.

Data Podpis autora (autorów) pracy

(3)

Streszczenie

W niniejszej pracy zaprezentowano pełniejszy i dokładniejszy w stosunku do oryginalnego do- wód twierdzenia Fredricksena i Maiorany, że konkatenacja słów Lyndona o długościach dzielą- cych n w kolejności leksykograficznej daje minimalny leksykograficznie ciąg de Bruijna rzędu n. Nowym wynikiem pracy jest implementacja i analiza algorytmu opartego na tym twierdze- niu, wyznaczającego kolejne litery wspomnianego ciągu w pesymistycznej złożoności czasowej O(1). Dodatkowo, techniki zastosowane w dowodzie twierdzenia zostały w pracy skutecznie wykorzystane do analizy struktury transformaty Burrowsa-Wheelera minimalnych leksyko- graficznie ciągów de Bruijna, której owocem jest efektywny algorytm wyznaczania dowolnej litery tej transformaty. Poza tym praca ma charakter przeglądowy i zawiera opis znanych faktów i algorytmów związanych ze słowami Lyndona i ciągami de Bruijna, w szczególności z ich zliczaniem.

Słowa kluczowe

ciąg de Bruijna, słowa Lyndona, cykl Eulera, transformata Burrowsa-Wheelera

Dziedzina pracy (kody wg programu Socrates-Erasmus) 11.3 Informatyka

Klasyfikacja tematyczna G. Mathematics of Computing

G.2 DISCRETE MATHEMATICS

G.2.1 Combinatorics—Combinatorial algorithms G.2.2 Graph Theory—Graph algorithms

F. Theory of Computation

F.2 ANALYSIS OF ALGORITHMS AND PROBLEM COMPLEXITY F.2.2 Nonnumerical Algorithms and Problems

Tytuł pracy w języku angielskim

Generation of lexicographically minimal de Bruijn sequences with prime words

(4)
(5)

Spis treści

Wprowadzenie . . . 5

1. Podstawowe definicje i własności . . . 7

1.1. Terminologia związana ze słowami . . . 7

1.2. Podstawowe własności słów . . . 8

2. Słowa Lyndona . . . 11

2.1. Definicja i własności . . . 11

2.2. Prefiksy Lyndona . . . 12

2.3. Generowanie słów Lyndona . . . 15

3. Ciągi de Bruijna . . . 17

3.1. Definicja . . . 17

3.2. Ciąg de Bruijna jako cykl Eulera . . . 18

3.3. Inne algorytmy generowania ciągów de Bruijna . . . 20

3.4. Zliczanie ciągów de Bruijna . . . 20

4. Minimalne leksykograficznie ciągi de Bruijna. . . 25

4.1. Związek ze słowami Lyndona . . . 25

4.2. Dowód poprawności . . . 26

4.2.1. Przypadek A . . . . 26

4.2.2. Przypadek B . . . . 27

4.2.3. Przypadek C . . . . 29

4.2.4. Przypadek D . . . . 30

4.3. Dowód minimalności . . . 30

4.4. Implementacja . . . 37

4.5. Algorytm zachłanny . . . 41

5. BWT minimalnych ciągów de Bruijna . . . 45

5.1. Struktura BWT ciągów de Bruijna . . . 46

5.2. Efektywny algorytm wyznaczania p-tej litery BW T (L) . . . . 48

Bibliografia . . . 53

(6)
(7)

Wprowadzenie

Ciągiem de Bruijna rzędu n nad alfabetem Σ nazywamy takie słowo cykliczne, w którym każde n-literowe słowo nad Σ występuje dokładnie raz. Ciągi te zostały wprowadzone przez de Bruijna w pracy [8]. Od tego czasu znaleziono wiele ich zastosowań, między innymi do kon- strukcji trybów pamięci w komputerach i innych urządzeniach, w modelach sieciowych, w al- gorytmach związanych z DNA, do generowania liczb pseudolosowych czy w nowoczesnych systemach kryptograficznych z kluczem publicznym (patrz [2], [6], [15] i [23]). Warto wspo- mnieć, że ciągi de Bruijna doczekały się pewnych uogólnień, na przykład na języki, w których pewne słowa są zabronione ([17], [19], [21]), oraz na inne niż słowa struktury kombinatoryczne, jak permutacje, partycje czy podzbiory zbioru o stałej mocy ([6]).

Najprostszym algorytmem generowania ciągów de Bruijna jest wyznaczanie cykli Eulera w grafie de Bruijna — metodę tę odkryli niezależnie dwaj naukowcy, de Bruijn [8] oraz Good [12]. Za pomocą utożsamienia ciągów z cyklami można wyznaczyć wzór na liczbę ciągów de Bruijna danego rzędu nad ustalonym alfabetem — patrz [8], [20]. Znanych jest też wiele metod generowania pewnych szczególnych ciągów de Bruijna, których przegląd można znaleźć w książce [15] oraz w pracy [9].

Spośród ciągów de Bruijna można wyróżnić ciągi minimalne leksykograficznie w swoich klasach. Nieco zaskakującym faktem związanym z tymi ciągami jest twierdzenie Fredricksena i Maiorany, że konkatenacja słów Lyndona o długościach dzielących n w kolejności leksy- kograficznej daje minimalny leksykograficznie ciąg de Bruijna rzędu n [11]. Twierdzenie to może zostać użyte do konstrukcji metody generowania ciągów de Bruijna dzięki wykorzysta- niu algorytmu FKM — Fredricksena, Kesslera i Maiorany ([10], [11]) — generowania słów Lyndona składających się z co najwyżej n liter. Zastosowanie algorytmu FKM prowadzi przy tym do bardzo efektywnej metody generowania ciągów de Bruijna, w której każda litera jest wyznaczana w średnim czasie stałym [22].

W niniejszej pracy przedstawiono pełniejszy i dokładniejszy w stosunku do oryginalnego, ale także i innych dostępnych — niejasnego, a wręcz niepoprawnego, a także pomijającego kwestię leksykograficznej minimalności z pracy [18] oraz zaledwie naszkicowanego z książ- ki [15] — dowód twierdzenia Fredricksena i Maiorany. Zaproponowany został także spo- sób usprawnienia algorytmu FKM, dzięki któremu każda kolejna litera minimalnego ciągu de Bruijna zostaje wygenerowana on-line w pesymistycznej złożoności czasowej O(1), a także pewien bardzo prosty algorytm zachłanny generowania tego ciągu, który jest oparty bez- pośrednio na przedstawionym dowodzie twierdzenia (alternatywne sformułowanie drugiego z tych algorytmów można znaleźć w [19]). Dodatkowo, techniki zastosowane w tym dowo- dzie zostały skutecznie wykorzystane do analizy struktury transformaty Burrowsa-Wheelera (BWT opisana jest w [3]) minimalnych leksykograficznie ciągów de Bruijna, której owocem jest efektywny algorytm wyznaczania dowolnej litery tej transformaty. Poza tym praca ma charakter przeglądowy i zawiera opis znanych faktów i algorytmów związanych ze słowami Lyndona i ciągami de Bruijna, w szczególności z ich zliczaniem.

W rozdziale 1 pracy zawarte są niezbędne do dalszych rozważań definicje związane ze sło-

(8)

wami oraz własności słów. W rozdziale 2 znajduje się opis i dowód poprawności algorytmu FKM, poprzedzony charakterystyką słów Lyndona oraz dowodami własności prefiksów Lyn- dona. W rozdziale 3 omówiono znane algorytmy generowania ciągów de Bruijna, w tym dwie wersje algorytmu wyznaczania cyklu Eulera w grafie de Bruijna, a także przedstawiono ro- zumowanie prowadzące do wzoru na liczbę ciągów de Bruijna danego rzędu nad zadanym alfabetem.

W rozdziale 4 zaprezentowano dowód twierdzenia Fredricksena i Maiorany. Został on podzielony na dwie części; pierwsza związana jest z poprawnością konstrukcji ciągu de Bruijna za pomocą słów Lyndona (sekcja 4.2), a druga — z minimalnością skonstruowanego ciągu (sekcja 4.3). Dalej przedstawiony jest algorytm oparty na tym twierdzeniu, wyznaczający kolejne litery minimalnego leksykograficznie ciągu de Bruijna w pesymistycznej złożoności czasowej O(1) (sekcja 4.4), a także pewien bardzo prosty algorytm zachłanny generowania tego ciągu (sekcja 4.5). Wreszcie rozdział 5 zawiera opis struktury transformaty Burrowsa- Wheelera minimalnych ciągów de Bruijna wraz z efektywnym algorytmem pozwalającym na wygenerowanie dowolnej litery tej transformaty.

(9)

Rozdział 1

Podstawowe definicje i własności

1.1. Terminologia związana ze słowami

Niech dany będzie niepusty skończony zbiór Σ. Zbiór ten nazywamy alfabetem, a jego elementy

— literami albo symbolami. Skończone ciągi liter z Σ nazywamy słowami nad alfabetem Σ.

Zbiór wszystkich słów nad alfabetem Σ oznaczamy przez Σ. Zazwyczaj będziemy utożsamiać litery ze zbioru Σ z kolejnymi liczbami całkowitymi nieujemnymi: 0, 1, . . . , M − 1, gdzie M =

|Σ|. Dla uproszczenia dalszych zapisów literę M − 1 będziemy także oznaczać przez Z (przez analogię do ostatniej litery zwykłego alfabetu).

Długością słowa u (oznaczaną przez |u|) nazywamy liczbę liter, z których składa się u. Zbiór wszystkich słów nad alfabetem Σ o długości n oznaczamy przez Σn. Jedyne słowo o długości 0 oznaczamy przez ǫ. Jeżeli u = a1a2. . . ak, to przez u[i] (dla 1 ¬ i ¬ k) oznaczamy i-tą literę słowa u, czyli ai, natomiast przez u[i..j] — słowo aiai+1. . . aj. Jeżeli i > j, to zakładamy, że u[i..j] = ǫ.

Podsłowem słowa u = a1a2. . . aknazwiemy dowolne słowo postaci u[i..j] dla 1 ¬ i ¬ j ¬ k albo słowo puste ǫ. Pewne rodzaje podsłów będą dla nas szczególnie istotne. Prefiksem słowa u nazywamy dowolne spośród słów u[1..i] dla i ∈ {0, 1, . . . , k}, natomiast sufiksem — dowolne spośród słów u[i..k] dla i ∈ {1, . . . , k, k + 1}. Prefiks lub sufiks słowa u nazywamy właściwym, jeżeli jego długość jest liczbą dodatnią mniejszą niż |u|.

Dla słów u = a1. . . an i v = b1. . . bk definiujemy operację sklejenia (konkatenacji):

u · v = a1. . . anb1. . . bk. Konkatenację słów u i v będziemy często zapisywać jako uv.

Mówimy, że słowo v jest obrotem cyklicznym (rotacją cykliczną, równoważnikiem cyklicz- nym) słowa u, jeżeli istnieje takie całkowite 1 ¬ i ¬ k, że v = u[i + 1..k]u[1..i].

Zakładając, że zbiór Σ jest liniowo uporządkowany przez relację ¬, na zbiorze słów nad al- fabetem Σ definiujemy porządek leksykograficzny w następujący sposób.

Definicja 1.1.1. u jest nie większe leksykograficznie niż v, co zapisujemy jako u ¬ v, jeżeli:

• u jest prefiksem v lub

• długość k najdłuższego wspólnego prefiksu słów u i v jest mniejsza niż min(|u|, |v|) oraz u[k + 1] < v[k + 1].

(10)

Można pokazać, że porządek leksykograficzny jest porządkiem liniowym na Σ. W naturalny sposób definiuje się następujące relacje stowarzyszone z porządkiem leksykograficznym: <, ­ oraz >.

Powiemy, że liczba p ∈ {1, . . . , n} jest okresem słowa u = a1a2. . . an, jeżeli ai= ap+i dla 1 ¬ i ¬ n−p. Terminem okres określamy także często słowo u[1..p]. Z kontekstu będzie zawsze jasno wynikać, w jakim znaczeniu użyty jest ten termin. Słowo v nazywamy rozszerzeniem okresowym niepustego słowa u, jeżeli jest ono równe słowu złożonemu z pierwszych |v| liter nieskończonego ciągu uuu . . .

Mówimy, że słowo u jest k-tą potęgą słowa v (co oznaczamy przez u = vk), jeżeli u powstaje przez k-krotną konkatenację słowa v ze sobą. W takim wypadku v nazywamy pierwiastkiem słowa u. Zauważmy, że każdy pierwiastek słowa jest jego okresem, ale niekoniecznie każdy okres słowa jest jego pierwiastkiem. Najkrótszy spośród pierwiastków danego słowa nazywamy pierwiastkiem pierwotnym tego słowa. Mówimy, że słowo u jest pierwotne, jeżeli pierwiastkiem pierwotnym u jest u. Łatwo zauważyć, że pierwiastek pierwotny każdego słowa jest słowem pierwotnym.

1.2. Podstawowe własności słów

Niniejszą sekcję zaczynamy od trzech całkiem oczywistych własności porządku leksykogra- ficznego, które pozostawiamy bez dowodu.

Fakt 1.2.1. Trzy istotne własności porządku leksykograficznego:

• Jeżeli u < v, to dla dowolnego w ∈ Σ zachodzi wu < wv.

• Jeżeli u nie jest prefiksem v i u < v, to dla dowolnych w, z ∈ Σ zachodzi uw < vz.

• Jeżeli uv ¬ w ¬ uz, to u jest prefiksem w.

Konkatenacja słów jest działaniem łącznym, ale niekoniecznie przemiennym. Można po- kazać przez łatwą indukcję (patrz np. [16]), że:

Fakt 1.2.2. Słowa u i v są przemienne, tj. uv = vu, wtedy i tylko wtedy, gdy są potęgami tego samego słowa.

Ten prosty fakt ma wiele nietrywialnych konsekwencji, np.:

Fakt 1.2.3. Jeżeli u jest słowem pierwotnym, to posiada ono k = |u| różnych równoważników cyklicznych.

Dowód. Gdyby pewne dwa równoważniki cykliczne u, np.

u[i + 1..k] · u[1..i] oraz u[j + 1..k] · u[1..j] (dla 1 ¬ i < j ¬ k)

były sobie równe, to przerzuciwszy kolejno i liter z końca każdego z tych równoważników na początek, otrzymalibyśmy, że u jest równe pewnej nietrywialnej rotacji cyklicznej u, czyli

u = u[l + 1..k] · u[1..l] (1.1)

dla pewnego 1 ¬ l < n. Równość (1.1) można zapisać równoważnie jako:

u[1..l] · u[l + 1..k] = u[l + 1..k] · u[1..l], (1.2)

(11)

co oznaczałoby, że słowa u[1..l] i u[l+1..k] są przemienne, czyli na mocy Faktu 1.2.2 istniałyby t ∈ Σ oraz a, b ­ 1, dla których

u[1..l] = ta oraz u[l + 1..k] = tb.

Z tego wynikałoby, że u = ta+b, gdzie a + b ­ 2, czyli u nie byłoby pierwotne, wbrew

założeniu. 

Następujący fakt zawiera jeszcze jedną istotną własność obrotów cyklicznych słów.

Fakt 1.2.4. Jeżeli słowa u oraz v są swoimi równoważnikami cyklicznymi, to długości ich pierwiastków pierwotnych są takie same.

Dowód. Oznaczmy |u| = |v| = n i niech a oraz b o długości odpowiednio |a| = k i |b| = l będą pierwiastkami pierwotnymi odpowiednio u oraz v. W dowodzie wystarczy skupić się na przypadku, gdy v = u[2..n] · u[1]. Skoro u = aα dla pewnego α ­ 1, to

v = a[2..k] · aα−1· a[1]

= a[2..k] · (a[1] · a[2..k])α−1· a[1]

= (a[2..k] · a[1])α,

co pokazuje, że |b| ¬ |a|. Podobnie, skoro v = bβ dla pewnego β ­ 1, to u = b[l] · bβ−1· b[1..l − 1]

= b[l] · (b[1..l − 1] · b[l])β−1· b[1..l − 1]

= (b[l] · b[1..l − 1])β,

skąd |a| ¬ |b|. Ostatecznie mamy więc |a| = |b|. 

(12)
(13)

Rozdział 2

Słowa Lyndona

2.1. Definicja i własności

Definicja 2.1.1. Niepuste słowo nazywamy słowem Lyndona (ang. prime word), jeżeli jest pierwotne i leksykograficznie najmniejsze w klasie swoich równoważników cyklicznych.

Przykład 1. 001001 nie jest słowem Lyndona, gdyż nie jest pierwotne (001001=0012).

010011nie jest słowem Lyndona, gdyż istnieje równoważnik cykliczny tego słowa (001101), który jest leksykograficznie mniejszy od niego. Przykładami słów Lyndona są za to:

• wszystkie słowa jednoliterowe;

• 011111, 001101 oraz 0101011.

Można udowodnić, że następująca, alternatywna definicja słów Lyndona jest równoważna Definicji 2.1.1.

Stwierdzenie 2.1.1 (Równoważna definicja słów Lyndona). Niepuste słowo w ∈ Σ jest słowem Lyndona wtedy i tylko wtedy, gdy jest mniejsze leksykograficznie od wszystkich swoich sufiksów właściwych.

Słowa Lyndona mają szereg własności związanych z rozkładami według operacji konkatenacji.

Przede wszystkim istnieje następująca charakteryzacja słów Lyndona.

Twierdzenie 2.1.2. Niepuste słowo w ∈ Σ jest słowem Lyndona wtedy i tylko wtedy, gdy w ∈ Σ lub istnieją takie słowa Lyndona l oraz m, że w = lm oraz l < m.

Opisany rozkład nie musi być jednoznaczny, np.

0011= 0 · 011 = 001 · 1.

Istnieje jednak pewna jednoznaczna reprezentacja każdego słowa w postaci konkatenacji słów Lyndona:

Twierdzenie 2.1.3 (Lyndon). Każde słowo w ∈ Σ może zostać w sposób jednoznaczny przedstawione w postaci konkatenacji słów Lyndona:

w = l1l2. . . lk, takich że l1­ l2 ­ . . . ­ lk.

Co więcej, lk jest wówczas najmniejszym leksykograficznie niepustym sufiksem słowa w, natomiast l1 — najdłuższym prefiksem w będącym słowem Lyndona.

Dowody opisanych własności (2.1.1, 2.1.2 oraz 2.1.3) można znaleźć na przykład w książce [16], poza dowodem części „co więcej” Twierdzenia 2.1.3, który można znaleźć w książce [15].

(14)

2.2. Prefiksy Lyndona

Definicja 2.2.1. Słowo nazywamy prefiksem Lyndona (ang. preprime), jeżeli jest nie- pustym prefiksem pewnego słowa Lyndona.

Będziemy dążyć do stworzenia alternatywnej definicji prefiksów Lyndona. Do pokazania równoważności definicji przyda nam się następujący lemat.

Lemat 2.2.1. Niech l będzie słowem Lyndona, natomiast u — jego rozszerzeniem okresowym i n = |u| ­ |l| = m. Jeżeli powiększyć ostatnią literę słowa u, czyli zamienić u na

u = u[1..n − 1]c, gdzie u[n] < c ∈ Σ, to stanie się ono słowem Lyndona.

l — słowo Lyndona l l l

u[n]

u — prefiks Lyndona

l l l l

c > u[n]

u = u[1..n − 1]c — słowo Lyndona

Rysunek 2.1: Ilustracja tezy Lematu 2.2.1.

Dowód. Niech

n = a · m + b, gdzie 0 ¬ b < m.

Pokażemy, że dowolny właściwy sufiks u[i..n] słowa ujest większy niż u, co jest równoważne tezie Lematu.

Załóżmy najpierw, że i 6≡ 1 (mod m). Jeżeli i ¬ a · m, to u[i..⌈i/m⌉ · m] = u[i..⌈i/m⌉ · m] = l[q..m], gdzie

q = ((i − 1) mod m) + 1 (2.1)

jest równe i mod m, jeżeli m ∤ i, a m w przeciwnym przypadku (patrz Rys. 2.2). Stąd u[i..n] ­ u[i..⌈i/m⌉ · m] = l[q..m] > l. (2.2)

(15)

Pierwsza w powyższych nierówności zachodzi, ponieważ u[i..⌈i/m⌉·m] jest prefiksem u[i..n], druga natomiast, gdyż l jest słowem Lyndona.

Mamy zatem, że u[i..n] > l. Ponadto, l nie jest prefiksem u[i..n], gdyż prefiks u[i..⌈i/m⌉·

m] słowa u[i..n] jest krótszy niż l i leksykograficznie większy niż l (patrz (2.2)).

l l l l

c

u l[q..m]

u[i..⌈i/m⌉ · m]

u[i..n]

Rysunek 2.2: Ilustracja podprzypadku, w którym i 6≡ 1 (mod m) oraz i ¬ a · m.

Jeżeli zaś i > a · m, to u[i..n] jest prefiksem l[q..m] (gdzie q jest zdefiniowane jak w (2.1))

— patrz Rys. 2.3. Ponieważ u[i..n] > u[i..n] i |u[i..n]| = |u[i..n]|, to na mocy oczywistych własności porządku leksykograficznego (Fakt 1.2.1) zachodzi:

u[i..n] > l[q..m].

Podobnie jak w poprzednim przypadku, mamy więc u[i..n] > l i l nie jest prefiksem u[i..n], ponieważ |u[i..n]| < |l|.

l l l

c > u[n]

u u[i..n] > u[i..n]

u[n]

u[i..n]

l[q..m]

Rysunek 2.3: Ilustracja podprzypadku, w którym i 6≡ 1 (mod m) oraz a · m < i ¬ n.

W każdym z omówionych przypadków zachodzi zatem u[i..n] > u, gdyż pokazaliśmy, że u[i..n] > l oraz że l jest prefiksem słowa u, ale nie słowa u[i..n].

Jeżeli wreszcie i ≡ 1 (mod m), to u[i..n] jest prefiksem u. Ponieważ u[i..n] > u[i..n] oraz

|u[i..n]| < |u|, to na mocy oczywistych własności porządku leksykograficznego (Fakt 1.2.1) zachodzi u[i..n] > u (patrz Rys. 2.4).

(16)

l l l l

c

u

u[i..n]

u[i..n]

Rysunek 2.4: Ilustracja przypadku, w którym i ≡ 1 (mod m).

 Stwierdzenie 2.2.2 (Równoważna definicja prefiksów Lyndona). Słowo u jest prefiksem Lyndona wtedy i tylko wtedy, gdy jest ono rozszerzeniem okresowym pewnego słowa Lyndona l o długości |l| ¬ |u|. Co więcej, dla danego u słowo l jest wyznaczone jednoznacznie.

Dowód. Niech l1. . . lk będzie rozkładem u na niemalejący ciąg słów Lyndona z Twierdzenia 2.1.3. Pokażemy, że u jest rozszerzeniem cyklicznym l1, czyli że |l1| = r jest okresem słowa l1. . . lk.

Niech w będzie dowolnym „uzupełnieniem” prefiksu Lyndona u, tzn. takim słowem, że uw jest Lyndona. Niech dalej u = a1. . . an, gdzie ai ∈ Σ. Pokażemy nie wprost, że ai = ai+r

dla i = 1, . . . , n − r. Faktycznie, załóżmy, że j ∈ {1, . . . , n − r} byłoby pierwszą pozycją, dla której aj 6= aj+r. Nie może zachodzić aj > aj+r, gdyż wówczas mielibyśmy

uw = l1l2. . . lkw > l2. . . lkw, (2.3) co stanowiłoby sprzeczność z tym, że uw jest słowem Lyndona.

l1 l2

l3 l4 l5

w

aj aj+r

l2 l3

l4 l5

w

aj+r< aj uw:

sufiks uw:

Ilustracja wzoru (2.3).

Aby mogło zachodzić aj 6= aj+r, musiałoby więc być aj < aj+r. Ponieważ a1. . . aj+r−1aj

jest rozszerzeniem okresowym słowa Lyndona l1, to na mocy Lematu 2.2.1 słowo a1. . . aj+r−1aj+r

byłoby słowem Lyndona. To jednak stanowi sprzeczność z Twierdzeniem 2.1.3, gdyż l1 jest najdłuższym prefiksem u będącym słowem Lyndona. Ostatecznie mamy zatem, że szukana pozycja j nie istnieje, co pokazuje, że u jest rozszerzeniem okresowym l1.

(17)

Na koniec pokażemy nie wprost, że słowo l z tezy Lematu jest wyznaczone jednoznacznie.

Załóżmy więc, że u byłoby rozszerzeniem okresowym dwóch różnych słów Lyndona l i l, przy |l| > |l|. W takim wypadku l = lkm, gdzie k ­ 1 i m jest prefiksem l. m 6= ǫ, gdyż w przeciwnym wypadku l nie byłoby pierwotne. Z definicji słów Lyndona mamy m > l. Z drugiej strony, m jest prefiksem l, które to słowo jest z kolei prefiksem l, skąd m ¬ l. To

daje sprzeczność postaci m < m. 

Zauważmy, że wobec udowodnionego właśnie Stwierdzenia 2.2.2, teza Lematu 2.2.1 może zostać przeformułowana następująco:

Stwierdzenie 2.2.3. Jeżeli powiększyć ostatnią literę prefiksu Lyndona, to otrzymuje się słowo Lyndona.

2.3. Generowanie słów Lyndona

Stwierdzenie 2.2.2 wykazuje jednoznaczną odpowiedniość między słowami Lyndona o długości nie większej niż n i prefiksami Lyndona o długości n. Na jej podstawie można skonstruować algorytm generowania wszystkich słów Lyndona o długości nie większej niż n w kolejności leksykograficznej. Poniższy zapis tego algorytmu, autorstwa H. Fredricksena, I. J. Kesslera i J. Maiorany (algorytm pochodzi z prac [10] oraz [11]), jest wzorowany na książce [15].

1: { Algorytm L: Generowanie słów Lyndona o długości ¬n w porządku ¬. }

2: for i := 1 to n do ai := 0;

3: a0 := −1;

4: j := 1;

5: while true do begin

6: { Niezmiennik: a1. . .an jest prefiksem Lyndona }

7: { i rozszerzeniem okresowym słowa Lyndona a1. . .aj. }

8: Wypisz(a1. . .aj);

9: j := n;

10: while aj = Z do j := j − 1;

11: if j = 0 then break;

12: aj := aj+ 1; { słowo a1. . .aj jest Lyndona }

13: for k := j + 1 to n do ak:= ak−j; { rozszerzenie okresowe }

14: end

Przeanalizujemy Algorytm L krok po kroku, co pozwoli nam uzasadnić jego poprawność.

W wierszach 2.–4. następuje inicjacja wszystkich istotnych zmiennych: a1. . . an odpowiada po niej rozszerzeniu okresowemu najmniejszego leksykograficznie słowa Lyndona a1. . . aj = 0

— a zatem niezmiennik pętli while jest spełniony przy pierwszym obrocie. W wierszach 9.–12. słowo a1. . . an zostaje powiększone w najmniejszy możliwy sposób (przypomnijmy, że Σ = {0, 1, . . . , Z}). Ponieważ dowolny prefiks prefiksu Lyndona jest oczywiście prefiksem Lyndona, to na mocy Stwierdzenia 2.2.3, po wykonaniu instrukcji z wiersza 12. słowo a1. . . aj jest Lyndona; jest to zatem najmniejsze słowo Lyndona z Σ większe od aktualnego rozsze- rzenia okresowego. Znalezione w wierszu 13. rozszerzenie okresowe tego słowa jest zatem najmniejszym prefiksem Lyndona leksykograficznie większym od poprzedniego, co pokazuje, że wynikiem algorytmu jest ciąg wszystkich (Stwierdzenie 2.2.2) słów Lyndona o długości nie większej niż n w kolejności leksykograficznej.

Na koniec udowodnimy pewne własności Algorytmu L, które będą nam potrzebne w dal- szych rozważaniach.

(18)

Lemat 2.3.1. Jeżeli na początku pewnego kroku głównej pętli while (wiersz 8.) zachodzi j < n i a1 6= Z, to s = a1a2. . . aj jest prefiksem wszystkich słów Lyndona skonstruowanych w algorytmie aż do momentu, gdy j = n (wraz z tym momentem).

Dowód. Jeżeli tylko w wierszu 8. algorytmu zachodzi j < n i a1 = Z, to w rozszerzeniu okresowym, które znajduje się wówczas w tablicy a, mamy aj+1 = a1 < Z. To oznacza, że inkrementacja z wiersza 12. będzie miała miejsce dla j ­ j + 1 — zmienna j wzrośnie, a prefiks s pozostanie bez zmian. Proces ten będzie trwał aż do momentu, gdy j = n.  Lemat 2.3.2. Jeżeli w Algorytmie L zostało wygenerowane słowo Lyndona o długości k < n oraz to słowo nie jest równe 0, to poprzednio wygenerowane słowo Lyndona miało długość n oraz posiadało sufiks Zn−k.

Dowód. Oczywisty. 

(19)

Rozdział 3

Ciągi de Bruijna

3.1. Definicja

Definicja 3.1.1. Ciągiem de Bruijna rzędu n nad alfabetem Σ = {0, 1, . . . , M − 1} nazy- wamy słowo u o długości Mn, które spełnia następujący warunek: zbiór

{u[i..i + n − 1] : 1 ¬ i ¬ Mn}

zawiera wszystkie słowa z Σn. Słowo u traktujemy przy tym jako cykliczne, tzn. u[Mn+ 1] = u[1], u[Mn+ 2] = u[2] itd.

Oczywistą konsekwencją Definicji 3.1.1 jest to, że każde spośród słów z Σn występuje jako podsłowo słowa uu[1..n − 1] dokładnie raz. Ta właściwość stanowi o użyteczności ciągów de Bruijna do generowania wszystkich n-elementowych krotek, co ma szczególne zastoso- wanie w przypadku M = 2, kiedy ciąg de Bruijna rzędu n pozwala na szybkie przejrzenie reprezentacji binarnych wszystkich liczb n-bitowych.

Przykład 2. Poniższa tabela przedstawia przykłady ciągów de Bruijna dla różnych wartości parametrów n i M.

n M ciąg de Bruijna rzędu n nad Σ = {0, 1, . . . , M − 1}

2 1 01

2 2 1001

3 2 01000111

4 2 0000100110101111

5 2 10010000011010100111011000101111

6 2 0001010100101110111100011111101011000000110011100100110110100001 2 3 110120022

3 3 210202200011002111201012122 2 4 1232130220011033

3 4 3110310102200132130111332302322122231312033030003201210020211233 Przyjrzyjmy się na przykład ciągowi 01000111 (n = 3, M = 2). Początkami wystąpień poszczególnych słów z {0, 1}3 w tym ciągu są:

słowo 000 001 010 011 100 101 110 111

pozycja 3 4 1 5 2 8 7 6

(20)

3.2. Ciąg de Bruijna jako cykl Eulera

Klasyczna metoda generowania ciągów de Bruijna ([8], [12]) opiera się na poszukiwaniu cykli Eulera w pewnym szczególnym skierowanym grafie etykietowanym GB = (V, E), nazywanym często grafem de Bruijna. Wierzchołki GBodpowiadają wszystkim słowom nad Σ długości n−

1. Krawędzie są etykietowane literami z Σ. Z wierzchołka odpowiadającego słowu a1a2. . . an−1 wychodzi po jednej krawędzi odpowiadającej każdej literze z Σ; krawędź z etykietą a ∈ Σ prowadzi do wierzchołka a2. . . an−1a. Formalnie:

V = Σn−1

E = {a1a2. . . an−1 −→ aa 2. . . an−1a | a1, . . . , an−1, a ∈ Σ}

Stopień wyjściowy każdego wierzchołka to M.

010

100 001

000

101

110 011

111

1

0

1 0

1

0

1 0

1

0

1 0

1

0

0

1

Przykładowy graf GB dla n = 4, M = 2, Σ = {0, 1}.

Zauważmy, że stopień wejściowy każdego wierzchołka jest równy M, gdyż jedynymi kra- wędziami wchodzącymi do wierzchołka odpowiadającego a1. . . an−2an−1 są:

aa1. . . an−2−−−→ aan−1 1. . . an−2an−1 dla a ∈ Σ, wszystkie etykietowane an−1.

Lemat 3.2.1. Graf GB jest silnie spójny.

Dowód. Rozważmy dowolne dwa wierzchołki GB, u = a1. . . an−1oraz v = b1. . . bn−1. Ścieżkę z u do v konstruujemy, przechodząc kolejno po krawędziach o etykietach b1, b2, . . . , bn−1. 

(21)

Na podstawie Lematu 3.2.1 i wcześniejszych rozważań, z których wynika, że

v∈V indeg(v) = outdeg(v) = M, możemy stwierdzić, że graf GB jest eulerowski.

Stwierdzenie 3.2.2. Istnieje bijektywna odpowiedniość między ciągami etykiet krawędzi na cy- klach Eulera w GB i ciągami de Bruijna.

Dowód. Udowodnimy najpierw, że ciąg etykiet krawędzi na dowolnym cyklu Eulera w GB

jest ciągiem de Bruijna. Na wstępie zauważmy, że |E| = Mn. Niech c = e1e2. . . e|E| będzie słowem złożonym z etykiet kolejnych krawędzi na dowolnym cyklu Eulera w GB. Pokażemy, że żadne dwa podsłowa długości n słowa d = c · c[1..n − 1] rozpoczynające się od różnych pozycji nie są takie same.

Dowód przeprowadzimy przez sprowadzenie do sprzeczności. Załóżmy, że podsłowa d dłu- gości n rozpoczynające się od pozycji i ¬ n oraz i < j ¬ n byłyby takie same, tzn.:

d[i..i + n − 1] = d[j..j + n − 1].

Wówczas wierzchołki vi oraz vj grafu GB, do których wchodzimy na rozważanym cyklu kra- wędziami odpowiadającymi d[i + n − 2] oraz d[j + n − 2], byłyby takie same. Ponieważ d[i + n − 1] = d[j + n − 1] = e, to zarówno d[i + n − 1], jak i d[j + n − 1] odpowiadałoby krawędzi o etykiecie e, wychodzącej z wierzchołka vi = vj. W GB istnieje jednakże dokładnie jedna taka krawędź. To stanowi więc sprzeczność z założeniem, że c odpowiadało cyklowi Eulera, gdyż wówczas krawędzie odpowiadające etykietom

{d[i + n − 1] : 1 ¬ i ¬ |E|}

muszą być wszystkie różne.

Pokażemy teraz, że dowolny ciąg de Bruijna c odpowiada ciągowi etykiet krawędzi na pew- nym cyklu Eulera w GB. Cykl ten zaczyna się mianowicie w wierzchołku

v0 = c[Mn− (n − 2)..Mn] i przechodzi kolejno krawędziami

c1, c2, . . . , cMn.

Dlaczego opisana konstrukcja jest poprawna? Na wstępie zauważmy, że z każdego wierz- chołka GB wychodzą krawędzie o wszystkich możliwych etykietach z Σ, czyli c odpowiada pewnej ścieżce w GBo początku w v0. Ostatnie n − 1 liter c, czyli słowo c[Mn− (n − 2)..Mn], jednoznacznie wyznacza wierzchołek v0 jako końcowy tej ścieżki, co pokazuje, że c jest cy- klem. Wreszcie dowolne podsłowo długości n słowa c · c[1..n − 1] definiuje jedną krawędź GB, a zatem, ponieważ c jest ciągiem de Bruijna, to każda krawędź grafu pojawia się na cyklu

dokładnie raz. 

Prostą, ale ważną konsekwencją Stwierdzenia 3.2.2 jest to, że dla dowolnych n oraz M istnieje ciąg de Bruijna rzędu n nad alfabetem Σ = {0, 1, . . . , M − 1}. Ponadto, Stwierdzenie 3.2.2 daje prosty algorytm konstrukcji ciągów de Bruijna za pomocą klasycznych metod wyznaczania cyklu Eulera w grafie skierowanym.

(22)

3.3. Inne algorytmy generowania ciągów de Bruijna

Powołując się na książkę [15], wymienimy także inne metody generowania ciągów de Bruijna, nie konstruujące w tym celu grafu GB. Złożoność pamięciowa każdego z tych algorytmów jest dużo mniejsza niż powyższego. Metody te mają jednakże jedną istotną wadę — pozwalają na konstrukcję jedynie pewnych specyficznych ciągów de Bruijna, a nie wszystkich, jak to ma miejsce w algorytmie wyznaczającym cykl Eulera w GB. Ponieważ algorytmy te nie są kluczowe dla głównej części pracy, nie będziemy się wgłębiać w szczegóły techniczne tych metod ani w dowody ich poprawności.

Zauważmy, że każdemu ciągowi de Bruijna można jednoznacznie przypisać funkcję, która mając dane wierzchołek grafu GB oraz krawędź, którą do tego wierzchołka weszliśmy, zwraca kolejną krawędź na cyklu Eulera wyznaczającym ten ciąg. Innymi słowy, argumentem dowol- nej takiej funkcji f jest słowo z Σn, natomiast wartością — pewna litera z Σ. W ogólności opisane funkcje dla większości ciągów de Bruijna mogą być bardzo skomplikowane, jednakże dla pewnych szczególnych ciągów ich postać bywa prosta i łatwa do wyznaczenia. Na przy- kład, jeżeli M jest liczbą pierwszą, to dla dowolnego wielomianu

xn− cnxn−1− . . . − c2x − c1 nieprzywiedlnego w ZM, następująca funkcja prawie rekurencyjna:

f (a1. . . an) =

c1 jeżeli a1. . . an= 0n 0 jeżeli a1. . . an= 1 · 0n−1 (Pni=1ci· ai) mod M w przeciwnym przypadku

generuje pewien ciąg de Bruijna. Wobec dużej liczby monicznych wielomianów nieprzywie- dlnych nad ZM, zazwyczaj udaje się znaleźć taki wielomian, w którym liczba niezerowych współczynników jest mała. Istnieją także podobne metody, służące do generowania ciągów de Bruijna w przypadku, gdy M nie jest pierwsze.

Inne algorytmy opierają się na konstrukcjach rekurencyjnych. Jeżeli mamy daną funkcję f , generującą ciąg de Bruijna dla danych parametrów n oraz M , to istnieją krótkie niereku- rencyjne algorytmy generujące na podstawie f pewne ciągi de Bruijna dla parametrów

n = n + 1 i M = M oraz

n′′= 2n i M′′= M.

Po dokładne zapisy tych algorytmów i szkice dowodów poprawności odsyłamy do książki [15].

3.4. Zliczanie ciągów de Bruijna

Metoda zliczania wszystkich ciągów de Bruijna jest związana z algorytmem wyznaczania ich jako cykli Eulera w grafie GB. Najpopularniejszy, klasyczny algorytm wyznaczania cyklu Eulera w grafie skierowanym G opiera się na metodzie przyrostowej: w grafie znajdowany jest jakiś cykl C, następnie w każdej silnie spójnej składowej G \ C zostaje wyznaczony rekurencyjnie jej cykl Eulera, po czym te cykle zostają doklejone do C. Nasza metoda zliczania wymagać będzie jednakże innego algorytmu wyznaczania cyklu Eulera. Duża część poniższych rozumowań jest wzorowana na szkicach dowodów z książki [14].

Niech dane będą: skierowany graf eulerowski G = (V, E) oraz pewien jego ustalony wierz- chołek v0.

(23)

Definicja 3.4.1. Skierowanym drzewem rozpinającym (ang. spanning arborescen- ce) grafu G ukorzenionym w wierzchołku v0 nazywamy taki podgraf G o |V | − 1 krawę- dziach, w którym stopień wyjściowy każdego wierzchołka poza v0 jest równy 1:

v∈V \{v0} outdeg(v) = 1 natomiast stopień wyjściowy v0 jest równy 0:

outdeg(v0) = 0

oraz w którym wierzchołek v0 jest osiągalny z każdego z pozostałych wierzchołków.

Będziemy budować w G ścieżkę S o początku w v0, stosując w każdym napotkanym wierzchołku v następujące kryterium.

Kryterium 3.4.1. Niech T będzie skierowanym drzewem rozpinającym G ukorzenionym w v0.

Jako kolejną krawędź ścieżki S w wierzchołku v wybieramy jakąkolwiek krawędź (v, w) ∈ E spoza T , której nie ma jeszcze na ścieżce S, jeżeli tylko taka istnieje. Jeżeli nie, to wybieramy (jedyną możliwą z danego wierzchołka) krawędź (v, w) ∈ ET, jeżeli (v, w) 6∈ S. Jeżeli nawet taka krawędź nie istnieje, to kończymy budowanie S.

Lemat 3.4.1. Ścieżka S skonstruowana zgodnie z Kryterium 3.4.1 jest cyklem Eulera w grafie G.

Dowód. Ponieważ G jest eulerowski, to dla każdego wierzchołka v ∈ V zachodzi indeg(v) = outdeg(v). To oznacza, że S, jako ścieżka rozpoczynająca się w v0, musi się także kończyć w v0, gdyż w każdym innym wierzchołku v, po wejściu do v, musi wciąż istnieć krawędź wychodząca z v.

Wiemy już, że S jest cyklem. Aby pokazać, że jest także cyklem Eulera, uzasadnimy, dlaczego wszystkie krawędzie T leżą na S — jest to wystarczające wobec faktu, że w Kry- terium 3.4.1 każda z krawędzi z ET jest wybierana jako ostatnia możliwa. Aby S mogła się skończyć w v0, po przejściu S wszystkie krawędzie wychodzące z v0 muszą być już wy- korzystane; ponieważ indeg(v0) = outdeg(v0), to to oznacza, że wówczas muszą być także wykorzystane wszystkie krawędzie {(w, v0) ∈ T : w ∈ V }. Krawędź postaci (w, v0) ∈ T zo- staje wykorzystana na ścieżce S jako ostatnia wychodząca z w, a zatem wówczas wszystkie krawędzie wchodzące do w, w tym te należące do T , muszą już leżeć na S. Kontynuując to rozumowanie aż do dojścia do liści T (czyli wierzchołków o stopniu wejściowym równym 0), otrzymujemy, że warunkiem koniecznym na to, aby konstrukcja S mogła się zakończyć w v0, jest to, aby wszystkie krawędzie z ET leżały już na S. Podkreślmy, że możliwość dojścia do li- ści jest zagwarantowana przez to, że w drzewie skierowanym korzeń jest osiągalny z każdego

z wierzchołków. 

Dodajmy jeszcze, że aby znaleźć w grafie G jakiekolwiek skierowane drzewo rozpinające, wystarczy wykonać przeszukiwanie w głąb (DFS) w transponowanej wersji grafu G, rozpo- czynając je z wierzchołka v0. Ostatecznie otrzymaliśmy alternatywny algorytm znajdowania cyklu Eulera w grafie skierowanym.

Odtąd dążyć będziemy do sprowadzenia zliczania cykli Eulera w grafie skierowanym G do zliczania skierowanych ukorzenionych drzew rozpinających w G. Cykl Eulera rozumiemy przy tym jako ciąg numerów kolejnych wierzchołków na cyklu. Ile różnych cykli Eulera można otrzymać z jednego ukorzenionego drzewa rozpinającego T w G? Dla każdego wierzchołka v ∈ V możemy ustalić permutację krawędzi ze zbioru {(v, w) : w ∈ V } ∩ E \ ET ustalającą

(24)

pewną kolejność wyboru krawędzi wychodzących z v, a zatem likwidującą wszelką dowolność z Kryterium 3.4.1. Odpowiedzią na postawione pytanie jest więc

Y

v∈V \{v0}

(indeg(v) − 1)! · indeg(v0)! = M · Y

v∈V

(indeg(v) − 1)! (3.1)

Niech E(v0) oznacza liczbę cykli Eulera w G zaczynających się w v0, natomiast T (v0)

— liczbę drzew rozpinających ukorzenionych w v0. Na podstawie sformułowania Kryterium 3.4.1 nietrudno zauważyć, że cykle Eulera wyznaczone dla różnych drzew rozpinających są różne. To stwierdzenie w połączeniu z (3.1) daje

E(v0) ­ T (v0) · M · Y

v∈V

(indeg(v) − 1)! (3.2)

Zajmijmy się teraz dowodem nierówności w drugą stronę. Z każdym cyklem Eulera C zaczynającym się w v0 można związać graf H, w którym każdemu wierzchołkowi v ∈ V \ {v0} przyporządkowujemy ostatnią krawędź, którą z niego wychodzimy na C.

Pokażemy, że H jest wówczas skierowanym drzewem rozpinającym G ukorzenionym w v0, zgodnie z Definicją 3.4.1. Warunki tej Definicji związane ze stopniami wierzchołków są oczy- wiście spełnione. H nie może także zawierać cyklu. Faktycznie, gdyby w H istniał cykl

v1→ v2 → . . . → vk→ v1,

to dla każdego i ∈ {1, . . . , k} krawędź vi−1→ vi musiałaby się pojawić na C przed vi→ vi+1

(ostatnie wyjście z vi na C musi się odbyć po ostatnim wejściu tamże) — w tym stwierdze- niu indeksy wierzchołków traktujemy modulo k. Z przechodniości relacji „wyprzedzania się na cyklu C” wynikłoby stąd na przykład, że v1 → v2 wyprzedza v2 → v3, ale także i v2→ v3

wyprzedza v1→ v2, co jest oczywistą sprzecznością.

Skoro H nie zawiera żadnego cyklu, to z każdego wierzchołka v 6= v0, idąc po krawędziach z H, w końcu dojdziemy do v0 (jedyny wierzchołek bez krawędzi wyjściowych). To oznacza, że H jest faktycznie skierowanym drzewem rozpinającym G. Innymi słowy, pokazaliśmy, że każdy cykl Eulera G może zostać skonstruowany za pomocą naszego algorytmu, czyli że

E(v0) ¬ T (v0) · M · Y

v∈V

(indeg(v) − 1)! (3.3)

Na mocy (3.2) oraz (3.3) mamy, że:

E(v0) = T (v0) · M · Y

v∈V

(indeg(v) − 1)!

Łączna liczba cykli Eulera w G wyraża się zatem następująco za pomocą liczb T (v):

#cykli Eulera = M · X

v0∈V

T (v0) · Y

v∈V

(indeg(v) − 1)! (3.4)

Musimy jeszcze pokazać, jak wyznaczać liczby T (v). Dla grafu G skonstruujemy w tym celu macierz stopni wejściowych D = (dij)i,j∈V następująco:

dij =

indeg(i) jeżeli i = j

−1 jeżeli (i, j) ∈ E

0 w przeciwnym przypadku.

(3.5) Okazuje się, że prawdziwe jest wówczas następujące twierdzenie, po dowód którego odsy- łamy do książki [14].

(25)

Twierdzenie 3.4.2(Tutte, 1948). Niech D będzie macierzą stopni wejściowych grafu skiero- wanego G. Wówczas liczba skierowanych drzew rozpinających G ukorzenionych w wierzchołku v jest równa wyznacznikowi podmacierzy D, powstałej poprzez usunięcie z D v-tego wiersza oraz v-tej kolumny.

Innymi słowy, T (v) jest równe v-temu minorowi macierzy D, czyli det Dv.

Wyposażeni we wzór (3.4) i w Twierdzenie 3.4.2, możemy wyznaczyć liczbę ciągów de Bru- ijna rzędu n nad Σ, |Σ| = M. Interesować nas będzie oczywiście graf GB, dla którego równość (3.4) przedstawia się następująco:

#ciągów de Bruijna = M · X

v0∈V

T (v0) · (M − 1)!Mn−1 (3.6) Pozostałą częścią wyprowadzenia jest wyznaczenie wzoru na v-ty minor macierzy D dla grafu GB, zgodnie z wynikiem z Twierdzenia 3.4.2. Ponieważ jest to znany rezultat, a sam dowód jest dosyć żmudny, to przedstawiamy w tym miejscu jedynie sam wynik, a po dowód odsyłamy do pracy [8] (dla przypadku M = 2) lub [20].

det Dv = MMn−1−n Zauważmy, że wartość det Dv nie zależy od v.

Ostatecznie liczba ciągów de Bruijna w zależności od parametrów n oraz M wyraża się następująco:

#ciągów de Bruijna = M · Mn−1· MMn−1−n· (M − 1)!Mn−1

= M!Mn−1

(26)
(27)

Rozdział 4

Minimalne leksykograficznie ciągi de Bruijna

4.1. Związek ze słowami Lyndona

Spośród wszystkich ciągów de Bruijna szczególnym zainteresowaniem obdarzymy minimalne leksykograficznie w swoich klasach, czyli dla danych wartości parametrów n oraz M. Poniższa tabela zawiera przykłady takich ciągów.

n M minimalny leksykograficznie ciąg de Bruijna rzędu n nad Σ = {0, 1, . . . , M − 1}

2 2 0011

3 2 00010111

4 2 0000100110101111

5 2 00000100011001010011101011011111

6 2 0000001000011000101000111001001011001101001111010101110110111111 2 3 001021122

3 3 000100201101202102211121222 2 4 0010203112132233

Najprostszym sposobem generowania minimalnych leksykograficznie ciągów de Bruijna jest znajdowanie najmniejszego leksykograficznie cyklu Eulera w grafie GB, opisanym w po- przednim rozdziale. Okazuje się jednak, że:

Twierdzenie 4.1.1(Fredricksen, Maiorana). Konkatenacja wszystkich słów Lyndona o dłu- gościach dzielących n w kolejności leksykograficznej L = l1l2. . . lt daje minimalny leksykogra- ficznie ciąg de Bruijna rzędu n.

Aby zademonstrować prawdziwość nieco zaskakującego Twierdzenia 4.1.1, przedstawiamy jeszcze raz tabelę z minimalnymi leksykograficznie ciągami de Bruijna, tym razem podzielo- nymi na odpowiednie słowa Lyndona:

n M rozkład ciągu de Bruijna na słowa Lyndona 2 2 0 01 1

3 2 0 001 011 1

4 2 0 0001 0011 01 0111 1

5 2 0 00001 00011 00101 00111 01011 01111 1

6 2 0 000001 000011 000101 000111 001 001011 001101 001111 01 010111. . . 2 3 0 01 02 1 12 2

3 3 0 001 002 011 012 021 022 1 112 122 2 2 4 0 01 02 03 1 12 13 2 23 3

(28)

Pozostała część niniejszego rozdziału zawiera przede wszystkim dowód Twierdzenia 4.1.1, podzielony na dwie części: dlaczego wynikiem sklejenia odpowiednich słów Lyndona jest ciąg de Bruijna (sekcja 4.2) i dlaczego uzyskany ciąg jest najmniejszy leksykograficznie w swojej klasie (sekcja 4.3). Na koniec (sekcje 4.4 i 4.5) zastanowimy się nad efektywnym zastosowa- niem metody zawartej w tym Twierdzeniu do wygenerowania szukanego ciągu de Bruijna.

4.2. Dowód poprawności

Na początek zastanówmy się, dlaczego w ogóle długość ciągu L = l1. . . lt to Mn. Zauważmy, że istnieje bijektywna odpowiedniość między słowami o długości n a słowami pierwotny- mi o długościach dzielących n. Faktycznie, dowolnemu słowu długości n można jednoznacz- nie przyporządkować jego pierwiastek pierwotny, a dowolne słowo pierwotne długości d | n posiada dokładnie jedno rozszerzenie okresowe długości n. Z kolei liczba słów pierwotnych o długościach dzielących n jest równa sumie długości wszystkich słów Lyndona o długościach dzielących n, czyli |l1l2. . . lt|. Jest tak dlatego, że dowolne słowo Lyndona l odpowiada, na mocy Faktu 1.2.3, dokładnie |l| słowom pierwotnym — swoim równoważnikom cyklicznym.

A zatem rzeczywiście |l1. . . lt| = Mn.

Definicja 4.2.1. Pierwiastkiem Lyndona słowa u (oznaczenie: pL(u)) nazywamy pier- wiastek pierwotny minimalnego leksykograficznie równoważnika cyklicznego u.

Fakt 4.2.1 (Natychmiastowy wniosek z Definicji 4.2.1). Na mocy Faktu 1.2.4 łatwo wniosku- jemy, że pierwiastek Lyndona słowa u jest zawsze minimalnym leksykograficznie równoważ- nikiem cyklicznym pierwiastka pierwotnego słowa u. Co więcej, pierwiastek Lyndona każdego słowa jest zawsze słowem Lyndona.

Wykorzystując wprowadzoną definicję, możemy przeformułować nasze rozumowanie ilo- ściowe następująco: każdemu słowu z Σnodpowiada jednoznacznie jego pierwiastek Lyndona;

z kolei każde słowo Lyndona o długości d | n jest pierwiastkiem Lyndona dokładnie d słów długości n.

Fakt 4.2.2. Równość |L| = Mn pozwala przy okazji wyznaczyć wzór na liczbę słów Lyndona nad Σ = {0, . . . , M − 1} o długości n, czyli LM(n). Powyżej udowodniliśmy, że

X

d|n

dLM(d) = Mn.

Korzystając ze wzoru na odwracanie z użyciem funkcji M¨obiusa (patrz np. [13]), mamy zatem LM(n) =X

d|n

µ(d)Mn/d.

W dalszej części dowodu poprawności, dla każdego słowa u ∈ Σn wskażemy pozycję w słowie L, na której występuje jako podsłowo. Rozważania podzielimy na kilka przypadków (przedstawiony podział został zaczerpnięty z książki [15], lecz rozumowania są inne niż tam zasugerowano).

4.2.1. Przypadek A

Załóżmy, że słowo u jest pierwotne, czyli że jest rotacją cykliczną pewnego słowa Lyndona lk. Załóżmy ponadto, że jeżeli u = αβ i lk = βα, to α nie składa się z samych wystąpień litery Z, czyli α 6= Z|α|.

(29)

Na mocy wymienionych warunków, w pewnym momencie działania Algorytmu L skon- struowane zostanie słowo lk, czyli a1. . . an= βα oraz j = n. W kolejnym kroku pętli while z wiersza 5. zostanie wygenerowane słowo Lyndona posiadające prefiks β — jest tak dlatego, że α 6= Z|α|. Stąd i na mocy Lematu 2.3.1, prefiksem słowa lk+1 jest β.

Uwaga 1. lk6= Z, więc słowo lk+1 istnieje.

A zatem u = αβ jest podsłowem lklk+1:

lk lk+1

β α

β Przypadek A.

Uwaga 2. Zauważmy, że warunki Przypadku A zachodzą w szczególności, jeżeli β = ǫ, czyli u = α jest słowem Lyndona lk.

4.2.2. Przypadek B

W tym przypadku także zakładamy, że u jest pierwotne. Tym razem przyjmujemy jednak, że jeśli u = αβ i βα jest słowem Lyndona, to α = Z|α|. Pomijamy tutaj sytuację, w której α = ǫ, gdyż wtedy u = β byłoby słowem Lyndona, a słowa Lyndona są pokryte przez warunki Przypadku A (patrz Uwaga 2). Z drugiej strony, β 6= ǫ, gdyż wówczas u = α nie byłoby pierwotne.

Uwaga 3. Warunek α 6= ǫ, a zwłaszcza β 6= ǫ, będzie nam potrzebny w sekcji 4.3.

Szczególnym podprzypadkiem niniejszego przypadku jest sytuacja, w której β = 0|β|. Zauważmy jednak, że l1 = 0, l2= 0n−11, lt= Z, a lt−1= (Z − 1)Zn−1. Stąd słowo Zn0n jest podsłowem lt−1ltl1l2, więc wszystkie słowa odpowiadające wspomnianemu podprzypadkowi na pewno w L występują.

Odtąd zakładamy zatem, że α, β 6= ǫ i β 6= 0|β|. Niech lk będzie najmniejszym słowem Lyndona o długości dzielącej n, spełniającym warunek β ¬ lk.

Uwaga 4. βα jest słowem Lyndona większym niż β, więc lk istnieje.

Ponieważ β ¬ lk¬ βα, to na mocy oczywistych własności porządku leksykograficznego (Fakt 1.2.1) β jest prefiksem lk. Dalej, β jest prefiksem Lyndona, a zatem, na mocy Stwierdzenia 2.2.2, jest rozszerzeniem okresowym pewnego słowa Lyndona β ¬ β.

Przyjrzyjmy się teraz słowu lk−1, które spełnia nierówność lk−1 < β.

Uwaga 5. lk6= 0, gdyż β 6= 0|β|, a zatem słowo lk−1 istnieje.

Jeżeli lk−1 = β, to na mocy Lematu 2.3.2 poprzednim słowem Lyndona wygenerowanym w Algorytmie L musiało być lk−2 długości n, zakończone

n − |β| ­ n − |β| = |α|

wystąpieniami litery Z.

(30)

Uwaga 6. β 6= 0|β|, a zatem β 6= 0, co gwarantuje w tym przypadku istnienie słowa lk−2. Ponieważ β to rozszerzenie okresowe β, to u = αβ jest wówczas podsłowem lk−2lk−1lk.

lk−2

lk−1 lk

Zn−|β| α

β β

β β

Przypadek B1: lk−1= β, u jest podsłowem lk−2lk−1lk.

Jeżeli lk−1 6= β, to pokażemy, że α = Z|α| jest sufiksem lk−1; stąd będzie już wynikać, że u = αβ jest podsłowem lk−1lk.

lk−1 lk

Z|α| = α β

Przypadek B2: lk−1 6= β, u jest podsłowem lk−1lk.

Załóżmy najpierw, że lk−1 < β. Słowo Lyndona wygenerowane w Algorytmie L tuż przed β na mocy Lematu 2.3.2 ma długość n i sufiks Zn−|β|. Słowem tym musi więc być lk−1, gdyż w przeciwnym przypadku istniałoby słowo Lyndona l długości n spełniające

lk−1 < l < β ¬ β ¬ lk,

co jest niemożliwe wobec definicji ciągu li. Stąd α = Z|α| jest sufiksem lk−1, gdyż

|α| = n − |β| ¬ n − |β|, co kończy dowód w tym przypadku.

Odtąd zakładamy, że β ¬ lk−1 < β. Rozważmy kilka przypadków dotyczących postaci słowa lk−1.

• Załóżmy, że |lk−1| ¬ |β|. Na mocy Lematu 2.3.1 istnieje słowo Lyndona l długości n, posiadające prefiks lk−1. Gdyby prefiks p długości |lk−1| słowa β był leksykograficznie większy niż lk−1, to słowo l spełniałoby nierówności lk−1 < l < β ¬ lk, co stanowiłoby sprzeczność z definicją ciągu li.

β p

lk−1< p

Cytaty

Powiązane dokumenty

Jeśli więc ograniczymy ją do zbiorów, które spełniają względem niej warunek Carathéodory’ego, dostaniemy miarę nazywaną dwuwymiarową miarą Lebesgue’a – i to jest

Dodawanie jest działaniem dwuargumentowym, w jednym kroku umiemy dodać tylko dwie liczby, więc aby dodać nieskończenie wiele liczb, trzeba by wykonać nieskończenie wiele kroków,

przykładem jest relacja koloru zdefiniowana na zbiorze wszystkich samochodów, gdzie dwa samochody są w tej relacji, jeśli są tego samego koloru.. Jeszcze inny przykład to

Spoglądając z różnych stron na przykład na boisko piłkarskie, możemy stwierdzić, że raz wydaje nam się bliżej nieokreślonym czworokątem, raz trapezem, a z lotu ptaka

nierozsądnie jest ustawić się dziobem żaglówki w stronę wiatru – wtedy na pewno nie popłyniemy we właściwą stronę – ale jak pokazuje teoria (i praktyka), rozwiązaniem

W przestrzeni dyskretnej w szczególności każdy jednopunktowy podzbiór jest otwarty – dla każdego punktu możemy więc znaleźć taką kulę, że nie ma w niej punktów innych niż

też inne parametry algorytmu, często zamiast liczby wykonywanych operacji rozważa się rozmiar pamięci, której używa dany algorytm. Wówczas mówimy o złożoności pamięciowej;

„Kwantechizm, czyli klatka na ludzi”, mimo że poświęcona jest głównie teorii względności i mechanice kwantowej, nie jest kolejnym wcieleniem standardowych opowieści o