Schreier-Sims algoritmus

Schreier-Sims algoritmus

Earl Cayley Group
Pojmenoval podle Charles Sims a Otto Schreyer
Autor Charles Sims
účel Určení řádu permutační grupy
Datová struktura Permutace
nejhorší čas

Algoritmus Schreier-Sims  je algoritmus z oblasti výpočetní teorie grup , který umožňuje po jediném provedení v lineárním čase najít pořadí skupiny generované permutacemi , zkontrolovat, zda prvek do takové skupiny patří a vyjmenovat její prvky. . Algoritmus navrhl Charles Sims v roce 1970 k nalezení primitivních permutačních grup [1] a je založen na Schreierově lemmatu generování podskupin [2] . Reprezentace permutační grupy, kterou algoritmus najde, je podobná stupňovité formě matice pro její řádkový prostor [3] . Metody vyvinuté Simsem tvoří základ nejmodernějších algoritmů pro práci s permutačními skupinami [4] , modifikace algoritmu se používají i v moderních systémech počítačové algebry jako GAP a Magma [5] . Jednou z nejzřejmějších aplikací algoritmu je, že jej lze použít k řešení Rubikovy kostky [6] .

Historie

Jedním z hlavních problémů teorie permutačních grup je hledání permutačních grup daného stupně (tedy minimálního počtu prvků množiny, jejíž permutační grupa obsahuje danou permutační grupu). Do roku 1970 byly pro mocniny 2 až 11 nalezeny všechny permutační grupy, pro mocniny 12 až 15 všechny tranzitivní grupy (tj. podgrupy působící tranzitivně na generátoru ) a pro mocniny 16 až 20 pouze primitivní skupiny byly nalezeny permutace . Pro hledání primitivních skupin vyššího stupně vyvinul Charles Sims program, který najde řád a nějakou strukturu v permutační skupině dané její generující množinou [1] .

Původní program zmíněný v Simsově článku byl napsán pro IBM 7040 na Rutgers University a podporoval jakoukoli skupinu, jejíž míra byla nižší než 50 [7] . Přesný odhad doby běhu algoritmu poprvé provedli Furst, Hopcroft a Lax v roce 1980 [8] . Průběžnou dobu zlepšil Jerrum v roce 1982 [9] a Donald Knuth v roce 1981 [10] . V roce 1980 byla vyvinuta efektivní pravděpodobnostní verze algoritmu [11] . Různé varianty algoritmu, včetně těch, které používají Schreierův vektor místo orbitového stromu, byly rozebrány Sheresh v roce 2003 [12] [13] .

Ve výpočetní teorii grup jsou algoritmy nad permutačními grupami jednou z nejrozvinutějších oblastí a dokonce i dnes je většina těchto algoritmů založena na metodách vyvinutých Simsem [4] .

Hlavní myšlenka

Efektivita výpočtů s permutační skupinou v podstatě závisí na tom, jak je specifikována v programu [2] . Jedním z účinných způsobů, jak toho dosáhnout, je izolovat řadu jejích podskupin a vybrat jedinečné množiny pro každou podskupinu v této řadě vzhledem k jejímu předchůdci. Algoritmus navržený Charlesem Simsem najde řadu podskupin, ve kterých každá další skupina je stabilizátorem té předchozí. Posloupnost bodů, pro které jsou stabilizátory konstruovány, se nazývá základ a množina obsahující generující prvky pro každou skupinu v řadě se nazývá silná generující množina [2] .

Algoritmus zkonstruuje základ a silnou generátorovou množinu pro permutační podskupinu danou její generátorovou sadou , pomocí Schreierova lemmatu k nalezení množin generátorů. Velikost množin získaných v mezikrokech roste exponenciálně, proto byly vyvinuty varianty algoritmu, které snižují počet uvažovaných generujících prvků [2] .

