Если вы не знакомы с теорией кос, я рекомендую вам сначала прочитать это . Этот вопрос предполагает, что вы по крайней мере знакомы с имеющимися понятиями, и предполагает, что вы хорошо знакомы с теорией групп
Определим σ 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 - к обеим сторонам. Если вы нарисуете два на бумаге или смоделируете их с реальными строками, должно стать понятно, почему это так.
источник
[],[]
[1, 4, -4, 3, 2, 1], [3, 2, 1, 2] => TRUE
Ответы:
Haskell , 190 байт
Попробуйте онлайн!
Как это устроено
Пусть F n - свободная группа на n образующих x 1 ,…, x n . Одним из первых результатов в теории кос (Эмиль Артин, Теория дер Зопфе , 1925) является то, что у нас есть инъективный гомоморфизм f : B n → Aut ( 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 a ∘ f b .
Чтобы проверить, является ли a = b ∈ B 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 .источник
Python 2 ,
270263260250249241 байтПопробуйте онлайн!
Реализация метода «реверсирования подслов» для решения проблемы изотопии кос: 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
; результирующий список должен быть пустым, если исходный список был эквивалентен идентичности.источник