Враховуючи позначення Даукера про вузол та його знаки перетину, обчисліть його многочлен дужок.
Хоча існує більше технічних визначень, для цього виклику достатньо думати про вузол як про щось, зроблене фізично, з'єднавши два кінці рядка разом. Оскільки вузли існують у трьох вимірах, коли ми малюємо їх на папері, ми використовуємо діаграми вузлів - двовимірні проекції, в яких перехрестя має рівно дві лінії, одна над і одна під.
Тут (b) і (c) - різні діаграми одного вузла.
Як ми представляємо вузольну діаграму на папері? Більшість із нас не є Рембрандтом, тому ми покладаємось на нотацію Даукера , яка працює так:
Виберіть на вузолі довільну вихідну точку. Перемістіть у довільному напрямку уздовж вузла та пронумеруйте перетинання, з яким ви стикаєтесь, починаючи з 1, із такою модифікацією: якщо це парне число і ви зараз переходите через переправу, заперечте це парне число. Нарешті, виберіть парні числа, що відповідають 1, 3, 5 тощо.
Спробуємо приклад:
У цьому вузлі ми вибрали "1" як нашу вихідну точку і продовжили рух вгору і вправо. Кожен раз , коли ми більш або під інший шматком мотузки, ми відносимо точку перетину наступного натуральне число. Ми заперечуємо парні числа, відповідні пасмам, що переходять через перехрестя, наприклад [3,-12]
на схемі. Отже, ця діаграма буде представлена [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]
? Перелік друзів 1, 3, 5, 7 тощо дає нам [6,-12,2,8,-4,-10]
.
Тут слід зазначити кілька речей. По-перше, позначення Даукера не є унікальним для даного вузла, оскільки ми можемо вибрати довільну вихідну точку та напрямок. Але, з огляду на позначення, можна повністю визначити структуру вузла (технічно, аж до відображення основних компонентів вузла). Хоча не всі позначення Dowker можуть утворювати можливі вузли, у цій проблемі ви можете припустити, що вхід представляє собою фактичний вузол.
Щоб уникнути неоднозначності між відображеннями вузла та полегшити розв’язання завдання, вам також буде наданий список знаків схрещування як вхідних даних.
При позитивному перетині нижня лінія йде зліва з точки зору верхньої лінії. При негативному перехресті він прямує праворуч. Зауважте, що зміна напрямку руху навколо вузла (тобто повернення як по лінії, так і під лінії) не змінює знаки перетину. У нашому прикладі знаки перехрестя є [-1,-1,-1,1,-1,1]
. Вони задаються в тому ж порядку, що і позначення Даукера, тобто для переїздів, що пронумеровані 1, 3, 5, 7 тощо.
У цьому виклику ми будемо обчислювати дужковий поліном вузла. Це об'єкт, який є інваріантним протягом більшої трансформації вузлової діаграми - концепції, яка робить її надзвичайно корисною для аналізу теорії вузлів. (Знову ж таки, більшість теоретиків вузлів обчислюють дужку полінома як проміжний продукт на шляху до обчислення полінома Джонса, який є інваріантним для всіх перетворень, але ми цього робити не будемо.) Так як це працює? Поліном дужок - це многочлен Лорана - той, у якому змінна (традиційно названа ) може бути піднята до негативних сил, а також позитивних.
Для даного вузла діаграми , три правила для полінома представлені в вигляді , є:⟨ D ⟩
Петля підошви без будь-яких перетинів має многочлен 1.
Якщо у нас є діаграма, що складається з і петлі, від'єднаної від , многочлен для обох є многочленом для разів .D D ( - A 2 - A - 2 )
Це правило є найскладнішим. У ньому йдеться про те, що якщо у вас є схрещування в , схоже , ви можете використовувати це правило для спрощення вузлів двома різними способами:
На зображенні, викладеному вище, перекреслене на першій схемі, яке має форму , може бути перетворене як у другій фігурі (також позитивне згладжування ), або як у третій рисунок ( негативне згладжування ).
Отже, дужок многочлен першої діаграми є дужним многочленом другого разу плюс третього разу , тобтоА - 1
Плутати ще? Давайте зробимо приклад, намагаючись знайти дужок полінома (Примітка. Це два вузли, зв'язані між собою. Така діаграма не буде потенційним вкладом у цю задачу, оскільки входи будуть лише окремими вузлами, але можуть виглядати як проміжний результат в алгоритмі.)
Спочатку використовуємо правило 3
Ми знову використовуємо правило 3 для обох нових вузлів
Ці 4 нові вузли підміняємо в перше рівняння.
Застосовуючи правила 1 і 2 до цих 4, повідомте нам
Отже, це нам кажуть
З повагою до завершення вашого короткого вступу до теорії вузлів!
Вхідні дані
Два списки:
Позначення Даукера, наприклад
[6,-12,2,8,-4,-10]
. Нумерація перетину повинна починатися з 1. Відповідні непарні числа[1,3,5,7,...]
є неявними і не повинні надаватися як вхідні дані.Знаки (
1
/-1
або якщо ви віддаєте перевагу0
/1
абоfalse
/true
або'+'
/'-'
) для переїздів, що відповідають позначенню Даукера, наприклад[-1,-1,-1,1,-1,1]
.
Замість пари списків ви можете мати список пар, наприклад [[6,-1],[-12,-1],...
Вихідні дані
Роздрукуйте або поверніть многочлен, наприклад , як список пар коефіцієнтів-експонентів (або пар коефіцієнтів) у порядку збільшення експонентів і без жодних нульових коефіцієнтів, наприклад .[[1,-2],[5,0],[1,1],[-1,3]]
Крім того, виведіть список непарної довжини коефіцієнтів, що відповідають показникам для деяких , напр . Центральним елементом є постійний член (коефіцієнт до ). Крайній лівий і правий елементи не повинні бути обома 0.k ∈ N A 0[0,1,0,5,1,0,-1]
Правила
Це проблема з кодовим гольфом . Жодна зі стандартних прорізів не може бути використана, і бібліотеки, які мають інструменти для обчислення або нотацій Даукера, або поліномів дужок, не можуть бути використані. (Мова, яка містить ці бібліотеки, все ще може використовуватися, тільки не бібліотеки / пакети).
Тести
// 4-tuples of [dowker_notation, crossing_signs, expected_result, description]
[
[[],[],[[1,0]],"unknot"],
[[2],[1],[[-1,3]],"unknot with a half-twist (positive crossing)"],
[[2],[-1],[[-1,-3]],"unknot with a half-twist (negative crossing)"],
[[2,4],[1,1],[[1,6]],"unknot with two half-twists (positive crossings)"],
[[4,6,2],[1,1,1],[[1,-7],[-1,-3],[-1,5]],"right-handed trefoil knot, 3_1"],
[[4,6,2,8],[-1,1,-1,1],[[1,-8],[-1,-4],[1,0],[-1,4],[1,8]],"figure-eight knot, 4_1"],
[[6,8,10,2,4],[-1,-1,-1,-1,-1],[[-1,-7],[-1,1],[1,5],[-1,9],[1,13]],"pentafoil knot, 5_1"],
[[6,8,10,4,2],[-1,-1,-1,-1,-1],[[-1,-11],[1,-7],[-2,-3],[1,1],[-1,5],[1,9]],"three-twist knot, 5_2"],
[[4,8,10,2,12,6],[1,1,-1,1,-1,-1],[[-1,-12],[2,-8],[-2,-4],[3,0],[-2,4],[2,8],[-1,12]],"6_3"],
[[4,6,2,10,12,8],[-1,-1,-1,-1,-1,-1],[[1,-10],[2,-2],[-2,2],[1,6],[-2,10],[1,14]],"granny knot (sum of two identical trefoils)"],
[[4,6,2,-10,-12,-8],[1,1,1,1,1,1],[[1,-14],[-2,-10],[1,-6],[-2,-2],[2,2],[1,10]],"square knot (sum of two mirrored trefoils)"],
[[6,-12,2,8,-4,-10],[-1,-1,-1,1,-1,1],[[1,-2],[1,6],[-1,10]],"example knot"]
]
Зовнішні ресурси
Не потрібно для виклику, але якщо ви зацікавлені:
дякую @ChasBrown та @ H.Pwiz за те, що помилилися у моєму визначенні позначення Даукера