Czy grupa jest cykliczna?

21

Wprowadzenie

Możesz pominąć tę część, jeśli już wiesz, co to jest grupa cykliczna.

Grupa jest zdefiniowana przez zestaw i asocjacyjną operację binarną $(to znaczy (a $ b) $ c = a $ (b $ c). Istnieje dokładnie jeden element w grupie, egdzie a $ e = a = e $ adla wszystkich aw grupie ( tożsamość ). Dla każdego elementu aw grupie istnieje dokładnie jeden btaki, że a $ b = e = b $ a( odwrotnie ) Dla każdego dwóch elementów a, bw grupie a $ bjest w grupie ( zamknięcie ).

Możemy pisać a^nzamiast a$a$a$...$a.

Cykliczna podgrupa generowana przez dowolny element aw grupie jest <a> = {e, a, a^2, a^3, a^4, ..., a^(n-1)}tam, gdzie njest kolejność (rozmiar) podgrupy (chyba że podgrupa jest nieskończona).

Grupa jest cykliczna, jeśli może być wygenerowana przez jeden z jej elementów.

Wyzwanie

Biorąc pod uwagę tabelę Cayleya (tabelę produktów) dla skończonej grupy, określ, czy jest ona cykliczna, czy nie.

Przykład

Rzućmy okiem na następujący stół Cayley:

1 2 3 4 5 6
2 3 1 6 4 5
3 1 2 5 6 4
4 5 6 1 2 3
5 6 4 3 1 2
6 4 5 2 3 1

(To jest tabela Cayley'a dla Dihedral Group 3, D_3).

Jest to indeksowane 1, więc jeśli chcemy znaleźć wartość 5 $ 3, patrzymy w piątą kolumnę w trzecim rzędzie (zauważ, że operator niekoniecznie jest przemienny, więc 5 $ 3niekoniecznie jest równy 3 $ 5. Widzimy tutaj to 5 $ 3 = 6(również, że 3 $ 5 = 4).

Możemy znaleźć <3>, zaczynając od [3], a następnie, gdy lista jest unikalna, dołącz iloczyn ostatniego elementu i generatora (3). Dostajemy [3, 3 $ 3 = 2, 2 $ 3 = 1, 1 $ 3 = 3]. Zatrzymujemy się tutaj z podgrupą {3, 2, 1}.

Jeśli obliczyć <1>poprzez <6>zobaczysz, że żaden z elementów w grupie wygenerować całą grupę. Zatem ta grupa nie jest cykliczna.

Przypadki testowe

Dane wejściowe będą podawane w postaci macierzy, dane wyjściowe jako wartość decyzji zgodna z prawdą / fałszem.

[[1,2,3,4,5,6],[2,3,1,6,4,5],[3,1,2,5,6,4],[4,5,6,1,2,3],[5,6,4,3,1,2],[6,4,5,2,3,1]] -> False (D_3)
[[1]] -> True ({e})
[[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3]] -> True ({1, i, -1, -i})
[[3,2,4,1],[2,4,1,3],[4,1,3,2],[1,3,2,4]] -> True ({-1, i, -i, 1})
[[1,2],[2,1]] -> True ({e, a} with a^-1=a)
[[1,2,3,4,5,6,7,8],[2,3,4,1,6,7,8,5],[3,4,1,2,7,8,5,6],[4,1,2,3,8,5,6,7],[5,8,7,6,1,4,3,2],[6,5,8,7,2,1,4,3],[7,6,5,8,3,2,1,4],[8,7,6,5,4,3,2,1]] -> False (D_4)
[[1,2,3,4,5,6],[2,1,4,3,6,5],[3,4,5,6,1,2],[4,3,6,5,2,1],[5,‌​6,1,2,3,4],[6,5,2,1,‌​4,3]] -> True (product of cyclic subgroups of order 2 and 3, thanks to Zgarb)
[[1,2,3,4],[2,1,4,3],[3,4,1,2],[4,3,1,2]] -> False (Abelian but not cyclic; thanks to xnor)

Będziesz mieć pewność, że dane wejściowe są zawsze grupą.

Możesz przyjmować dane wejściowe jako wartości 0-indeksowane.

HyperNeutrino
źródło
Czy dozwolone jest wprowadzanie z indeksowaniem 0? (np. [[0,1,2,3],[1,2,3,0],[2,3,0,1],[3,0,1,2]])?
Neil
@ Nee Tak; Zapomniałem podać. Dzięki!
HyperNeutrino
5
W przypadkach testowych powinieneś bardziej wstępnie etykietować elementy swojej grupy. W tej chwili zawsze pierwszy wiersz i kolumna tabeli [1..n]mogą ukrywać wady w niektórych odpowiedziach.
Lynn
3
Wygląda na to, że sprawdzenie, czy grupa jest abelowa, wystarcza do zaliczenia przypadków testowych. Przypadki testowe takie jak Z_2 * Z_2 to naprawiłyby.
xnor
2
@HyperNeutrino: To bezpośredni produkt dwuelementowej grupy samej w sobie - znanej również jako cztero-grupowa Klein .
Henning Makholm

Odpowiedzi:

8

J , 8 bajtów

1:e.#@C.

Wypróbuj online!

Wyjaśnienie

1:e.#@C.  Input: matrix M
      C.  Convert each row from a permutation to a list of cycles
    #@    Number of cycles in each row
1:        Constant function 1
  e.      Is 1 a member of the cycle lengths?
mile
źródło
Może to być również 1 e.#@C.fwiw
Conor O'Brien
Huh, J pokonuje Jelly‽
Adám
@ Adám Jelly nie ma wbudowanego narzędzia do konwersji permutacji między notacją bezpośrednią a notacją cyklu. Prawdopodobnie mógłbym dodać je później jako atomy, tworząc ŒCL€1e6 bajtów w galarecie.
mile
8

Łuska , 11 10 9 bajtów

VS≡`ȯU¡!1

Na podstawie 1. Zwraca indeks generatora, jeśli taki istnieje, w przeciwnym razie 0. Wypróbuj online!

Wyjaśnienie

V          Does any row r of the input satisfy this:
      ¡!    If you iterate indexing into r
   `    1   starting with 1
    ȯU      until a repetition is encountered,
 S≡         the result has the same length as r.
Zgarb
źródło
3

JavaScript (ES6), 52 bajty

a=>a.some(b=>!a[new Set(a.map(_=>r=b[r],r=0)).size])
Neil
źródło
3

Python 2 , 96 91 97 bajtów

lambda x:any(g(r,r[i],i+1)==len(r)for i,r in enumerate(x))
g=lambda x,y,z:y==z or 1+g(x,x[y-1],z)

Wypróbuj online!

Halvard Hummel
źródło
or 1+g-> or-~g.
Jonathan Frech,
2

Galaretka , 15 bajtów

JŒ!ị@€µṂ⁼Jṙ'’$$

Wypróbuj online!

Pierwszy głupi pomysł, który przyszedł mi do głowy: sprawdź izomorfizm na Z n . (Ten kod to O (n!)…)

JŒ!ị@€             Generate all ways to denote this group.
                     (by indexing into every permutation of 1…n)
      µṂ⁼          Is the smallest one equal to this?
         Jṙ'’$$      [[1 2 …  n ]
                      [2 3 …  1 ]    (the group table for Z_n)
                      [… … …  … ]
                      [n 1 … n-1]]
Lynn
źródło
To ciekawe podejście; nigdy o tym nie myślałem! +1
HyperNeutrino
2

R , 101 97 bajtów

function(m)any(sapply(1:(n=nrow(m)),function(x)all(1:n%in%Reduce(`[`,rep(list(m[x,]),n),x,T,T))))

Sprawdź wszystkie przypadki testowe

To po prostu oblicza <g>dla każdego, g \in Ga następnie sprawdza, czy G \subseteq <g>, a następnie sprawdza, czy którykolwiek z nich jest prawdziwy. Ponieważ jednak zawsze aplikujemy $gpo prawej stronie, replikujemy m[g,]( gwiersz th), a następnie indeksujemy do tego wiersza z wynikiem zastosowania $g, gromadząc wyniki zamiast używać za m[g,g$g]każdym razem, co pozwoliło zaoszczędzić około 4 bajtów.

Giuseppe
źródło
1

Clojure, 68 bajtów

#(seq(for[l % :when(apply distinct?(take(count l)(iterate l 0)))]l))
NikoNyrh
źródło
1

Python 2 , 82 bajty

lambda A:len(A)in[len(set(reduce(lambda a,c:a+[A[a[-1]][n]],A,[n])))for n in A[0]]

Wypróbuj online!

Wprowadzono 0-indeksowaną tabelę Cayley; Wyjście prawda / fałsz dla grupy cyklicznej / niecyklicznej.

Chas Brown
źródło