Schreier-Sims-algoritmi

Schreier-Sims-algoritmi

Earl Cayley -ryhmä
Nimetty Charles Sims ja Otto Schreyer
Tekijä Charles Sims
tarkoitus Permutaatioryhmän järjestyksen määrittäminen
Tietorakenne Permutaatiot
pahin aika

Schreier-Sims- algoritmi  on laskennallisen ryhmäteorian alalta peräisin oleva algoritmi , jonka avulla yhden suorituksen jälkeen lineaarisessa ajassa voidaan löytää permutaatioiden muodostaman ryhmän järjestys , tarkistaa, kuuluuko elementti sellaiseen ryhmään ja luetella sen elementit. . Charles Sims ehdotti algoritmia vuonna 1970 primitiivisten permutaatioryhmien löytämiseksi [1] , ja se perustuu Schreierin alaryhmien sukupolven lemmaan [2] . Algoritmin löytämän permutaatioryhmän esitys on samanlainen kuin sen riviavaruuden matriisin askelmuoto [3] . Simsin kehittämät menetelmät muodostavat perustan useimmille nykyaikaisille algoritmeille työskentelyyn permutaatioryhmien kanssa [4] , algoritmin muunnelmia käytetään myös nykyaikaisissa tietokonealgebrajärjestelmissä , kuten GAP ja Magma [5] . Yksi algoritmin ilmeisimmistä sovelluksista on, että sitä voidaan käyttää Rubikin kuution ratkaisemiseen [6] .

Historia

Yksi permutaatioryhmien teorian pääongelmista on tietyn asteen permutaatioryhmien (eli joukon alkioiden vähimmäismäärän, jonka permutaatioryhmä sisältää tietyn permutaatioryhmän) etsiminen. Vuoteen 1970 mennessä tehoille 2 - 11 oli löydetty kaikki permutaatioryhmät, tehoille 12 - 15 kaikki transitiiviset ryhmät (eli alaryhmät, jotka toimivat transitiivisesti generaattorijoukossa ) ja tehoille 16 - 20 vain primitiiviset . ryhmille oli löydetty permutaatioita . Korkeamman asteen primitiivisten ryhmien etsimiseksi Charles Sims kehitti ohjelman, joka löytää järjestyksen ja rakenteen generointijoukon antamasta permutaatioryhmästä [1] .

Simsin paperissa mainittu alkuperäinen ohjelma kirjoitettiin Rutgersin yliopiston IBM 7040 :lle ja se tuki kaikkia ryhmiä, joiden tutkinto oli alle 50 [7] . Tarkan arvion algoritmin toiminta-ajasta tekivät ensimmäisen kerran Furst, Hopcroft ja Lax vuonna 1980 [8] . Ajoaikaa paransivat Jerrum vuonna 1982 [9] ja Donald Knuth vuonna 1981 [10] . Vuonna 1980 algoritmista kehitettiin tehokas probabilistinen versio [11] . Sheresh purki useita algoritmin muunnelmia, mukaan lukien ne, jotka käyttävät Schreier-vektoria kiertoratapuun sijaan, vuonna 2003 [12] [13] .

Laskennallisessa ryhmäteoriassa algoritmit permutaatioryhmien yli ovat yksi kehittyneimmistä alueista, ja nykyäänkin useimmat näistä algoritmeista perustuvat Simsin kehittämiin menetelmiin [4] .

Pääidea

Permutaatioryhmän laskelmien tehokkuus riippuu olennaisesti siitä, miten se on määritelty ohjelmassa [2] . Yksi tehokas tapa tehdä tämä on eristää useita sen alaryhmiä ja valita kullekin sarjan alaryhmälle ainutlaatuiset kosetit suhteessa edeltäjäänsä. Charles Simsin ehdottama algoritmi löytää useita alaryhmiä, joissa jokainen seuraava ryhmä on edellisen stabilaattori . Pisteiden sarjaa, joille stabilaattoreita rakennetaan, kutsutaan kantaluvuksi , ja sarjaa, joka sisältää generointielementit jokaiselle sarjan ryhmälle, kutsutaan vahvaksi generoivaksi joukoksi [2] .

Algoritmi rakentaa perustan ja vahvan generaattorijoukon sen generaattorijoukon antamalle permutaatioalaryhmälle käyttämällä Schreierin lemmaa löytääkseen generaattorijoukot. Välivaiheissa saatujen joukkojen koko kasvaa eksponentiaalisesti, joten algoritmille on kehitetty muunnelmia, jotka vähentävät tarkasteltavien generoivien elementtien määrää [2] .

