O grupo é cíclico?

21

Introdução

Você pode pular esta parte se já souber o que é um grupo cíclico.

Um grupo é definido por um conjunto e uma operação binária associativa $(ou seja, (a $ b) $ c = a $ (b $ c)existe um elemento no grupo eonde a $ e = a = e $ atodos estão ano grupo ( identidade ) .Para cada elemento ado grupo existe exatamente um btal que a $ b = e = b $ a( inverso ) Para cada dois elementos a, bdo grupo, a $ bestá no grupo ( encerramento ).

Nós podemos escrever a^nno lugar de a$a$a$...$a.

O subgrupo cíclico gerado por qualquer elemento ado grupo é <a> = {e, a, a^2, a^3, a^4, ..., a^(n-1)}onde nestá a ordem (tamanho) do subgrupo (a menos que o subgrupo seja infinito).

Um grupo é cíclico se puder ser gerado por um de seus elementos.

Desafio

Dada a tabela Cayley (tabela de produtos) para um grupo finito, determine se é cíclico ou não.

Exemplo

Vamos dar uma olhada na seguinte tabela 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

(Esta é a tabela de Cayley para o Dihedral Group 3, D_3).

Isso é indexado em 1, portanto, se queremos encontrar o valor de 5 $ 3, procuramos na quinta coluna na terceira linha (observe que o operador não é necessariamente comutativo, portanto 5 $ 3não é necessariamente igual a 3 $ 5. Vemos aqui isso 5 $ 3 = 6(também que 3 $ 5 = 4)

Podemos encontrar <3>começando com [3]e, enquanto a lista é única, acrescente o produto do último elemento e o gerador (3). Nós recebemos [3, 3 $ 3 = 2, 2 $ 3 = 1, 1 $ 3 = 3]. Paramos aqui com o subgrupo {3, 2, 1}.

Se você calcular <1>através <6>você verá que nenhum dos elementos do grupo gerar todo o grupo. Assim, este grupo não é cíclico.

Casos de teste

A entrada será dada como uma matriz, a saída como um valor de decisão verdade / falsidade.

[[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)

Você terá a garantia de que a entrada é sempre um grupo.

Você pode receber a entrada como valores indexados em 0.

HyperNeutrino
fonte
A entrada indexada com 0 é permitida? (por exemplo [[0,1,2,3],[1,2,3,0],[2,3,0,1],[3,0,1,2]])?
Neil
@ Neil Yes; Eu esqueci de especificar. Obrigado!
HyperNeutrino
5
Você deve premiar os rótulos dos elementos do seu grupo mais nos casos de teste. No momento, a primeira linha e coluna da tabela é sempre o [1..n]que pode estar ocultando falhas em algumas respostas.
Lynn
3
Parece que verificar se o grupo é abeliano é suficiente para passar nos casos de teste. Casos de teste como Z_2 * Z_2 corrigiam isso.
Xnor
2
@ HyperNeutrino: Esse é o produto direto do grupo de dois elementos consigo mesmo - também conhecido como o grupo de quatro Klein .
Henning Makholm

Respostas:

8

J , 8 bytes

1:e.#@C.

Experimente online!

Explicação

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?
milhas
fonte
Isso também poderia ser 1 e.#@C., fwiw
Conor O'Brien
Huh, J vence Jelly‽
Adám 25/17
@ Adám Jelly não tem um built-in para converter permutações entre notação direta e de ciclo. Eu provavelmente poderia adicioná-los como átomos mais tarde, criando ŒCL€1e6 bytes no Jelly.
miles
8

Casca , 11 10 9 bytes

VS≡`ȯU¡!1

Baseado em 1. Retorna o índice de um gerador, se houver, 0 caso contrário. Experimente online!

Explicação

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
fonte
3

JavaScript (ES6), 52 bytes

a=>a.some(b=>!a[new Set(a.map(_=>r=b[r],r=0)).size])
Neil
fonte
3

Python 2 , 96 91 97 bytes

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)

Experimente online!

Halvard Hummel
fonte
or 1+g-> or-~g.
Jonathan Frech 25/09
2

Gelatina , 15 bytes

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

Experimente online!

Primeira idéia boba que me veio à mente: cheque de isomorfismo a Z n . (Este código é 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
fonte
Huh, essa é uma abordagem interessante; nunca pensei nisso! +1
HyperNeutrino
2

R , 101 97 bytes

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

Verifique todos os casos de teste

Isso simplesmente calcula <g>para cada um g \in Ge depois testa se G \subseteq <g>, depois verifica se alguma delas é verdadeira. No entanto, como estamos sempre aplicando $gà direita, replicamos m[g,](a gquinta linha) e indexamos nessa linha com o resultado da aplicação $g, acumulando os resultados em vez de usá m[g,g$g]-lo sempre, o que economizou cerca de 4 bytes.

Giuseppe
fonte
1

Clojure, 68 bytes

#(seq(for[l % :when(apply distinct?(take(count l)(iterate l 0)))]l))
NikoNyrh
fonte
1

Python 2 , 82 bytes

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

Experimente online!

A tabela Cayley indexada a 0 é inserida; Saída True / False para grupo cíclico / não cíclico.

Chas Brown
fonte