Queste trecce sono uguali?


13

Se non hai familiarità con la teoria delle trecce, ti consiglio di leggere prima questo . Questa domanda presuppone che tu abbia almeno familiarità con i concetti a portata di mano e presuppone che tu abbia familiarità con la teoria dei gruppi

Definiamo σ n per essere la treccia in cui il n ° filamento (One indicizzato) dalla parte superiore attraversa il n + 1 esimo filo, e σ n - di essere l'inverso di σ n (Questa è la n + 1 ° filo attraversa il n ° filamento).

Il gruppo treccia B n viene quindi generato da 1 , σ 2 , σ 3 ,. . . , σ n-1 > . Pertanto ogni treccia su B n può essere scritta come il prodotto delle trecce σ. 1


Determinare se due trecce su un gruppo sono uguali non è un compito semplice. Può essere abbastanza ovvio che σ 1 σ 3 = σ 3 σ 1 , ma è un po 'meno ovvio che ad esempio σ 2 σ 1 σ 2 = σ 1 σ 2 σ 1 . 2

Quindi la domanda è "Come possiamo determinare se due trecce sono uguali?". Bene, i due esempi sopra ciascuno rappresentano un po 'di questo. In generale, sono vere le seguenti relazioni, chiamate relazioni di Artin:

  • σ i σ j = σ j σ i ; i - j> 1

  • σ i σ i + 1 σ i = σ i + 1 σ i σ i + 1

Possiamo usare queste due relazioni in congiunzione con gli assiomi di gruppo per dimostrare che tutte le trecce uguali sono uguali. Quindi due trecce sono uguali se la ripetuta applicazione di queste relazioni e gli assiomi di gruppo possono dimostrarlo.

Compito

Scriverai un programma o una funzione per prendere due trecce e determinare se sono uguali o meno. Puoi anche prendere un numero intero positivo che rappresenta l'ordine del gruppo.

Questa è una domanda di quindi le risposte verranno classificate in byte, con meno byte migliori.

Ingresso e uscita

Dovresti rappresentare una treccia come un elenco ordinato di generatori (o qualsiasi struttura equivalente, ad es. Vettore). Puoi rappresentare i generatori in qualsiasi forma ragionevole (ad esempio un numero intero, una due tupla di un numero intero positivo e un valore booleano).

Alla pari con le regole standard dovresti generare uno di due valori distinti, e accetta un rifiuto.

Casi test

[],       []              -> 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: Nota che mentre B n soddisfa tutte le proprietà di un gruppo l'operazione sul nostro gruppo a treccia non è commutativa, e quindi il nostro gruppo non è abeliano.

2: Se desideri verificarlo da solo, ti suggerisco di applicare σ 1 - su entrambi i lati, se disegni i due su carta o li modelli con stringhe effettive, dovrebbe essere chiaro perché questo è il caso.


Non ho familiarità con la teoria della treccia, quindi sono VTCing come assolutamente incomprensibile (sto solo scherzando)
caird coinheringaahing

2
Possiamo avere alcuni casi di test per favore?
HyperNeutrino,

@HyperNeutrino Spiacente, ho dimenticato di aggiungerli. Aggiunto ora. Sentiti libero di suggerire di più.
Post Rock Garf Hunter,

Suggerimento suggerimento test @WheatWizard:[],[]
Pavel

Caso di prova proposto:[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
HyperNeutrino,

Risposte:


11

Haskell , 190 byte

i!j|j<0=reverse$map(0-)$i!(-j)|i==j=[i,i+1,-i]|i+1==j=[i]|i+j==0=[j+1]|i+j==1=[-j,-i,j]
_!j=[j]
j%(k:a)|j+k==0=a
j%a=j:a
i&a=foldr(%)[]$foldr((=<<).(!))[i]a
a?n=map(&a)[1..n]
(a#b)n=a?n==b?n

Provalo online!

Come funziona

Lasciate F n essere il gruppo libero su n generatori x 1 , ..., x n . Uno dei primi risultati nella teoria delle trecce (Emil Artin, Theorie der Zöpfe , 1925) è che abbiamo un omomorfismo iniettivo f : B nAut ( F n ) dove l' azione f σ i di σ i è definita da

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 per j ∉ { i , i + 1}.

L'inverso f σ i −1 è dato da

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 per j ∉ { i , i + 1}

e ovviamente la composizione è data da f ab = f af b .

Per verificare se a = bB n , è sufficiente verificare che f a ( x i ) = f b ( x i ) per tutti i = 1,…, n . Questo è un problema molto più semplice in F n , dove dobbiamo solo sapere come cancellare x i con x i −1 .

Nel codice:

  • i!jcalcola f σ i ( x j ) (dove uno io jpuò essere negativo, che rappresenta un inverso),
  • foldr(%)[] esegue la riduzione nel gruppo libero,
  • i&acalcola f a ( x i ),
  • a?ncalcola [ f a ( x 1 ),…, f a ( x n )],
  • ed (a#b)nè il test di uguaglianza per a = b in B n .

4

Python 2 , 270 263 260 250 249 241 byte

def g(b,i=0):
 while i<len(b)-1:
  R,s=b[i:i+2]
  if R<0<s:b[i:i+2]=[[],[s,-R,-s,R],[s,R]][min(abs(R+s),2)];i=-1
  i+=1
 return b
def f(a,b):
 b=g(a+[-v for v in b][::-1]);i=0
 while i<len(b)and b[0]>0:b=b[1:]+[b[0]];i+=1   
 return g(b)==[]

Provalo online!

Implementazione del metodo di "subword reversing" per risolvere il problema dell'isotopia treccia: a = b iff ab ^ -1 = identità.

Algoritmo tratto da: Soluzioni efficienti al problema dell'isotopia treccia, Patrick Dehornoy ; descrive diversi altri algoritmi che potrebbero essere di interesse ...

Questo algoritmo funziona marciando da sinistra a destra nell'elenco, cercando un numero negativo seguito da un numero positivo; vale a dire, una parola secondaria della forma x i -1 x j con i, j> 0.

Utilizza le seguenti equivalenze:

x i -1 x j = x j x i x j -1 x i -1 se i = j + 1 oppure j = i + 1

x i -1 x j = identità (elenco vuoto) se i == j

x i -1 x j = x j x i -1 altrimenti.

Con un'applicazione ripetuta, finiamo con un elenco del modulo w1 + w2, in cui ogni elemento di w1è positivo e ogni elemento di w2è negativo. (Questa è l'azione della funzione g).

Quindi applichiamo guna seconda volta all'elenco w2 + w1; l'elenco risultante dovrebbe essere vuoto se l'elenco originale era equivalente all'identità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.