Yllä kuvattu esitys jakaa ryhmän siihen sisäkkäisten osajoukkojen tuloksi, samalla tavalla kuin askelesitys jakaa vektoriavaruuden siihen sisäkkäisten aliavaruuksien suoraksi summaksi [3] .

Ongelman selvitys

Symmetrinen ryhmä on ryhmä, jonka alkiot ovat jonkin joukon alkioiden permutaatioita . Yleensä . pidetään sellaisena joukkona . Tällaisessa merkintätavassa ryhmän elementtejä voidaan pitää kartoitusina , jotka ottavat joukon itseensä, eli sen automorfismeina . Ryhmäoperaatio tällaisessa merkinnässä on permutaatioiden koostumus permutaatioille ja määritellään , missä for . Vastaavasti yksikköpermutaatio on sellainen permutaatio , että , ja käänteinen permutaatio voidaan antaa muodossa [14] .

Antaa olla  joukko permutaatioita pituus . Joukon generoitu aliryhmä on pienin inkluusio- aliryhmä , joka sisältää osajoukona tai vastaavasti aliryhmän kaikista alkioista , jotka voidaan esittää alkioiden ja niiden käänteisarvojen äärellisenä tulona. Permutaatioryhmän järjestys on siinä olevien elementtien lukumäärä ja sen aste on sen joukon kardinaliteetti, johon se vaikuttaa. Tällaisessa merkinnässä algoritmin pitäisi pystyä [7] :

Sovellukset

