Роздрукуйте «рівномірні» перестановки симетричної групи Sn у циклічному позначенні


9

ЗАВДАННЯ

ВИЗНАЧЕННЯ

Розглянемо точки {1,2,3,4,5} та всі їх перестановки. Ми можемо знайти загальну кількість можливих перестановок цих 5 балів простим трюком: Ви можете заповнити 5 слотів цими точками, перший слот матиме 5 можливих чисел, другий 4 (як один був використаний для заповнення першого слота) третій 3 тощо. Таким чином, загальна кількість перестановок становить 5 * 4 * 3 * 2 * 1; це було б 5! перестановки або 120 перестановок. Ми можемо вважати це симетричною групою S5, і тоді Симетрична група Sn мала б n! or (n*n-1*n-2...*1)перестановки.

"Рівна" перестановка - це така, де існує парне число циклів рівної довжини. Це легше зрозуміти , коли написано в циклічної запису, наприклад , (1 2 3)(4 5)переставляє 1->2->3->1і 4->5->4та має один 3 довжину циклу (1 2 3)і один цикл довжиною 2 (4 5). Класифікуючи перестановку як непарну чи парну, ми ігноруємо цикли непарної довжини і кажемо, що ця перестановка [ (1 2 3)(4 5)] непарна, оскільки має непарне число {1} циклів парних довжин. Навіть приклади:

  1. (1)(2 3)(4 5)= два циклу 2 довжини | НАДІЙ |
  2. (1 2 3 4 5)= відсутність рівномірних циклів | НАДІЙ | * зауважте, що якщо немає циклів рівної довжини, то перестановка є рівною.

Непарні приклади:

  1. (1 2)(3 4 5)= один цикл 2 довжини | ODD |
  2. (1)(2 3 4 5)= один цикл 4 довжини | ODD |

Оскільки рівно половина перестановок у будь-якій симетричній групі є рівною, ми можемо назвати парну групу змінною групою N, так що S5 = 120 A5 = 60 перестановок.

УВАГА

Перестановки повинні, як мінімум, записуватися у циклічних позначеннях, коли кожен цикл знаходиться в різних дужках і кожен цикл йде у порядку зростання. Наприклад, (1 2 3 4 5)ні (3 4 5 1 2). І для циклів з одним числом, таких як: (1)(2 3 4)(5)одиничні / фіксовані точки можуть бути виключені значенням (1)(2 3 4)(5) = (2 3 4). Але особистість (точка, де всі точки зафіксовані (1)(2)(3)(4)(5)) повинна бути записана як ()тільки для її представлення.

ЗМАГАННЯ

Я хотів би, щоб ви якомога менше коду взяли будь-яке додатне ціле число як вхідне значення {1,2,3,4 ...} і відображали всі перестановки змінної групи An, де n - це вхід / усі парні перестановки Sn. Наприклад:

Input = 3
()
(1 2 3)
(1 3 2)

і

Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)

І як у прикладах, я хотів би, щоб усі цикли однієї довжини були зведені, а щодо ідентичності: виходи нічого, ()не тільки дужки, але і все, що ви використовуєте для показу різних перестановок} або idє прийнятними.

ДОПОМОГА ЧИТАННЯ

Ви можете знайти більше інформації тут:

ЩАСТИ

І оскільки це кодогольф, той, хто може надрукувати перестановки змінної групи А в найкоротших байтах, виграє.


2
Ласкаво просимо до головоломки програмування та коду для гольфу! Зазвичай ми дозволяємо виводити гнучкість, щоб мови, які мають проблеми з виведенням у потрібному форматі, не мали несправедливих недоліків. Чи дозволено виводити, наприклад, [[1, 2], [3, 4]]замість (1 2)(3 4)?
Аднан

@Adnan Так, я повинен був уточнити. Поки різні цикли відображаються окремо, не повинно виникнути проблем із тим, як ви це представляли.
Гаррі

"Рівна" перестановка - це та, де існує парна кількість рівних перестановок. " Це виглядає як циклічне визначення. Може, спочатку введіть позначення циклу, а потім перепишіть це речення на "... рівну кількість циклів парної довжини"?
Мартін Ендер

Крім того, як я можу поставити цикл (2 3 1 4)у порядку зростання? Ви маєте на увазі, що ми повинні просто поставити найменший елемент спереду?
Мартін Ендер

@MartinEnder Так найменший елемент повинен йти першим, поки це не безладдя з замовленням, так (2 3 1 4)само 2->3->1->4->2вона може бути записана (1 4 2 3)з найменшим елементом першого
Гаррі

