Eine Permutation der Größe n ist eine Neuordnung der ersten n positiven ganzen Zahlen. (Das bedeutet, dass jede Ganzzahl genau einmal vorkommt.) Permutationen können wie Funktionen behandelt werden, die die Reihenfolge einer Liste von Elementen der Größe n ändern . Beispielsweise
(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]
Somit können Permutationen wie Funktionen zusammengesetzt werden.
(4 1 2 3)(2 1 3 4) = (4 2 1 3)
Dies bringt viele interessante Eigenschaften mit sich. Heute konzentrieren wir uns auf die Konjugation . Die Permutationen y und x (beide der Größe n ) sind Konjugate, wenn die Permutationen g und g -1 (auch der Größe n ) so sind, dass
x = gyg-1
und gg -1 ist gleich der Identitätspermutation (die ersten n Zahlen in der richtigen Reihenfolge).
Ihre Aufgabe ist es, über Standardeingabemethoden zwei gleich große Permutationen zu nehmen und zu entscheiden, ob es sich um Konjugate handelt. Sie sollten einen von zwei konsistenten Werten ausgeben, einen, wenn es sich um Konjugate handelt, und den anderen, wenn dies nicht der Fall ist.
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Es gibt viele Theoreme über konjugierte Permutationen, die Ihnen zur Verfügung stehen, also viel Glück und glückliches Golfen.
Sie können Eingaben als einen geordneten Container mit Werten (entweder 1-n oder 0-n) annehmen, die die Permutation wie oben darstellen, oder als eine Funktion, die einen geordneten Container annimmt und die Permutation ausführt. Wenn Sie die Funktion übernehmen möchten, sollten Sie sie als Argument verwenden, anstatt sie unter einem vordefinierten Namen zu haben.
Testfälle
(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True
quelle
Antworten:
Python 2 , 87 Bytes
Probieren Sie es online!
Nimmt Eingaben mit
P
als Paar beider Permutationen undk
ihrer Länge. Ausgänge1
für Konjugate und0
nicht.Dies verwendet das Ergebnis:
Zwei konjugierte Permutationen erfüllen dies, weil ihre k- ten Potenzen ebenfalls konjugiert sind und die Konjugation die Anzahl der Fixpunkte beibehält.
Es ist weniger offensichtlich, dass sich zwei nicht konjugierte Permutationen immer unterscheiden. Insbesondere wird die Konjugation durch die sortierte Liste der Zykluslängen bestimmt, und diese können aus den Zählwerten der festen Punkte gewonnen werden. Eine Möglichkeit, dies zu zeigen, ist die lineare Algebra, auch wenn es zu viel des Guten ist.
Sei X die Permutationsmatrix für x . Dann wird die Anzahl von Fixpunkten von x k ist Tr (X k ) . Diese Kurven sind die leistungssummensymmetrischen Polynome der Eigenwerte von X k mit Multiplizität. Diese Polynome für k von 0 bis n geben die entsprechenden elementaren symmetrischen Polynome dieser Eigenwerte und damit das charakteristische Polynom und damit die Eigenwerte selbst wieder.
Da diese Eigenwerte Wurzeln der Einheit sind, die den Zyklen von x entsprechen , können wir aus diesen die Zyklusgrößen und ihre Multiplizitäten gewinnen. Unsere "Signatur" identifiziert also die Permutation bis zur Konjugation.
quelle
J ,
25 Bytes23 Bytes16 BytesMeilen ' stillschweigende Lösung:
Die explizite Lösung von OP:
Hiermit wird geprüft, ob die Permutationen x und y den gleichen Zyklustyp haben. Dabei wird die integrierte
C.
Funktion verwendet, um Zyklusdarstellungen zu erstellen.quelle
-:&([:/:~#&>)&C.
mit einer stillschweigenden Form auf 16 Bytes verkürzt . Hier ist ein TIO- Link, um es auszuprobieren.c=:
MATL ,
20191716 BytesEingabe: zwei Spaltenvektoren (
;
als Trennzeichen verwenden). Ausgabe:1
Wenn konjugiert,0
wenn nicht.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Keine Theoreme über verwendete Permutationen (aus purer Unwissenheit); nur rohe Gewalt und diese beiden Fakten:
Für zwei Permutationen p und q entspricht die Zusammensetzung pq der Verwendung von p zum Indizieren der Elemente von q .
Die Bedingung x = gyg −1 entspricht xg = gy .
Kommentierter Code:
quelle
Wolfram Language (Mathematica) , 44 Byte
Probieren Sie es online!
Wolfram Language (Mathematica) , 44 Byte
Bei Verwendung der CP-1252-Codierung
±
ist ein Byte erforderlich.Probieren Sie es online!
quelle
Jelly , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
y
die Indizes, die sich ineinander einfügeng⁻¹
und nicht umgekehrt. Siehe das Beispiel(4 1 2 3)(2 1 3 4) = (4 2 1 3)
. Bei Ihrer Vorgehensweise würde dies(1 4 2 3)
stattdessen dazu führen, dass die zweite in die erste indiziert wird. Unter Berücksichtigung dessen habe ich eine 12-Byte-Lösung, die ich noch nicht verderben werde. :-)Œ!©Ụ€⁹ịЀ®ị"⁸e
(im Grunde alle Indizierungen mit umgekehrten Argumenten), mit Ausnahme von Kürzeren, nachdem ich größere Änderungen vorgenommen hatte. Ich denke nichtg⁻¹yg
dasselbe wiegyg⁻¹
. Ich denke, Ihre Antwort kann auch von diesen Änderungen profitieren, aber wie ich bereits sagte, möchte ich den Spaß noch nicht ruinieren.x = g⁻¹yg
, danngxg⁻¹ = y
, sox
undy
ist Konjugate.eŒ!ị"Ụị@¥€¥¥
Schale , 9 Bytes
Gibt
1
für konjugiert und0
für nicht konjugiert zurück. Probieren Sie es online!Erläuterung
Die Konjugationsklasse einer Permutation P von L = [1,2, .., n] wird durch das Multiset bestimmt, das die kleinste Periode jeder Zahl in L unter P enthält . Wenn P im Listenformat genommen wird, kann ich L durch P ersetzen und das gleiche Multiset erhalten. Das Programm berechnet für jeden Eingang das entsprechende Multiset und prüft, ob eines ein Sub-Multiset des anderen ist. Da sie die gleiche Anzahl von Elementen haben, entspricht dies dem gleichen Multiset.
quelle
Perl,
615857 BytesBeinhaltet
+2
fürap
Geben Sie 0-basierte Permutationen als 2 Zeilen in STDIN an
Der Algorithmus ist eine geringfügige Abweichung von dem in xnors Lösung
Diese ältere Version des Codes stößt auf einen Perl-Fehler und löscht den Kern für mehrere Eingaben in meiner neuesten Perl-Version
5.26.1
, funktioniert jedoch in einer älteren Perl- Version5.16.3
.Es ist möglicherweise ein weiteres Beispiel für meinen alten Perlgolf-Feind, die Tatsache, dass Perl seinen Stapel nicht richtig zählt.
quelle
JavaScript (ES6),
6664 BytesWenn ich die anderen Antworten richtig gelesen habe, ist das Problem gleichbedeutend mit dem Zählen der Perioden aller Elemente und dem Überprüfen, ob die beiden Listen die gleiche Nummer für jede Periode haben. Bearbeiten: 1 Byte dank @Arnauld gespeichert, indem ein Byte weniger als der Zeitraum berechnet wurde. Dank @Arnauld konnte ein weiteres Byte gespart werden, indem die seltsamen Zwangsregeln von JavaScript zum Vergleichen der Arrays missbraucht wurden. Ein weiteres Byte könnte durch Curry gespeichert werden, aber ich mag kein Curry, es sei denn, es ist Chicken Tikka Masala.
quelle