Drucken Sie die "geraden" Permutationen der symmetrischen Gruppe Sn in zyklischer Notation


9

DIE AUFGABE

DEFINITIONEN

Betrachten Sie die Punkte {1,2,3,4,5} und alle ihre Permutationen. Wir können die Gesamtzahl der möglichen Permutationen dieser 5 Punkte durch einen einfachen Trick ermitteln: Stellen Sie sich vor, Sie füllen 5 Slots mit diesen Punkten, der erste Slot hat 5 mögliche Nummern, der zweite 4 (wie einer verwendet wurde, um den ersten Slot zu füllen). die dritte 3 und so weiter. Somit beträgt die Gesamtzahl der Permutationen 5 * 4 * 3 * 2 * 1; das wäre 5! Permutationen oder 120 Permutationen. Wir können uns dies als die symmetrische Gruppe S5 vorstellen, und dann hätte die symmetrische Gruppe Sn n! or (n*n-1*n-2...*1)Permutationen.

Eine "gerade" Permutation ist eine, bei der es eine gerade Anzahl von Zyklen mit gerader Länge gibt. Es ist am einfachsten zu verstehen, wenn es in zyklischer Notation geschrieben ist, zum Beispiel (1 2 3)(4 5)permutiert 1->2->3->1und 4->5->4einen 3-Längen-Zyklus (1 2 3)und einen 2-Längen-Zyklus hat (4 5). Wenn wir eine Permutation als ungerade oder gerade klassifizieren, ignorieren wir ungerade Längenzyklen und sagen, dass diese Permutation [ (1 2 3)(4 5)] ungerade ist, da sie eine ungerade Anzahl {1} ​​von geraden Längenzyklen hat. Sogar Beispiele:

  1. (1)(2 3)(4 5)= zwei 2 Längenzyklen | AUCH |
  2. (1 2 3 4 5)= keine geraden Längenzyklen | AUCH | * Beachten Sie, dass die Permutation gerade ist, wenn keine Zyklen mit gerader Länge vorhanden sind.

Seltsame Beispiele:

  1. (1 2)(3 4 5)= ein Zyklus mit 2 Längen | ODD |
  2. (1)(2 3 4 5)= ein Zyklus mit 4 Längen | ODD |

Da genau die Hälfte der Permutationen in einer symmetrischen Gruppe gerade sind, können wir die gerade Gruppe als alternierende Gruppe N bezeichnen, also als S5 = 120 A5 = 60 Permutationen.

NOTATION

Zumindest dafür sollten Permutationen in zyklischer Notation geschrieben werden, wobei jeder Zyklus in einer anderen Klammer steht und jeder Zyklus in aufsteigender Reihenfolge abläuft. Zum Beispiel (1 2 3 4 5)nicht (3 4 5 1 2). Und für Zyklen mit einer einzelnen Zahl, wie zum Beispiel: (1)(2 3 4)(5)Die einzelnen / festen Punkte können ausgeschlossen werden (1)(2 3 4)(5) = (2 3 4). Aber die Identität (der Punkt, an dem alle Punkte festgelegt sind (1)(2)(3)(4)(5)) sollte nur geschrieben werden (), um sie darzustellen.

DIE HERAUSFORDERUNG

Ich möchte, dass Sie in so wenig Code wie möglich eine positive ganze Zahl als Eingabe {1,2,3,4 ...} nehmen und alle Permutationen der alternierenden Gruppe An anzeigen, wobei n die Eingabe / alle Geraden ist Permutationen von Sn. Beispielsweise:

Input = 3
()
(1 2 3)
(1 3 2)

und

Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)

Und wie in den Beispielen möchte ich, dass alle Zyklen einer Länge entfernt werden, und was die Identität betrifft: Ausgaben von nichts, (){nicht nur Klammern, sondern mit allem, was Sie verwenden, um unterschiedliche Permutationen anzuzeigen} oder idakzeptabel sind.

