Равны ли эти косы?


13

Если вы не знакомы с теорией кос, я рекомендую вам сначала прочитать это . Этот вопрос предполагает, что вы по крайней мере знакомы с имеющимися понятиями, и предполагает, что вы хорошо знакомы с теорией групп

Определим σ n как косу, в которой n- я нить (индексированная) сверху пересекает n + 1- ю прядь, а σ n - как противоположность σ n (то есть n + 1- й нить пересекает н- ную нить).

Группа кос В п затем генерируется <сг 1 , σ 2 , σ 3 ,. , , , n-1 > . Таким образом, каждая коса на B n может быть записана как произведение σ-кос. 1


Определить, равны ли две косы в группе, - непростая задача. Может быть довольно очевидно, что σ 1 σ 3 = σ 3 σ 1 , но немного менее очевидно, что, например, σ 2 σ 1 σ 2 = σ 1 σ 2 σ 1 . 2

Таким образом, вопрос «Как мы можем определить, являются ли две косы одинаковыми?». Хорошо два примера выше представляют немного этого. В общем случае справедливы следующие отношения, называемые отношениями Артина:

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

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

Мы можем использовать эти два отношения в сочетании с аксиомами группы, чтобы доказать, что любые равные косы равны. Таким образом, две косы равны, если повторное применение этих соотношений и групповые аксиомы могут продемонстрировать это.

задача

Вы напишете программу или функцию для двух кос и определите, равны они или нет. При желании вы также можете взять положительное целое число, представляющее порядок группы.

Это вопрос поэтому ответы будут оцениваться в байтах, причем меньше байтов будет лучше.

Вход и выход

Вы должны представлять Braid как упорядоченный список генераторов (или любой эквивалентной структуры, например, вектора). Вы можете представлять генераторы в любой разумной форме (например, целое число, два набора положительного целого числа и логическое значение).

В соответствии со стандартными вы должны вывести одно из двух различных значений: принять или отклонить.

Тестовые случаи

[],       []              -> 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: обратите внимание, что хотя B n удовлетворяет всем свойствам группы, операция над нашей группой кос не является коммутативной, и, следовательно, наша группа не является абелевой.

2: Если вы хотите убедиться в этом сами, я предлагаю применить σ 1 - к обеим сторонам. Если вы нарисуете два на бумаге или смоделируете их с реальными строками, должно стать понятно, почему это так.


Я не знаком с теорией кос, поэтому я VTCing как полная тарабарщина (шучу)
caird coinheringaahing

2
Можем ли мы иметь несколько тестов, пожалуйста?
HyperNeutrino

@HyperNeutrino Извините, забыл добавить их. Добавлено сейчас. Не стесняйтесь предлагать больше.
Пост Рок Гарф Хантер

Тестовый пример @WheatWizard:[],[]
Павел

Предлагаемый тестовый пример:[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
HyperNeutrino

Ответы:


11

Haskell , 190 байт

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

Попробуйте онлайн!

Как это устроено

Пусть F n - свободная группа на n образующих x 1 ,…, x n . Одним из первых результатов в теории кос (Эмиль Артин, Теория дер Зопфе , 1925) является то, что у нас есть инъективный гомоморфизм f : B nAut ( F n ), где действие f σ i в σ i определяется как

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

Обратное f σ i −1 определяется как

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

и, конечно, состав дается выражением f ab = f af b .

Чтобы проверить, является ли a = bB n , достаточно проверить, что f a ( x i ) = f b ( x i ) для всех i = 1,…, n . Это гораздо более простая проблема в F n , где нам нужно только знать, как отменить x i на x i −1 .

В коде:

  • i!jвычисляет f σ i ( x j ) (где iили jможет быть отрицательным, представляя обратное),
  • foldr(%)[] выполняет сокращение в свободной группе,
  • i&aвычисляет f a ( x i ),
  • a?nвычисляет [ f a ( x 1 ),…, f a ( x n )],
  • и (a#b)nявляется критерием равенства для a = b в B n .

4

Python 2 , 270 263 260 250 249 241 байт

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)==[]

Попробуйте онлайн!

Реализация метода «реверсирования подслов» для решения проблемы изотопии кос: a = b тогда и только тогда, когда ab ^ -1 = тождество.

Алгоритм взят из: Эффективные решения проблемы изотопии кос, Патрик Дехорной ; он описывает несколько других алгоритмов, которые могут представлять интерес ...

Этот алгоритм работает, двигаясь слева направо в списке, ища отрицательное число, за которым следует положительное число; то есть подслово вида x i -1 x j с i, j> 0.

Он использует следующие эквивалентности:

x i -1 x j = x j x i x j -1 x i -1, если i = j + 1 или j = i + 1

x i -1 x j = идентичность (пустой список), если i == j

x i -1 x j = x j x i -1 в противном случае.

При повторном применении мы получаем список в форме w1 + w2, где каждый элемент w1является положительным, а каждый элемент w2- отрицательным. (Это действие функции g).

Затем мы применяем gвторой раз к списку w2 + w1; результирующий список должен быть пустым, если исходный список был эквивалентен идентичности.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.