Schreier -Sims -Algorithmus

Das Schreier -Sims -Algorithmus ist ein Algorithmus in Computergruppentheorie, benannt nach den Mathematikern Otto Schreier und Charles Sims. Dieser Algorithmus kann das finden bestellen einer endlichen Permutationsgruppe, der Testmitgliedschaft (ist eine gegebene Permutation in einer Gruppe enthalten?) Und viele andere Aufgaben in der Polynomzeit. Es wurde 1970 von Sims vorgestellt, basierend auf Schreiers Untergruppe Lemma. Das Timing wurde anschließend durch verbessert durch Donald Knuth 1991. später noch schneller zufällig Die Version des Algorithmus wurde entwickelt.

Hintergrund und Timing

Der Algorithmus ist eine effiziente Methode zum Berechnen a Base und starker Erzeugungssatz (BSGS) von a Permutationsgruppe. Insbesondere ein SGS bestimmt die Reihenfolge einer Gruppe und erleichtert die Bewertung der Mitgliedschaft in der Gruppe. Da die SGS für viele Algorithmen in der Computergruppentheorie von entscheidender Bedeutung ist, Computeralgebra -Systeme In der Regel verlassen Sie sich auf den Schreier -SIMS -Algorithmus für effiziente Berechnungen in Gruppen.

Die Laufzeit von Schreier - Sims variiert von der Implementierung. Lassen gegeben werden durch Generatoren. Für die deterministisch Version des Algorithmus, mögliche Laufzeiten sind:

  • Speicher benötigen
  • Speicher benötigen

Die Verwendung von Schreier Vektoren kann einen erheblichen Einfluss auf die Durchführung des Schrei -SIMS -Algorithmus haben.

Zum Monte Carlo Variationen des Schreier -SIMS -Algorithmus haben die folgende geschätzte Komplexität:

Speicher benötigen

In modernen Computeralgebra -Systemen wie z. LÜCKE und Magma, ein optimiert Monte Carlo Algorithmus wird normalerweise verwendet.

Umriss des Basisalgorithmus

Im Folgenden finden Sie C ++-Stil-Pseudo-Code für die Grundidee des Schreier-Sims-Algorithmus. Es soll alle feineren Details herauslassen, wie z. B. Speichermanagement oder jede Art von Optimierung auf niedriger Ebene, um die wichtigsten Ideen des Algorithmus nicht zu verschleiern. Es muss nicht tatsächlich kompiliert werden.

Struktur Gruppe {   uint Stichpunkt;  // Ein Index in die Basis für den von der Untergruppe dieser Gruppe stabilisierten Punkt.   Orbittree Orbittree; // Ein Baum, um die Umlaufbahn in unserer Gruppe der von unserer Untergruppe stabilisierten Punkte zu verfolgen.   Transverset Transverset; // Eine Reihe von Coset -Vertretern der Untergruppe dieser Gruppe.   Generatorsatz Generatorsatz; // eine Reihe von Permutationen, die diese Gruppe generieren.   Gruppe* Untergruppe; // Ein Zeiger auf die Untergruppe dieser Gruppe oder null, um die triviale Gruppe zu bedeuten.   Gruppe(uint Stichpunkt)   {   Dies->Stichpunkt = Stichpunkt;   Untergruppe = nullptr;   } }; // Der angegebene Satz von Generatoren muss kein starker Erzeugungssatz sein. Es muss nur die Gruppe an der Wurzel der Kette erzeugen. Gruppe* Makestabchain(Const Generatorsatz& Generatorsatz, uint* Base) {   Gruppe* Gruppe = Neu Gruppe(0);   zum (Generator in Generatorsatz)   Gruppe->Erweitern(Generator, Base);   Rückkehr Gruppe; } // Erweitern Sie die in dieser Gruppe verwurzelte Stabilisatorkette mit dem angegebenen Generator. Leere Gruppe :: Erweitern(Const Permutation& Generator, uint* Base) {   // Dies ist die Hauptoptimierung von Schreier-SIMS. Unkraut überflüssige Schreier Generatoren.   wenn (Ismember(Generator))   Rückkehr;   // Unsere Gruppe wurde gerade größer, aber die in unserer Untergruppe verwurzelte Stabilisatorkette ist immer noch gleich.   Generatorsatz.Hinzufügen(Generator);   // Erforschen Sie alle neuen Umlaufbahnen, die wir mit dem neuen Generator erreichen können.   // Beachten Sie, dass die Identität zurückgegeben werden muss, wenn der Baum leer war   // im Set, um einen Zustand von Schreiers Lemma zu befriedigen.   NewterritorySet = Orbittree.Größer werden(Generator, Base);   // Nach dem Theorem des Orbit-Stabilisators sind die Permutationen im zurückgegebenen Satz   // COSET -Vertreter der Cosets unserer Untergruppe.   zum (Permutation in NewterritorySet)   Transverset.Hinzufügen(Permutation);   // Wir wenden jetzt Schreiers Lemma an, um neue Generatoren für unsere Untergruppe zu finden.   // Einige Iterationen dieser Schleife sind überflüssig, aber wir ignorieren das für den Einfachheit halber.   zum (cosetrepesentative in Transverset)   {   zum (Generator in Generatorsatz)   {   Schreiergenerator = CalcSchRiergenerator(cosetrepesentative, Generator);   wenn (Schreiergenerator.Identität())   fortsetzen;      wenn (!Untergruppe)   Untergruppe = Neu Gruppe(Stichpunkt + 1);   Untergruppe->Erweitern(Schreiergenerator, Base);   }   } } 

Zu den bemerkenswerten Details hier sind das Anbau des Umlaufbaums und die Berechnung jedes neuen Schreier -Generators gehören. Anstelle des Umlaufbaums, a Schreier Vector Kann verwendet werden, aber die Idee ist im Wesentlichen dieselbe. Der Baum ist auf dem Identitätselement verwurzelt, das den von der Untergruppe stabilisierten Punkt festlegt. Jeder Knoten des Baumes kann eine Permutation darstellen, die in Kombination mit allen Permutationen im Pfad von der Wurzel zu einem neuen Punkt zu einem neuen Punkt führt, der nicht von einem anderen Knoten des Baumes besucht wird. Bis zum Orbit-Stabilisator-Theorem, diese Form a Transversal der Untergruppe unserer Gruppe, die den Punkt stabilisiert, dessen gesamte Umlaufbahn vom Baum aufrechterhalten wird. Die Berechnung eines Scherer -Generators ist eine einfache Angelegenheit der Bewerbung Schreiers Untergruppe Lemma.

Ein weiteres Detail ist der Mitgliedstest. Dieser Test basiert auf dem Seitprozess. Eine Permutation wird bei jedem Schritt die Kette durch Finden des Cosets in der Kette eingerichtet und dann den Vertreter des Cosets verwendet, um eine Permutation in der Untergruppe zu finden, und der Vorgang wird in der Untergruppe mit dieser gefundenen Permutation wiederholt. Wenn das Ende der Kette erreicht ist (d. H. Wir erreichen die triviale Untergruppe), war die gesiebte Permutation ein Mitglied der Gruppe an der Spitze der Kette.

Verweise

  • Knuth, Donald E. "Effiziente Darstellung von Perm -Gruppen". Combinatorica 11 (1991), Nr. 1, 33–43.
  • Seress, A., Permutationsgruppenalgorithmen, Cambridge U Press, 2002.
  • Sims, Charles C. "Computermethoden in der Untersuchung von Permutationsgruppen", in Computerprobleme in abstrakten Algebra, S. 169–183, Pergamon, Oxford, 1970.