ZUSÄTZLICHE LESUNG

Weitere Informationen finden Sie hier:

VIEL GLÜCK

Und da dies ein Codegolf ist, gewinnt jeder, der die Permutationen der alternierenden Gruppe An in kürzesten Bytes drucken kann.


2
Willkommen bei Programming Puzzles und Code Golf! Normalerweise erlauben wir eine flexible Ausgabe, damit Sprachen, die Probleme mit der Ausgabe im richtigen Format haben, keinen unfairen Nachteil haben. Darf zum Beispiel [[1, 2], [3, 4]]statt ausgegeben werden (1 2)(3 4)?
Adnan

@Adnan Ja, ich hätte es klarstellen sollen. Solange die verschiedenen Zyklen separat angezeigt werden, sollte es kein Problem geben, wie Sie dies dargestellt haben.
Harry

"Eine" gerade "Permutation ist eine, bei der es eine gerade Anzahl von geraden Permutationen gibt." Dies sieht aus wie eine zyklische Definition. Vielleicht zuerst die Zyklusnotation einführen und dann diesen Satz in "... gerade Anzahl von Zyklen mit gerader Länge" umschreiben?
Martin Ender

Wie setze ich den Zyklus (2 3 1 4)in aufsteigender Reihenfolge? Meinen Sie damit, wir sollten nur das kleinste Element in den Vordergrund stellen?
Martin Ender

@MartinEnder Ja das kleinste Element lang zuerst als gehen sollte , wie es verwirrt nicht mit dem Auftrag, um (2 3 1 4)nicht 2->3->1->4->2kann geschrieben werden , (1 4 2 3)zuerst mit seinem kleinsten Elemente
Harry

Antworten:


5

Pyth, 26 Bytes

t#Mf%+QlT2mcdf<>dTS<dTd.pS

          m            .pSQ   Map over permutations d of [1, …, Q]:
             f        d         Find all indices T in [1, …, Q] such that
               >dT                the last Q-T elements of d
              <   S<dT            is less than the sorted first T elements of d
           cd                   Chop d at those indices
   f                          Filter on results T such that
      Q                         the input number Q
     + lT                       plus the length of T
    %    2                      modulo 2
                                is truthy (1)
t#M                           In each result, remove 0- and 1-cycles.

Probieren Sie es online aus

Diese Lösung basiert auf einer sauberen Bijektion zwischen Permutationen in Einzeilennotation und Permutationen in Zyklusnotation. Natürlich gibt es die offensichtliche Bijektion, bei der die beiden Notationen dieselbe Permutation darstellen:

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (1 8 9 2 4 3 6) (5 10 7)

aber das würde zu viel Code erfordern. Zerhacken Sie stattdessen einfach die einzeilige Notation vor allen Zahlen, die kleiner als alle ihre Vorgänger sind, in Teile, rufen Sie diese Teilzyklen auf und erstellen Sie daraus eine neue Permutation.

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] 8 (8) (4 6) (3 10) (1 5 9 2 7)

Um diese Bijektion umzukehren, können wir jede Permutation in Zyklusform nehmen, jeden Zyklus so drehen, dass seine kleinste Zahl an erster Stelle steht, die Zyklen so sortieren, dass ihre kleinsten Zahlen in absteigender Reihenfolge erscheinen, und alle Klammern löschen.


Das OP erfordert, dass die Identitätspermutation ohne Einzyklen dargestellt wird. Ich denke, es wäre besser, wenn es nicht der Fall wäre.
Meilen

1
Harry schien meine Jelly-Antwort zu akzeptieren, die sogar für 1 Zyklen druckt id. Vielleicht könnte er mitmachen?
Lynn

Ich bin mir auch nicht so sicher, wie es formuliert ist, und ich habe nicht bemerkt, dass Ihre (Lynns) Lösung dasselbe tat.
Meilen