Výše popsaná reprezentace rozděluje skupinu na součin podmnožin v ní vnořených, podobně jako kroková reprezentace rozděluje vektorový prostor na přímý součet podprostorů v něm vnořených [3] .

Prohlášení o problému

Symetrická grupa je grupa, jejíž prvky jsou permutacemi prvků nějaké množiny . Obvykle se jako taková sada bere . V takovém zápisu lze na prvky grupy nahlížet jako na zobrazení , která do sebe berou množinu , tedy její automorfismy . Skupinovou operací v takovém zápisu je složení permutací, pro permutace a definované jako , kde pro . V souladu s tím bude jednotková permutace taková permutace, že , a obrácená permutace může být dána jako [14] .

Dovolit je  množina permutací délky . Vygenerovaná podskupina množiny je nejmenší inkluzní podskupinou , která obsahuje jako podmnožinu nebo ekvivalentně podskupinu všech prvků , které lze reprezentovat jako konečný součin prvků a jejich inverzí. Pořadí permutační grupy je počet prvků v ní a její stupeň je mohutnost množiny , na kterou působí. V takovém zápisu by měl být algoritmus schopen [7] :

Aplikace

Modifikace algoritmů jsou implementovány ve dvou nejpopulárnějších systémech počítačové algebry specializovaných na výpočetní teorii grup  — GAP a Magma [5] . Nástroje pro práci s permutačními skupinami, včetně algoritmů pro výčet cosetů a algoritmu Schreier-Sims, jsou také dostupné v obecnějších populárních systémech Maple a Mathematica [15] . Zpočátku byl algoritmus vyvinut pro hledání primitivních permutačních grup daného stupně [1] , ale následně se rozsah jeho použití mnohonásobně rozrostl - například pomocí tohoto algoritmu lze nalézt řešení pro danou konfiguraci Rubikovy kostky , jelikož její rotace tvoří skupinu [6] . Algoritmus se také dobře ukázal při práci s maticovými skupinami [16] .

Algoritmus

Faktorizace skupiny

Dovolit být  podgrupou nějaké konečné grupy , označované transverzálem rodiny levých coset . Jakýkoli prvek může být jednoznačně reprezentován jako , where a . Postupnou aplikací tohoto výsledku na a jeho podskupiny jej lze zobecnit v následující podobě [3] [17] :

Dovolit být řada podskupin . Potom může být jakýkoli prvek jednoznačně reprezentován jako , where .

Výpočet pořadí a výpis prvků

Výše popsaný pohled má následující vlastnosti:

Abychom mohli také zkontrolovat, zda prvky patří do vygenerované podskupiny, je nutné uvažovat řadu podgrup speciálního tvaru, konkrétně podskupiny složené ze stabilizátorů [7] .

Orbity a stabilizátory

Nechte působit na sadě . Vybereme si množinu prvků a sestrojíme řadu podskupin tak, že kde  je stabilizátor prvku . Jinými slovy,  je podskupinou prvků , které převádějí každý z prvků do sebe [7] . S tímto přístupem se v každém dalším kroku část množiny , na kterou netriviálně působí další podskupina , sníží o jeden prvek a pořadí podskupiny, se kterou se pracuje, bude nejméně dvojnásobné. . Z toho vyplývá, že před nalezením požadovaného oddílu bude nutné provést iterace algoritmu [18] .

Ke konstrukci kosset je potřeba využít faktu, že mezi prvky orbity a levými kosetami stabilizátoru existuje korespondence jedna ku jedné (bijekce) [19] .

Důkaz

Podle věty o drahách a stabilizátorech jsou množina koset a oběžná dráha výkonově ekvivalentní. Přiřaďte každý prvek prvku oběžné dráhy .

Nechte , pak se množiny a shodují. Ale z toho vyplývá, že se také shodují a :

t jeden ω = t jeden ( G ω ω ) = ( t jeden G ω ) ω = ( t 2 G ω ) ω = t 2 ( G ω ω ) = t 2 ω {\displaystyle t_{1}\omega =t_{1}(G_{\omega }\omega )=(t_{1}G_{\omega })\omega =(t_{2}G_{\omega })\ omega =t_{2}(G_{\omega }\omega )=t_{2}\omega }

