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 e
onde a $ e = a = e $ a
todos estão a
no grupo ( identidade ) .Para cada elemento a
do grupo existe exatamente um b
tal que a $ b = e = b $ a
( inverso ) Para cada dois elementos a, b
do grupo, a $ b
está no grupo ( encerramento ).
Nós podemos escrever a^n
no lugar de a$a$a$...$a
.
O subgrupo cíclico gerado por qualquer elemento a
do grupo é <a> = {e, a, a^2, a^3, a^4, ..., a^(n-1)}
onde n
está 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 $ 3
nã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.
fonte
[[0,1,2,3],[1,2,3,0],[2,3,0,1],[3,0,1,2]]
)?[1..n]
que pode estar ocultando falhas em algumas respostas.Respostas:
J , 8 bytes
Experimente online!
Explicação
fonte
1 e.#@C.
, fwiwŒCL€1e
6 bytes no Jelly.Casca ,
11 109 bytesBaseado em 1. Retorna o índice de um gerador, se houver, 0 caso contrário. Experimente online!
Explicação
fonte
Geléia ,
1311 bytesExperimente online!
fonte
JavaScript (ES6), 52 bytes
fonte
Python 2 ,
969197 bytesExperimente online!
fonte
or 1+g
->or-~g
.Gelatina , 15 bytes
Experimente online!
Primeira idéia boba que me veio à mente: cheque de isomorfismo a Z n . (Este código é O (n!)…)
fonte
R ,
10197 bytesVerifique todos os casos de teste
Isso simplesmente calcula
<g>
para cada umg \in G
e depois testa seG \subseteq <g>
, depois verifica se alguma delas é verdadeira. No entanto, como estamos sempre aplicando$g
à direita, replicamosm[g,]
(ag
quinta 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.fonte
Clojure, 68 bytes
fonte
Python 2 , 82 bytes
Experimente online!
A tabela Cayley indexada a 0 é inserida; Saída True / False para grupo cíclico / não cíclico.
fonte