Mein Verständnis war, dass Sie die Identitätspermutation nicht mit der leeren Zeichenfolge darstellen konnten, daher habe ich meine Antwort geändert, um alle 1-Zyklen beizubehalten (auch bequem 6 Bytes zu sparen).
Neil

1
Ich habe meine Frage so bearbeitet, dass sie klarer ist. Ich möchte, dass die "Ein-Zyklen" entfernt werden, wie Sie es im zweiten Teil Ihrer Antwort getan haben. Übrigens gut gemacht.
Harry

6

Mathematica, 84 49 31 Bytes

GroupElements@*AlternatingGroup

Zusammensetzung zweier Funktionen. Ausgänge in Form {Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}darstellt (), (a b), (c d)(e f), ....


3

J , 53 Bytes

[:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]

Die Zyklen in jeder Permutation werden als Box-Arrays dargestellt, da J zerlumpte Arrays mit Null-Pad auffüllt.

Wenn die Ausgabe entspannt ist, verwenden Sie 41 Bytes

[:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]

wobei jede Permutation Ein-Zyklen und Null-Zyklen enthalten kann.

Verwendungszweck

   f =: [:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]
   f 3
┌┬───────┬───────┐
││┌─────┐│┌─────┐│
│││1 2 3│││1 3 2││
││└─────┘│└─────┘│
└┴───────┴───────┘
   f 4
┌┬───────┬───────┬─────────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┬─────────┐
││┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌───┬───┐│
│││2 3 4│││2 4 3│││1 2│3 4│││1 2 3│││1 2 4│││1 3 2│││1 3 4│││1 3│2 4│││1 4 2│││1 4 3│││2 3│1 4││
││└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└───┴───┘│
└┴───────┴───────┴─────────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┴─────────┘

Für die alternative Implementierung

   f =: [:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]
   f 3
┌─────┬─┬─┐
│1    │2│3│
├─────┼─┼─┤
│1 2 3│ │ │
├─────┼─┼─┤
│1 3 2│ │ │
└─────┴─┴─┘

Das ist wirklich schön ... gut gemacht.
Harry

2

Gelee , 34 28 Bytes

L€’SḂ
ṙLR$Ṃµ€Ṣ
Œ!ŒṖ€;/Ç€ÑÐḟQ

Probieren Sie es hier aus .

Erläuterung

Jede Zeile in einem Jelly-Programm definiert eine Funktion. Das unterste ist " main".

  • Die erste Zeile definiert eine Funktion, die prüft, ob ein Zyklusprodukt ungerade ist.

    L€      Length of each
      ’     Add 1 to each length 
       S    Take the sum
        Ḃ   Modulo 2
    
  • Die zweite Zeile normalisiert eine Partition einer Permutation [1…n]in ein Zyklusprodukt wie folgt:

         µ€    For each list X in the partition:
    ṙLR$          Rotate X by each element in [1…length(X)].
        Ṃ         Get the lexicographically smallest element.
                  Thus, find the rotation so that the smallest element is in front.
           Ṣ   Sort the cycles in the partition.
    

    Dies wird zB (4 3)(2 5 1)in (1 2 5)(3 4).

Hier ist das Hauptprogramm. Es nimmt ein Argument nvon der Kommandozeile und:

Œ!              Compute all permutations of [1…n].
  ŒṖ€           Compute all partitions of each permutation.
     ;/         Put them in one big list.
       ǀ       Normalize each of them into a cycle product.
         ÑÐḟ    Reject elements satisfying the top function,
                i.e. keep only even cycle products.
            Q   Remove duplicates.

Ich habe versucht, es mit 5 als Eingabe auszuführen, und habe überhaupt keine Ausgabe erhalten. Ist dieses Skript nur für die Gruppen A3 und A4 oder kann es möglicherweise eine Gruppe angeben? Ich habe Jelly noch nie gesehen, daher wäre jede Erklärung hilfreich.
Harry