Každé kosetě byl přiřazen přesně jeden prvek oběžné dráhy. Protože cosety pokrývají celou skupinu , jsou všechny spárované prvky odlišné. Jde tedy skutečně o bijekci.

Z důkazu vyplývá, že jako zástupce kosset lze brát prvky realizující různé body oběžné dráhy [19] .

Kontrola vlastnictví

Označte takovým prvkem , že . Rozdělení na řadu stabilizátorů vám umožní zkontrolovat, zda prvek patří do skupiny [7] :

Tyto vlastnosti umožňují provést přechod z do , což nakonec povede k tomu, že aktuální prvek by měl ležet v . Pokud tomu tak skutečně je, pak , odkud je možné vyjádřit [7] .

Výpočet oběžné dráhy

Nechte skupinu mít generovací sadu . Dráhu libovolného prvku pod působením skupiny lze organizovat do stromu následujícího tvaru [17] :

Popsaný strom lze sestavit hloubkovým procházením, k tomu je nutné třídit prvek v každém vrcholu , dokud se neukáže, že vrchol ještě nebyl přidělen [17] . Příklad implementace v Pythonu :

# Sestaví orbitový strom daný element w a vygeneruje sadu S def build_schreier_tree ( w , S , orbit ): pro g v S : pokud g [ w ] není na oběžné dráze : orbit [ g [ w ]] = použít ( g , orbit [ w ]) build_schreier_tree ( g [ w ], S , orbita )

Zde funkce vrátí výsledek použití operace skupiny na prvky a jako první a druhý argument a prvek je uložen v .

Schreierovo lemma

Ze Schreierova lemmatu vyplývá, že stabilizátor je generován množinou Schreierových generátorů: . Tento výsledek nám umožňuje sestavit generující množinu pro z generující množiny pro a oběžné dráhy prvku . Možná implementace pro funkci, která vrací novou generující sadu [20] :

# Vezme sadu generátorů pro G_{w-1} a orbit w # Vrátí sadu generátorů pro G_w def make_gen ( S , orbit ): n = len ( next ( iter ( S ))) newS = set () for s v S : pro u na oběžné dráze : newS . přidat ( snížit ( aplikovat , [ inverzní ( oběžná dráha [ s [ u ]]), s , oběžná dráha [ u ]])) vrátit novéS

Algoritmus tím není vyčerpán, protože ačkoli velikost nové generující množiny závisí polynomiálně na velikosti orbity a staré generující množiny pro jedno jednotlivé volání, v souhrnu pro všechna volání této funkce je velikost generující množiny množina roste exponenciálně [2] .

Prosévací generátory

Aby se zabránilo nekontrolovanému růstu generátorových soustrojí, musí být aplikován postup prosévání . To by vyžadovalo následující prohlášení [3] [20] :

Nechte _ Pak je možné sestrojit množinu maximálně prvků tak, že .

Důkaz

Nejprve dokažme následující lemma:

Nechte _ Potom se následující transformace nezmění :

  1. Náhrada za
  2. Nahrazení za , kde a
Důkaz

Nechť po aplikaci jedné z těchto operací dostaneme množinu . Je zřejmé, že . Na druhou stranu lze tyto konverze zvrátit konverzemi stejného typu, takže . Takže .

Pomocí takových transformací můžeme množinu zredukovat do takové podoby, že pro každou dvojici v množině existuje maximálně jeden prvek takový, že:

s ( ω jeden ) = ω jeden ,   s ( ω 2 ) = ω 2 , … ,   s ( ω i − jeden ) = ω i − jeden ,   s ( ω i ) = ω j ≠ ω i {\displaystyle s(\omega _{1})=\omega _{1},\ s(\omega _{2})=\omega _{2},\tečky ,\ s(\omega _{i- 1})=\omega _{i-1},\ s(\omega _{i})=\omega _{j}\neq \omega _{i}} Toho lze dosáhnout přidáváním prvků do nové množiny jeden po druhém a postupem podobně jako Gaussova metoda :

  1. Řekněme, že chceme přidat nový prvek ,
  2. Pojďme postupně
    1. Pokud , tak přejděte na ,
    2. Pokud , pak zkontrolujte , zda prvek s takovým párem již nebyl nalezen ,
      1. Pokud jsme se setkali, nahraďte je a přejděte na ,
      2. V opačném případě si zapamatujte, co odpovídá dvojici , a přidejte v aktuálním tvaru do ,
  3. Pokud do konce algoritmu máme , pak to ignorujeme a neměníme .

Tento algoritmus používá pouze základní operace uvedené výše, proto . Všimněte si, že if , then , takže přechod do z v algoritmu je správný a každý pár ve skutečnosti odpovídá ne více než jedné permutaci. Vezmeme-li v úvahu, že takových dvojic je nejvíce , získáme požadované tvrzení.

Postup popsaný v důkazu se nazývá Sims filtr a funguje v [21] . Jeho implementace může vypadat takto:

# Vezme nadřazenou množinu S # Vrátí ztenčenou nadřazenou množinu S' def normalize ( S ): n = len ( další ( iter ( S ))) newS = sada () základ = [{} pro i v rozsahu ( n )] for s v S : pro x v rozsahu ( 0 , n ): if s [ x ] != x : if s [ x ] v základu [ x ]: s = platí ( inverzní ( s ), základ [ x ][ s [ x ]]) else : základ [ x ][ s [ x ]] = s newS . přidat ( s ) přerušit návrat novinkyS

Kromě filtru Sims lze pro vyhledání malé sady použít filtr Jerrum [22] . Na rozdíl od filtru Sims, který najde množinu maximálně prvků, filtr Jerrum najde množinu maximálně prvků. Zároveň funguje filtr Jerrum pro , takže v případě algoritmu Schreier-Sims je vhodnější použít filtr Sims [21] .

Algoritmus

Vše výše uvedené dohromady dává algoritmus, který lze stručně implementovat následovně [20] :

# Vezme generující množinu S = s1, ..., sk # Vrátí transverzály koset U1, ..., Uk def schreier_sims ( S ): n = len ( další ( iter ( S ))) ans = [] w = 0 zatímco S : orbita = {} orbita [ w ] = n-tice ( rozsah ( n )) build_schreier_tree ( w , S , orbit ) ans += [[ orbit [ i ] pro i na oběžné dráze ]] S = normalizovat ( make_gen ( S , orbit )) w += 1 návrat ans

Krok za krokem mají jeho akce následující význam:

  1. Oběžná dráha prvku je postavena hledáním do hloubky,
  2. Všechny generátory Schreier jsou vypočteny pro ,
  3. Mnoho generátorů je zdecimováno, aby se zabránilo jejich exponenciálnímu růstu.

Na výstupu algoritmus vrátí seznam, jehož prvky jsou transverzály coset .

Doba běhu algoritmu

Celkově algoritmus nevyžaduje žádné další iterace. Každá iterace se skládá z:

  1. Vybudování orbitálního stromu, který vyžaduje základní operace,
  2. Konstrukce Schreierových generátorů, která přebírá základní operace a vrací generátory,
  3. Normalizace generující množiny, která provádí elementární operace, kde  je množina získaná v předchozím kroku.

Hodnota v případě, že je zadána množina, se v průběhu algoritmu nemění a je rovna . Velikost generující sady je zpočátku rovna a v každém následujícím kroku nepřesahuje . Celkovou dobu běhu algoritmu ve výše uvedené implementaci lze tedy odhadnout jako [8] [12] [13] .

Variace algoritmu

Pseudolineární verze