Algoritmien modifikaatioita on toteutettu kahdessa suosituimmassa laskennalliseen ryhmäteoriaan erikoistuneessa tietokonealgebrajärjestelmässä  GAP ja Magma [ [5] . Työkaluja permutaatioryhmien kanssa työskentelyyn, mukaan lukien kosetinlaskenta-algoritmit ja Schreier-Sims-algoritmi, on saatavilla myös yleisemmissä suosituissa järjestelmissä Maple ja Mathematica [15] . Aluksi algoritmi kehitettiin etsimään tietyn asteen primitiivisiä permutaatioryhmiä [1] , mutta myöhemmin sen sovellusalue on kasvanut moninkertaiseksi - esimerkiksi tällä algoritmilla voit löytää ratkaisuja tiettyyn Rubikin kuution kokoonpanoon , koska sen rotaatiot muodostavat ryhmän [6] . Lisäksi algoritmi osoitti itsensä hyvin matriisiryhmien kanssa työskennellessä [16] .

Algoritmi

Ryhmän faktorointi

Antaa olla  alaryhmä joidenkin rajallinen ryhmä , joka tarkoittaa poikittainen perheen vasemmalle cosets . Mikä tahansa elementti voidaan yksilöllisesti esittää muodossa , missä ja . Soveltamalla tätä tulosta peräkkäin ja sen alaryhmiin se voidaan yleistää seuraavaan muotoon [3] [17] :

Antaa olla sarja alaryhmiä . Sitten mikä tahansa elementti voidaan esittää yksiselitteisesti muodossa , missä .

Tilauksen laskeminen ja elementtien luettelointi

Yllä kuvatulla näkymällä on seuraavat ominaisuudet:

Jotta voidaan myös tarkistaa elementtien kuuluvuus generoituun alaryhmään, on tarpeen ottaa huomioon sarja erikoismuotoisia alaryhmiä, nimittäin stabilaattoreista koostuvia [7] .

Radat ja stabilisaattorit

Anna toimia kuvauksissa . Valitsemme joukon elementtejä ja rakennamme useita aliryhmiä siten, että missä  on elementin stabilisaattori . Toisin sanoen  se on elementtien alaryhmä, joka kääntää jokaisen elementin itsestään [7] . Tällä lähestymistavalla kussakin seuraavassa vaiheessa joukon se osa , johon seuraava alaryhmä ei-triviaalisesti toimii , pienenee yhdellä elementillä ja sen alaryhmän järjestys, jonka kanssa työtä tehdään, on vähintään kaksinkertainen. . Tästä seuraa, että algoritmin iteraatioita tarvitaan ennen kuin haluttu osio löydetään [18] .

Kosettien muodostamiseen on käytettävä sitä tosiasiaa, että kiertoradan elementtien ja stabilisaattorin vasen kosettien välillä on yksi-yhteen vastaavuus (bijektio) [19] .

Todiste

Rata- ja stabilisaattoreita koskevan lauseen mukaan kosettien joukko ja rata ovat teholtaan ekvivalentteja. Yhdistä jokainen elementti kiertoradan elementtiin .

Anna sitten joukot ja osuvat yhteen. Mutta tästä seuraa, että myös samat ja :

t yksi ω = t yksi ( G ω ω ) = ( t yksi 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 }

Jokaiselle kosetille määritettiin täsmälleen yksi kiertoradan elementti. Koska asusteet kattavat koko ryhmän , kaikki yhdistetyt elementit ovat erilaisia. Kyseessä on siis todellakin näkemys.

Todistuksesta seuraa, että kosettien edustajina voidaan ottaa elementtejä, jotka toteuttavat kiertoradan eri pisteet [19] .

Omistustarkistus

Merkitään sellaisella elementillä , että . Jakamalla stabilointisarjaan voit tarkistaa, kuuluuko elementti ryhmään [7] :

Näiden ominaisuuksien avulla voit tehdä siirtymisen kohteesta , mikä johtaa lopulta siihen, että nykyisen elementin tulisi sijaita kohdassa . Jos näin todella on, niin , mistä on mahdollista ilmaista [7] .

Ratalaskenta

Anna ryhmälle generointisarja . Minkä tahansa ryhmän toiminnan alaisen elementin kiertorata voidaan järjestää seuraavan muotoiseksi puuksi [17] :

Kuvattu puu voidaan rakentaa syvyys -first-läpikululla, tätä varten on tarpeen lajitella elementtiä kussakin kärjessä , kunnes käy ilmi, että [17] ei ole vielä varattu kärkeä . Toteutusesimerkki Pythonissa :

# Muodostaa kiertoratapuun tietyllä elementillä w ja generoivalla joukolla S def build_schreier_tree ( w , S , orbit ): for g in S : if g [ w ] ei ole kiertoradalla : kiertorata [ g [ w ] ] = sovelletaan ( g , kiertorata [ w ]) build_schreier_tree ( g [ w ], S , orbit )

Tässä funktio palauttaa tuloksen ryhmäoperaation soveltamisesta elementteihin ja ensimmäisenä ja toisena argumenttina, ja elementti tallennetaan kohtaan .

Schreierin Lemma

Schreier-lemasta seuraa, että stabilisaattorin muodostaa joukko Schreier-generaattoreita: . Tämän tuloksen avulla voimme muodostaa generointijoukon for elementin generaattorijoukosta ja elementin radasta . Mahdollinen toteutus funktiolle, joka palauttaa uuden generointijoukon [20] :

# Ottaa generaattorijoukon G_{w-1} ja kiertoradan w # Palauttaa generaattorijoukon G_w def make_gen ( S , orbit ): n = len ( next ( iter ( S ))) newS = set () for s in S : for u in orbit : newS . add ( vähentää ( soveltaa , [ käänteinen ( kiertorata [ s [ u ]] ), s , kiertorata [ u ]])) return newS

Algoritmi ei tyhjene tässä, sillä vaikka uuden generaattorijoukon koko riippuu polynomiaalisesti kiertoradan koosta ja vanhasta generaattorijoukosta yhdelle yksittäiselle kutsulle, yhteenlaskettuna kaikkien tämän funktion kutsujen osalta generoivan joukon koko. joukko kasvaa eksponentiaalisesti [2] .

Seulontageneraattorit

Generaattorisarjojen hallitsemattoman kasvun välttämiseksi on käytettävä seulontamenettelyä . Tämä vaatisi seuraavan lausunnon [3] [20] :

Anna . Sitten on mahdollista rakentaa joukko enintään elementtejä siten, että .

Todiste

Todistetaan ensin seuraava lemma:

Anna . Sitten seuraavat muunnokset eivät muutu :

  1. Korvaava varten
  2. Korvataan , missä ja
Todiste

Saavutetaan joukko . On selvää, että . Toisaalta nämä muunnokset voidaan peruuttaa samantyyppisillä muunnoksilla, joten . Joten .

Tällaisten muunnosten avulla voimme pienentää joukon sellaiseen muotoon, että mille tahansa joukon parille on enintään yksi alkio , joka:

s ( ω yksi ) = ω yksi ,   s ( ω 2 ) = ω 2 , … ,   s ( ω i − yksi ) = ω i − yksi ,   s ( ω i ) = ω j ≠ ω i {\displaystyle s(\omega _{1})=\omega _{1},\ s(\omega _{2})=\omega _{2},\dots ,\ s(\omega _{i- 1})=\omega _{i-1},\ s(\omega _{i})=\omega _{j}\neq \omega _{i}} Tämä voidaan saavuttaa lisäämällä elementtejä uuteen joukkoon yksi kerrallaan ja toimimalla samalla tavalla kuin Gaussin menetelmässä :

  1. Oletetaan, että haluamme lisätä uuden elementin ,
  2. Mennään peräkkäin
    1. Jos , niin mene osoitteeseen ,
    2. Jos , niin tarkista onko elementti , jolla on tällainen pari , jo tavattu ,
      1. Jos tapasimme, korvaa se ja siirry osoitteeseen
      2. Muussa tapauksessa muista, mikä vastaa paria , ja lisää nykyiseen muotoon ,
  3. Jos algoritmin loppuun mennessä meillä on , jätämme huomioimatta emmekä muuta .

Tämä algoritmi käyttää vain yllä mainittuja perusoperaatioita, joten . Huomaa, että jos , niin , joten algoritmin siirtyminen kohteesta on oikea, ja jokainen pari vastaa itse asiassa enintään yhtä permutaatiota. Kun otetaan huomioon, että tällaisia ​​pareja on enintään , saadaan vaadittu väite.

Todistuksessa kuvattua menettelyä kutsutaan Sims-suodattimeksi ja se toimii [21] . Sen toteutus saattaa näyttää tältä:

# Ottaa pääjoukon S # Palauttaa ohennetun kantajoukon S' def normalisoi ( S ) : n = len ( next ( iter ( S ))) newS = set () kanta = [{} for i alueella ( n )] s :lle S : lle x alueella ( 0 , n ) : jos s [ x ] ! = x : jos s [ x ] kantaosassa [ x ]: s = sovelletaan ( käänteinen ( s ) , kanta [ x ][ s [ x ]]) else : kanta [ x ][ s [ x ]] = s uutinenS . lisää ( t ) tauko paluu uutinenS

Sims- suodattimen lisäksi Jerrum-suodatinta [22] voidaan käyttää pienen sarjan etsimiseen . Toisin kuin Sims-suodatin, joka löytää joukon enintään elementtejä, Jerrum-suodatin löytää joukon enintään elementtejä. Samanaikaisesti Jerrum-suodatin toimii :lle , joten Schreier-Sims-algoritmin tapauksessa on suositeltavaa käyttää Sims-suodatinta [21] .

Algoritmi

Kaikki edellä mainitut yhdessä muodostavat algoritmin, joka voidaan toteuttaa ytimekkäästi seuraavasti [20] :

# Ottaa generointijoukon S = s1, ..., sk # Palauttaa coset transversaalit U1, ..., Uk def schreier_sims ( S ): n = len ( next ( iter ( S ))) ans = [] w = 0 kun taas S : kiertorata = {} kiertorata [ w ] = monikko ( alue ( n )) build_schreier_tree ( w , S , orbit ) ans += [[ orbit [ i ] for i in orbit ]] S = normalisoi ( make_gen ( S , orbit )) w += 1 paluu ans

Askel askeleelta sen toimilla on seuraava merkitys:

  1. Elementin kiertorata rakennetaan syvähakulla,
  2. Kaikki Schreier-generaattorit on laskettu ,
  3. Monet generaattorit tuhoutuvat niiden eksponentiaalisen kasvun välttämiseksi.

Lähdössä algoritmi palauttaa listan, jonka elementit ovat kosettien poikittaissuuntauksia .

Algoritmin ajoaika

Kaiken kaikkiaan algoritmi ei vaadi enempää iteraatioita. Jokainen iteraatio koostuu seuraavista:

  1. Ratapuun rakentaminen, joka suorittaa perusoperaatioita,
  2. Schreier-generaattoreiden rakentaminen, joka suorittaa perusoperaatioita ja palauttaa generaattoreita,
  3. Generointijoukon normalisointi, joka suorittaa alkeisoperaatioita, missä  on edellisessä vaiheessa saatu joukko.

Arvo siinä tapauksessa, että joukko annetaan , ei muutu algoritmin aikana ja on yhtä suuri kuin . Generointijoukon koko on alun perin yhtä suuri kuin , eikä missään seuraavassa vaiheessa ylitä . Näin ollen algoritmin kokonaisajoaika yllä olevassa toteutuksessa voidaan arvioida [8] [12] [13] .

Algoritmin muunnelmia

Pseudo-lineaariset versiot

Aikaisemmin on osoitettu, että algoritmi vaatii iteraatioita. Yleisessä tapauksessa ryhmän koko voi olla suuruusluokkaa , ja tässä tapauksessa Stirlingin kaavan mukaan, joka on selvästi suurempi . Mutta joissain tapauksissa ryhmän järjestys on pieni, ja siksi on kannattavampaa käyttää algoritmia, joka riippuu , eikä  - esimerkiksi kun on kyse jostain tunnetusta ryhmästä, joka annetaan permutaatioryhmänä [12] .

Cayleyn lauseen mukaan mikä tahansa äärellinen ryhmä on isomorfinen jollekin permutaatioryhmälle . Tällaisen ryhmän aste voi olla suuri, mutta monien ryhmien järjestys on sellainen, että . Esimerkiksi dihedraalinen ryhmä on isomorfinen syklisen siirron ja heijastuksen synnyttämälle permutaatioryhmälle . Eli tämän ryhmän aste on , ja järjestys on , ja . Tällaisille ryhmille voidaan harkita algoritmeja, joiden käyntiaika on , ja joita kutsutaan pseudolineaariseksi [12] .

Yrittäessään tuoda algoritmia lähemmäksi pseudo-lineaarista ja pienentää sen ajoaikaan sisältyvää astetta Sheresh päätyi algoritmin versioihin, jotka vaativat [18] :

  1. aikaa ja muistia
  2. aikaa ja muistia.

Todennäköisyyspohjainen versio

Ensimmäisen toimivan todennäköisyyspohjaisen version algoritmista kehitti Jeffrey Leon vuonna 1980 [11] . Yleensä tätä he tarkoittavat puhuessaan todennäköisyydestä Schreyer-Sims -menetelmästä. Siinä, kun Schreier-generaattoreita harvennettiin, tämä menettely lopetettiin ennenaikaisesti, jos 20 generaattoria peräkkäin osoittautui tekijäksi. Sheresh osoitti, että yhdessä joidenkin optimointien kanssa tämä menettely antaa seuraavan lausuman [5] :

Jokaiselle vakiolle on olemassa Monte Carlo -tyyppinen algoritmi , joka korkeintaan virhetodennäköisyydellä rakentaa vahvan generaattorijoukon permutaatioryhmälle käyttämällä aikaa ja muistia.

Nykyaikaisissa tietokonealgebrajärjestelmissä käytetään yleensä tämän algoritmin muunnelmia erilaisilla heuristikoilla nopeuttamaan ohjelmaa [5] .

Muistiinpanot

  1. 1 2 3 Sims, 1970 , s. 169-170.
  2. 1 2 3 4 5 Murray, 2003 , s. 1-3.
  3. 1 2 3 4 5 Holt, Eyck, O'Brien, 2005 , s. 87-90.
  4. 1 2 Sheresh, 2003 , s. 1-4.
  5. 1 2 3 4 Sheresh, 2003 , s. 62-64.
  6. 1 2 Brouwer, 2016 , s. neljä.
  7. 1 2 3 4 5 6 7 Sims, 1970 , s. 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 , s. 48-54.
  13. 1 2 Holt, Eyck, O'Brien, 2005 , s. 93-94.
  14. Zhuravlev, Flerov, Vyaly, 2019 , Permutaatiot, s. 31-36.
  15. Holt, Eyck, O'Brien, 2005 , s. 1-7.
  16. Murray, O'Brien, 1995 .
  17. 1 2 3 Murray, 2003 , s. 9-24.
  18. 1 2 Sheresh, 2003 , s. 59-62.
  19. 1 2 Zhuravlev, Flerov, Vyaly, 2019 , Radat ja stabilisaattorit, s. 140-145.
  20. 1 2 3 Murray, 2003 , s. 25-33.
  21. ↑ 1 2 Vipul Naik. Sims-suodatin  (englanniksi) . Groupprops, The Group Properties Wiki . Haettu 23. syyskuuta 2019. Arkistoitu alkuperäisestä 1. syyskuuta 2019.
  22. Vipul Naik. Jerrumin  suodatin . Groupprops, The Group Properties Wiki . Haettu 19. syyskuuta 2023. Arkistoitu alkuperäisestä 1. syyskuuta 2019.

Kirjallisuus