Nein, ich habe bisher nur 3 und 4 in die Herausforderung gestellt. Bisher gewinnen Sie, aber ich möchte wirklich nur mehr lernen.
Harry

Jelly hat tatsächlich eine eingebaute Partition, die ich vergessen habe! Zum Glück erinnerte mich ein Freund. Jetzt ist es effizienter (Griffe n = 5, yay!) Und kürzer.
Lynn

OP hat die Frage bearbeitet, um zu verdeutlichen, dass 1-Zyklen beseitigt werden müssen.
Anders Kaseorg

2

JavaScript (Firefox 30-57), 220 218 212 211 Byte

f=(a,p)=>a[2]?[for(i of a)for(j of f(a.filter(m=>m!=i),p,p^=1))[i,...j]]:[[a[p],a[p^1]]]

Leider reichen 88 Bytes nur aus, um die alternierende Gruppe als Liste von Permutationen von zu generieren. Die Konvertierung der Ausgabe in das gewünschte Format akostet mich dann zusätzlich 132 130 124 123 Bytes:

n=>f([...Array(n).keys()],0).map(a=>a.map((e,i)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&s)

Ich habe es geschafft, meine ES6-Version auf 222 216 215 Bytes zu reduzieren:

n=>(g=(a,p,t=[])=>a[2]?a.map(e=>g(a.filter(m=>m!=e),p,[...t,e],p^=1)):[...t,a[p],a[p^1]].map((e,i,a)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&r.push(s))([...Array(n).keys(r=[])],0)&&r

Es macht mir nichts aus, wenn das Format nicht in perfekter zyklischer Notation vorliegt, solange: Jede Permutation und ihre Zyklen werden separat angezeigt (wie [1 2 3] [4 5] und <<123> <45>> wären beide akzeptabel ) und Zyklen einer Länge werden entfernt. Vielleicht kann dies Ihre Antwort verkürzen
Harry

@ Harry würde ich nie zeigen (1,2,3)(4,5)- das ist eine seltsame Permutation! Momentan würde ich zB zeigen, dass (1,2,3)(4)(5)das Entfernen von Zyklen der Länge 1 nicht nur 6 Bytes kostet, sondern auch ein leeres Ergebnis für den Identitätszyklus ergibt, dessen Korrektur weitere 4 Bytes kosten würde.
Neil

Wenn Sie meinen, dass nichts für die Identität gedruckt wird, werde ich das wie gesagt akzeptieren as for the identity outputs of nothing ... are accepatble. Und was würde auch angezeigt, wenn Sie Ihre "Rohdaten" ausgeben, kommt es in der Form (1,2,3) (4) (5) oder als etwas anderes?
Harry

@Harry Jetzt ohne Zyklen der Länge eins, einschließlich eines leeren Eintrags für die Identität, und trotzdem ein Byte speichern!
Neil

@ Harry Raw-Daten wären [1, 2, 0, 3, 4]für dieses spezielle Beispiel bestimmt, also bei weitem nicht das, was Sie wollen.
Neil

1

GAP , 32 Bytes

Vielen Dank an @ChristianSievers für die Halbierung der Anzahl.

f:=n->List(AlternatingGroup(n));

Verwendung an der Eingabeaufforderung:

gap> f(4);
[ (), (1,3,2), (1,2,3), (1,4,3), (2,4,3), (1,3)(2,4), (1,2,4), (1,4)(2,3), (2,3,4), (1,3,4), (1,2)(3,4), (1,4,2) ]

Sehr schöne Formatierung, ich denke, GAP war eine sehr gute Wahl, um dieses Problem zu beantworten.
Harry

Ihre Antwort zeigt nicht, wo eine Permutation endet und die nächste beginnt. Unter der Annahme , die Funktion muss nicht die Werte als Nebeneffekt drucken, kann aber nur die Werte als Liste zurückzukehren vom Interpreter gedruckt werden, ich tun würdef:=n->List(AlternatingGroup(n));
Christian Sievers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.