Dříve se ukázalo, že algoritmus vyžaduje iterace. V obecném případě může být velikost skupiny řádově , a v tomto případě podle Stirlingova vzorce , který je samozřejmě větší . Ale v některých případech je řád skupiny malý, a proto je výhodnější mít algoritmus, který závisí na , a nikoli  - například pokud jde o nějakou známou skupinu, která je dána jako permutační skupina [12] .

Podle Cayleyho teorému je jakákoli konečná grupa izomorfní k nějaké permutační grupě . Stupeň takové skupiny může být velký, ale u mnoha skupin je jejich pořadí takové, že . Například dihedrální skupina je izomorfní k permutační skupině generované cyklickým posunem a odrazem . To znamená, že stupeň této skupiny je , a pořadí je , a . Pro takové skupiny lze uvažovat o algoritmech s dobou běhu , které se nazývají pseudolineární [12] .

Ve snaze přiblížit algoritmus pseudo-lineárnímu a snížit stupeň , zahrnutý v jeho době běhu, Sheresh dospěl k verzím algoritmu, které vyžadují [18] :

  1. čas a paměť
  2. čas a paměť.

Pravděpodobnostní verze

První pracovní pravděpodobnostní verze algoritmu byla vyvinuta Jeffrey Leonem v roce 1980 [11] . Obvykle to mají na mysli, když mluví o pravděpodobnostní Schreyer-Simsově metodě. V něm byl tento postup při ztenčování Schreierových generátorů předčasně ukončen, pokud se ukázalo, že 20 generátorů v řadě bylo faktorizováno. Sheresh ukázal, že spolu s některými optimalizacemi dává tento postup následující tvrzení [5] :

Pro jakoukoli konstantu existuje algoritmus typu Monte Carlo , který s pravděpodobností chyby nanejvýš zkonstruuje silnou sadu generátorů pro permutační skupinu pomocí času a paměti.

V moderních systémech počítačové algebry se obvykle pro zrychlení programu používají modifikace této verze algoritmu s různou heuristikou [5] .

Poznámky

  1. 1 2 3 Sims, 1970 , str. 169-170.
  2. 1 2 3 4 5 Murray, 2003 , str. 1-3.
  3. 1 2 3 4 5 Holt, Eyck, O'Brien, 2005 , str. 87-90.
  4. 1 2 Sheresh, 2003 , str. 1-4.
  5. 1 2 3 4 Sheresh, 2003 , str. 62-64.
  6. 1 2 Brouwer, 2016 , str. čtyři.
  7. 1 2 3 4 5 6 7 Sims, 1970 , str. 176-177.
  8. 1 2 Furst, Hopcroft, Lax, 1980 .
  9. Jerrum, 1986 .
  10. Knuth, 1991 .
  11. 1 2 Leon, 1980 .
  12. 1 2 3 4 Sheresh, 2003 , str. 48-54.
  13. 1 2 Holt, Eyck, O'Brien, 2005 , str. 93-94.
  14. Zhuravlev, Flerov, Vjaly, 2019 , Permutace, str. 31-36.
  15. Holt, Eyck, O'Brien, 2005 , str. 1-7.
  16. Murray, O'Brien, 1995 .
  17. 1 2 3 Murray, 2003 , str. 9-24.
  18. 1 2 Sheresh, 2003 , str. 59-62.
  19. 1 2 Zhuravlev, Flerov, Vjaly, 2019 , Orbity a stabilizátory, str. 140-145.
  20. 1 2 3 Murray, 2003 , str. 25-33.
  21. ↑ 1 2 Vipul Naik. Sims filter  (anglicky) . Groupprops, Wiki vlastnosti skupiny . Staženo 23. září 2019. Archivováno z originálu 1. září 2019.
  22. Vipul Naik. Jerrumův  filtr . Groupprops, Wiki vlastnosti skupiny . Získáno 19. září 2023. Archivováno z originálu 1. září 2019.

Literatura