Відповіді:


5

Pyth, 26 байт

t#Mf%+QlT2mcdf<>dTS<dTd.pS

          m            .pSQ   Map over permutations d of [1, …, Q]:
             f        d         Find all indices T in [1, …, Q] such that
               >dT                the last Q-T elements of d
              <   S<dT            is less than the sorted first T elements of d
           cd                   Chop d at those indices
   f                          Filter on results T such that
      Q                         the input number Q
     + lT                       plus the length of T
    %    2                      modulo 2
                                is truthy (1)
t#M                           In each result, remove 0- and 1-cycles.

Спробуйте в Інтернеті

Це рішення засноване на акуратному біекцію між перестановками в однорядній нотації та перестановками в нотації циклу. Звичайно, є очевидна біекція, де два позначення представляють однакову перестановку:

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (1 8 9 2 4 3 6) (5 10 7)

але це займе занадто багато коду. Натомість просто наріжте однорядкові позначення на частини перед усіма числами, меншими за всі їх попередники, назвіть ці фрагменти циклами та створіть з них нову перестановку.

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] ↦ (8) (4 6) (3 10) (1 5 9 2 7)

Щоб повернути цю біекцію, ми можемо здійснити будь-яку перестановку у формі циклу, обертати кожен цикл, щоб спочатку було найменше його число, сортувати цикли так, щоб їх найменше число з’являлось у порядку зменшення та стирало всі дужки.


ОП вимагає представити перестановку ідентичності без одноциклів. Я думаю, що було б краще, якби це не було.
милі

1
Гаррі, здавалося, добре моїй відповіді Jelly, яка друкує навіть 1 цикл навіть id. Може, він міг би задзвонити?
Лінн

Я також не дуже впевнений у тому, як це написано, і я не помітив, що ваше рішення (Лінни) теж зробило те саме.
милі

Я розумів, що ви не можете представити перестановку ідентичності за допомогою порожнього рядка, тому я змінив свою відповідь, щоб зберегти всі 1-цикли (також зручно економити 6 байт).
Ніл

1
Я відредагував своє питання, щоб було більш зрозумілим, я хотів би, щоб "один цикл" пройшов, як ви це зробили у другій частині своєї відповіді. Молодці до речі.
Гаррі

6

Математика, 84 49 31 байт

GroupElements@*AlternatingGroup

Склад двох функцій. Виходи у формі, що {Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}представляє (), (a b), (c d)(e f), ....


3

J , 53 байти

[:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]

Цикли в кожній перестановці представлені у вигляді коробкових масивів, оскільки J буде мати нульові масиви з нульовим майданчиком.

Якщо вихід розслаблений, використовуйте 41 байт

[:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]

де кожна перестановка може містити одноцикли та нульові цикли.

Використання

   f =: [:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]
   f 3
┌┬───────┬───────┐
││┌─────┐│┌─────┐│
│││1 2 3│││1 3 2││
││└─────┘│└─────┘│
└┴───────┴───────┘
   f 4
┌┬───────┬───────┬─────────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┬─────────┐
││┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌───┬───┐│
│││2 3 4│││2 4 3│││1 2│3 4│││1 2 3│││1 2 4│││1 3 2│││1 3 4│││1 3│2 4│││1 4 2│││1 4 3│││2 3│1 4││
││└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└───┴───┘│
└┴───────┴───────┴─────────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┴─────────┘

Для альтернативної реалізації,

   f =: [:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]
   f 3
┌─────┬─┬─┐
│1    │2│3│
├─────┼─┼─┤
│1 2 3│ │ │
├─────┼─┼─┤
│1 3 2│ │ │
└─────┴─┴─┘

Це насправді прекрасно ... молодець.
Гаррі

2

Желе , 34 28 байт

L€’SḂ
ṙLR$Ṃµ€Ṣ
Œ!ŒṖ€;/Ç€ÑÐḟQ

Спробуйте тут .

Пояснення

Кожен рядок програми Jelly визначає функцію; нижній - " main".

  • Перший рядок визначає функцію, яка перевіряє, чи продукт циклу є непарним.

    L€      Length of each
      ’     Add 1 to each length 
       S    Take the sum
        Ḃ   Modulo 2
    
  • Другий рядок нормалізує розділ перестановки [1…n]в продукт циклу наступним чином:

         µ€    For each list X in the partition:
    ṙLR$          Rotate X by each element in [1…length(X)].
        Ṃ         Get the lexicographically smallest element.
                  Thus, find the rotation so that the smallest element is in front.
           Ṣ   Sort the cycles in the partition.
    

    Це перетвориться, наприклад, (4 3)(2 5 1)у (1 2 5)(3 4).

