Uma permutação de tamanho n é uma reordenação dos primeiros n números inteiros positivos. (ou seja, cada número inteiro aparece uma vez e exatamente uma vez). As permutações podem ser tratadas como funções que alteram a ordem de uma lista de itens de tamanho n . Por exemplo
(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]
Assim, permutações podem ser compostas como funções.
(4 1 2 3)(2 1 3 4) = (4 2 1 3)
Isso traz muitas propriedades interessantes. Hoje estamos focando na conjugação . Permutações y e x (ambos de tamanho n ) são conjugados sse existem permutações g e g -1 (também de tamanho n ) tal que
x = gyg-1
e gg -1 é igual à permutação de identidade (os primeiros n números na ordem correta).
Sua tarefa é fazer duas permutações do mesmo tamanho por meio de métodos de entrada padrão e decidir se são conjugados. Você deve gerar um dos dois valores consistentes, um se eles forem conjugados e outro se não forem.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Existem muitos teoremas sobre permutações conjugadas à sua disposição, então boa sorte e golfe feliz.
Você pode receber a entrada como um contêiner ordenado de valores (1-n ou 0-n) representando a permutação como acima, ou como uma função que pega um contêiner ordenado e executa a permutação. Se você optar por assumir a função, deve aceitá-la como argumento, em vez de tê-la com um nome predefinido.
Casos de teste
(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
fonte
Respostas:
Python 2 , 87 bytes
Experimente online!
Recebe entrada
P
como um par de ambas as permutações ek
seu comprimento. Saídas1
para conjugados e0
não.Isso usa o resultado:
Duas permutações de conjugados satisfazem isso porque seus k -ésimos poderes também são conjugados, e a conjugação preserva a contagem de pontos fixos.
É menos óbvio que quaisquer duas permutações não conjugadas sempre diferem. Em particular, a conjugação é determinada pela lista classificada de comprimentos de ciclo, e estes podem ser recuperados a partir da contagem de pontos fixos. Uma maneira de mostrar isso é com álgebra linear, embora possa ser um exagero.
Seja X a matriz de permutação de x . Então, o número de pontos fixos de x k é Tr (X k ) . Esses traços são os polinômios simétricos da soma de potência dos valores próprios de X k com multiplicidade. Esses polinômios para k de 0 a n permitem recuperar os polinômios simétricos elementares correspondentes desses valores próprios e, portanto, o polinômio característico e, portanto, os próprios valores próprios.
Como esses autovalores são raízes da unidade correspondentes aos ciclos de x , a partir deles podemos recuperar os tamanhos dos ciclos e suas multiplicidades. Assim, nossa "assinatura" identifica a permutação até a conjugação.
fonte
J ,
25 bytes23 bytes16 bytessolução tácita de milhas :
Solução explícita do OP:
Isso verifica se as permutações xey têm o mesmo tipo de ciclo, usando a
C.
função interna para produzir representações de ciclo.fonte
-:&([:/:~#&>)&C.
usando um formulário tácito. Aqui está um link do TIO para testá-lo.c=:
MATL ,
20191716 bytesEntrada: dois vetores de coluna (usando
;
como separador). Saída:1
se conjugado,0
se não.Experimente online! Ou verifique todos os casos de teste .
Explicação
Não foram utilizados teoremas sobre permutações (por pura ignorância); apenas força bruta e esses dois fatos:
Para duas permutações p e q , a composição pq é equivalente a usar p para indexar os elementos de q .
A condição x = gyg −1 é equivalente a xg = gy .
Código comentado:
fonte
Wolfram Language (Mathematica) , 44 bytes
Experimente online!
Wolfram Language (Mathematica) , 44 bytes
Usando a codificação CP-1252, onde
±
há um byte.Experimente online!
fonte
Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
y
que indexa em cada umg⁻¹
, e não o contrário. Veja o exemplo(4 1 2 3)(2 1 3 4) = (4 2 1 3)
. Com sua abordagem, resultaria, em(1 4 2 3)
vez disso, desde o segundo indexar no primeiro. Levando isso em conta, tenho uma solução de 12 bytes que ainda não vou estragar. :-)Œ!©Ụ€⁹ịЀ®ị"⁸e
(basicamente toda a indexação com argumentos invertidos), exceto mais curto depois de fazer grandes modificações. Eu não acho queg⁻¹yg
é o mesmo quegyg⁻¹
. Além disso, acho que sua resposta também pode se beneficiar dessas modificações, mas, como eu disse antes, ainda não quero estragar a diversão.x = g⁻¹yg
, entãogxg⁻¹ = y
, éx
ey
são conjugados.eŒ!ị"Ụị@¥€¥¥
Casca , 9 bytes
Retorna
1
para conjugado e0
para não conjugado. Experimente online!Explicação
A classe de conjugação de uma permutao P do G = [1,2, .., n] é determinada pela multiconjunto contendo o mínimo período de cada número em G sob P . Quando P é obtido no formato de lista, posso substituir L por P e obter o mesmo multiset. O programa calcula o multiset correspondente para cada entrada e verifica se um é um sub multiset da outra. Como eles têm o mesmo número de elementos, isso equivale a ser o mesmo multiset.
fonte
Perl,
615857 bytesInclui
+2
paraap
Dê permutações baseadas em 0 como 2 linhas em STDIN
O algoritmo é uma variação menor na solução da xnor
Esta versão mais antiga do código atinge um bug de perl e despeja o núcleo de várias entradas no meu perl mais recente
5.26.1
, mas funciona em um perl mais antigo5.16.3
.É possivelmente mais um exemplo do meu antigo inimigo perlgolf, o fato de o perl não refecontar adequadamente sua pilha.
fonte
JavaScript (ES6),
6664 bytesSe li as outras respostas corretamente, o problema é equivalente a contar os períodos de todos os elementos e verificar se as duas listas têm o mesmo número de cada período. Editar: economizou 1 byte graças a @Arnauld calculando um a menos que o período. Salve outro byte graças a @Arnauld, abusando das estranhas regras de coerção do JavaScript para comparar as matrizes. Outro byte pode ser salvo currying, mas eu não gosto de curry, a menos que seja frango tikka masala.
fonte