Si vous n'êtes pas familier avec la théorie de la tresse, je vous recommande de lire ceci en premier. Cette question suppose que vous êtes au moins familier avec les concepts en jeu et suppose que vous connaissez bien la théorie des groupes
Définissons σ n comme la tresse dans laquelle le n ème brin (un indexé) du haut croise le n + 1 ème brin, et σ n - comme l'inverse de σ n (c'est-à-dire le n + 1 ème brin croise le n e brin).
Le groupe de tresses B n est alors généré par <σ 1 , σ 2 , σ 3 ,. . . , σ n-1 > . Ainsi, chaque tresse sur B n peut être écrite comme le produit des σ-tresses. 1
Déterminer si deux tresses sur un groupe sont égales n'est pas une tâche simple. Il peut être assez évident que σ 1 σ 3 = σ 3 σ 1 , mais il est un peu moins évident que par exemple σ 2 σ 1 σ 2 = σ 1 σ 2 σ 1 . 2
La question est donc "Comment déterminer si deux tresses sont identiques?". Eh bien, les deux exemples ci-dessus représentent chacun un peu de cela. En général, les relations suivantes, appelées relations d'Artin, sont vraies:
σ i σ j = σ j σ i ; i - j> 1
σ i σ i + 1 σ i = σ i + 1 σ i σ i + 1
Nous pouvons utiliser ces deux relations conjointement avec les axiomes du groupe pour prouver que toutes les tresses égales sont égales. Ainsi, deux tresses sont égales si l'application répétée de ces relations et les axiomes de groupe peuvent le démontrer.
Tâche
Vous allez écrire un programme ou une fonction pour prendre deux tresses et déterminer si elles sont égales ou non. Vous pouvez également éventuellement prendre un entier positif représentant l'ordre du groupe.
Il s'agit d'une question de code-golf donc les réponses seront notées en octets, avec moins d'octets étant mieux.
Entrée et sortie
Vous devez représenter une tresse comme une liste ordonnée de générateurs (ou toute structure équivalente, par exemple un vecteur). Vous pouvez représenter les générateurs sous toute forme raisonnable (par exemple, un entier, deux tuple d'un entier positif et un booléen).
À égalité avec les règles de problème de descente standard, vous devez sortir l'une des deux valeurs distinctes, un accepter un rejet.
Cas de 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: Notez que si B n satisfait toutes les propriétés d'un groupe, l'opération sur notre groupe de tresses n'est pas commutative, et donc notre groupe n'est pas abélien.
2: Si vous souhaitez vérifier par vous-même, je suggère d'appliquer σ 1 - des deux côtés.Si vous dessinez les deux sur du papier ou les modélisez avec des chaînes réelles, il devrait devenir évident pourquoi c'est le cas.
la source
[],[]
[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
Réponses:
Haskell , 190 octets
Essayez-le en ligne!
Comment ça fonctionne
Soit F n le groupe libre sur n générateurs x 1 ,…, x n . L'un des premiers résultats de la théorie des tresses (Emil Artin, Theorie der Zöpfe , 1925) est que nous avons un homomorphisme injectif f : B n → Aut ( F n ) où l' action f σ i de σ i est définie par
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 pour j ∉ { i , i + 1}.
L'inverse f σ i −1 est donné par
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 pour j ∉ { i , i + 1}
et bien sûr la composition est donnée par f ab = f a ∘ f b .
Pour tester si a = b ∈ B n , il suffit de tester que f a ( x i ) = f b ( x i ) pour tout i = 1,…, n . C'est un problème beaucoup plus simple dans F n , où il suffit de savoir comment annuler x i avec x i −1 .
Dans le code:
i!j
calcule f σ i ( x j ) (où soiti
ouj
peut être négatif, représentant un inverse),foldr(%)[]
effectue une réduction dans le groupe libre,i&a
calcule f a ( x i ),a?n
calcule [ f a ( x 1 ),…, f a ( x n )],(a#b)n
est le test d'égalité pour a = b dans B n .la source
Python 2 ,
270263260250249241 octetsEssayez-le en ligne!
Implémentation de la méthode de «renversement de sous-mots» pour résoudre le problème d'isotopie des tresses: a = b ssi ab ^ -1 = l'identité
Algorithme tiré de: Solutions efficaces au problème d'isotopie des tresses, Patrick Dehornoy ; il décrit plusieurs autres algorithmes qui peuvent être intéressants ...
Cet algorithme fonctionne en marchant de gauche à droite dans la liste, en recherchant un nombre négatif suivi d'un nombre positif; c'est-à-dire, un sous-mot de la forme x i -1 x j avec i, j> 0.
Il utilise les équivalences suivantes:
x i -1 x j = x j x i x j -1 x i -1 si i = j + 1 ou j = i + 1
x i -1 x j = identité (liste vide) si i == j
x i -1 x j = x j x i -1 sinon.
Par application répétée, nous nous retrouvons avec une liste de la forme
w1 + w2
, où chaque élément dew1
est positif et chaque élément dew2
est négatif. (C'est l'action de la fonctiong
).Nous appliquons ensuite
g
une deuxième fois à la listew2 + w1
; la liste résultante doit être vide si la liste d'origine était équivalente à l'identité.la source