Ось основна програма. Він бере аргумент nз командного рядка та:

Œ!              Compute all permutations of [1…n].
  ŒṖ€           Compute all partitions of each permutation.
     ;/         Put them in one big list.
       ǀ       Normalize each of them into a cycle product.
         ÑÐḟ    Reject elements satisfying the top function,
                i.e. keep only even cycle products.
            Q   Remove duplicates.

Я спробував запустити його з 5 в якості входу, і зовсім не отримав вихід. Це сценарій лише для груп A3 та A4 або він потенційно може дати будь-яку групу? Я ніколи навіть не бачив Джелі раніше, тому будь-яке пояснення було б корисним.
Гаррі

Ні, я лише вставлю 3 і 4 у виклик, тому поки ви виграєте, але мені дуже хочеться дізнатися більше.
Гаррі

Jelly насправді має вбудований для перегородок, про який я забув! Вдячно, друг нагадав мені. Тож тепер це ефективніше (ручки n = 5, так!) І коротше.
Лінн

ОП відредагувало питання, щоб уточнити, що 1-цикли повинні пройти.
Anders Kaseorg

2

JavaScript (Firefox 30-57), 220 218 212 211 байт

f=(a,p)=>a[2]?[for(i of a)for(j of f(a.filter(m=>m!=i),p,p^=1))[i,...j]]:[[a[p],a[p^1]]]

На жаль, 88 байт вистачає лише для генерації змінної групи як списку перестановок a, тому це коштує мені додаткових 132 130 124 123 байт для перетворення виводу в потрібний формат:

n=>f([...Array(n).keys()],0).map(a=>a.map((e,i)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&s)

Мені вдалося обрізати свою версію ES6 до 222 216 215 байт:

n=>(g=(a,p,t=[])=>a[2]?a.map(e=>g(a.filter(m=>m!=e),p,[...t,e],p^=1)):[...t,a[p],a[p^1]].map((e,i,a)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&r.push(s))([...Array(n).keys(r=[])],0)&&r

Я не заперечую, якщо формат не має ідеальних циклічних позначень до тих пір, як: кожна перестановка та її цикли відображаються окремо (як [1 2 3] [4 5] та <<123> <45>> було б прийнятним ) і цикли однієї довжини витягнуті. Можливо, це може скоротити вашу відповідь
Гаррі

@Harry Я ніколи не показував (1,2,3)(4,5)- це дивна перестановка! В даний час я б показав, наприклад, що (1,2,3)(4)(5)не тільки вилучення циклів довжиною один коштує мені 6 байт, я потім закінчую порожнім результатом циклу ідентичності, який би коштував мені ще 4 байти для виправлення.
Ніл

Якщо ви маєте на увазі, що нічого не друкується для посвідчення особи, то я прийму це, як я вже сказав as for the identity outputs of nothing ... are accepatble. А також, що було б показано, якщо ви виводите свої "необроблені дані", чи вони надходять у формі (1,2,3) (4) (5) або як щось інше?
Гаррі

@Harry Тепер виключаючи цикли довжини один, включаючи порожній запис для посвідчення особи, і все ще вдається зберегти байт!
Ніл

Дані @Harry Raw були б [1, 2, 0, 3, 4]для цього конкретного прикладу, тому ніде поблизу того, що ви хочете.
Ніл

1

GAP , 32 байти

Дякуємо @ChristianSievers за скорочення рахунку навпіл.

f:=n->List(AlternatingGroup(n));

Використання підказки:

gap> f(4);
[ (), (1,3,2), (1,2,3), (1,4,3), (2,4,3), (1,3)(2,4), (1,2,4), (1,4)(2,3), (2,3,4), (1,3,4), (1,2)(3,4), (1,4,2) ]

Дуже приємне форматування, я думаю, що GAP був дуже хорошим вибором для відповіді на цю проблему.
Гаррі

Ваша відповідь не показує, де закінчується одна перестановка і починається наступна. Припустимо, що функція не потребує друку значень як побічного ефекту, але може просто повернути значення у вигляді списку для друку інтерпретатора, я б це зробивf:=n->List(AlternatingGroup(n));
Крістіан Сіверс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.