Se você não está familiarizado com a teoria da trança, recomendo que você leia isso primeiro. Esta pergunta pressupõe que você esteja pelo menos familiarizado com os conceitos em questão e que você esteja familiarizado com a teoria de grupos
Definamos σ n ser a trança em que o n ° de cadeia (Uma indexado) da parte superior atravessa a n + 1 th cadeia, e σ n - ser a inversa da σ n (Isto é o n + 1 th strand cruza a n- ésima strand).
O grupo de trança B n é então gerado por <σ 1 , σ 2 , σ 3 ,. . . , σ n-1 > . Assim, toda trança em B n pode ser escrita como o produto das tranças σ. 1
Determinar se duas tranças em um grupo são iguais não é uma tarefa simples. Pode ser bastante óbvio que σ 1 σ 3 = σ 3 σ 1 , mas é um pouco menos óbvio que, por exemplo, σ 2 σ 1 σ 2 = σ 1 σ 2 σ 1 . 2
Portanto, a pergunta é "Como podemos determinar se duas tranças são iguais?". Bem, os dois exemplos acima representam um pouco disso. Em geral, as seguintes relações, chamadas relações de Artin, são verdadeiras:
σ i σ j = σ j σ i ; i - j> 1
σ i σ i + 1 σ i = σ i + 1 σ i σ i + 1
Podemos usar essas duas relações em conjunto com os axiomas do grupo para provar que quaisquer tranças iguais são iguais. Assim, duas tranças são iguais se a aplicação repetida dessas relações e os axiomas do grupo puderem demonstrar isso.
Tarefa
Você escreverá um programa ou função para pegar duas tranças e determinar se são iguais ou não. Você também pode, opcionalmente, pegar um número inteiro positivo representando a ordem do grupo.
Esta é uma questão de código-golfe, para que as respostas sejam pontuadas em bytes, com menos bytes sendo melhores.
Entrada e saída
Você deve representar um Braid como uma lista ordenada de geradores (ou qualquer estrutura equivalente, por exemplo, vetor). Você pode representar os geradores de qualquer forma razoável (por exemplo, um número inteiro, duas tuplas de um número inteiro positivo e um booleano).
A par das regras de problemas de decisão padrão, você deve gerar um de dois valores distintos, aceitar uma rejeição.
Casos de teste
[], [] -> True
[1,-1], [] -> True
[1,2,1], [2,1,2] -> True
[1,3], [3,1] -> True
[1,3,2,1],[3,2,1,2] -> True
[1,4,-4,3,2,1], [3,2,1,2] -> True
[2,2,1], [2,1,2] -> False
[1,2,-1], [-1,2,1] -> False
[1,1,1,2],[1,1,2] -> False
1: Observe que, enquanto B n satisfaz todas as propriedades de um grupo, a operação em nosso grupo de tranças não é comutativa e, portanto, nosso grupo não é abeliano.
2: Se você deseja verificar isso por si mesmo, sugiro aplicar σ 1 - a ambos os lados. Se você desenhar os dois no papel ou modelá-los com strings reais, deve ficar claro por que esse é o caso.
fonte
[],[]
[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
Respostas:
Haskell , 190 bytes
Experimente online!
Como funciona
Seja F n o grupo livre em n geradores x 1 ,…, x n . Um dos primeiros resultados da teoria das tranças (Emil Artin, Theorie der Zöpfe , 1925) é que temos um homomorfismo injetivo f : B n → Aut ( F n ) onde a ação f σ i de σ i é definida por
f σ i ( x i ) = x i x i + 1 x i −1 ,
f σ i ( x i + 1 ) = x i ,
f σ i ( x j ) = x j para j ∉ { i , i + 1}.
A inversa f σ i -1 é dada por
f σ i −1 ( x i ) = x i + 1 ,
f σ i -1 ( x i + 1 ) = x i + 1 −1 x i x i + 1 ,
f σ i −1 ( x j ) = x j para j ∉ { i , i + 1}
e, é claro, a composição é dada por f ab = f a ∘ f b .
Para testar se a = b ∈ B n , basta testar se f a ( x i ) = f b ( x i ) para todos os i = 1,…, n . Esse é um problema muito mais simples em F n , onde precisamos saber apenas como cancelar x i com x i -1 .
No código:
i!j
calcula f σ i ( x j ) (em que umi
ouj
pode ser negativo, representando um inverso),foldr(%)[]
realiza redução no grupo livre,i&a
calcula f a ( x i ),a?n
calcula [ f a ( x 1 ),…, f a ( x n )],(a#b)n
é o teste de igualdade para a = b em B n .fonte
Python 2 ,
270263260250249241 bytesExperimente online!
Implementação do método 'subword reversing' para resolver o problema de isotopia da trança: a = b iff ab ^ -1 = a identidade.
Algoritmo retirado de: Soluções eficientes para o problema de isotopia da trança, Patrick Dehornoy ; ele descreve vários outros algoritmos que podem ser de interesse ...
Esse algoritmo funciona marcando da esquerda para a direita na lista, procurando um número negativo seguido por um número positivo; ou seja, uma sub-palavra da forma x i -1 x j com i, j> 0.
Ele usa as seguintes equivalências:
x i -1 x j = x j x i x j -1 x i -1 se i = j + 1 ou j = i + 1
x i -1 x j = identidade (lista vazia) se i == j
x i -1 x j = x j x i -1 caso contrário.
Por aplicação repetida, terminamos com uma lista da forma
w1 + w2
, onde todo elemento dew1
é positivo e todo elemento dew2
é negativo. (Esta é a ação da funçãog
).Em seguida, aplicamos
g
uma segunda vez à listaw2 + w1
; a lista resultante deve estar vazia se a lista original for equivalente à identidade.fonte