Підрахунок петель Муфанга


17

Петля - це досить проста алгебраїчна структура. Це кортеж (G +) , де G являє собою безліч , а + є бінарним оператором G × G → G . Тобто + бере два елементи з G і повертає новий елемент. Оператор також повинен виконати два властивості

  • Скасування: Для кожного a і b в G існує унікальне x і y в G таке, що

    a + x = b
    y + a = b
    
  • Ідентичність: є e в G такий, що для кожного a в G

    e + a = a
    a + e = a
    

Якщо ви знайомі з поняттям групи, ви можете помітити, що цикл - це лише група, яка не має асоціативного властивості.

Петлі досить прості, тому людям подобається додавати більше правил, щоб зробити нові структури, які цікавіші. Однією з таких структур є петля Муфанга, яка являє собою цикл, який також задовольняє наступним чотирма тотожностям для x , y та z в G

z + (x + (z + y)) = ((z + x) + z) + y
((y + z) + x) + z = y + (z + (x + z))
(z + x) + (y + z) = (z + (x + y)) + z
(z + x) + (y + z) = z + ((x + y) + z)

Наприклад, наступна таблиця Кейлі представляє цикл Муфанга:

0  1  2  3
1  0  3  2
2  3  0  1
3  2  1  0

(Якщо вам не знайома таблиця Кейлі - це квадратна матриця M, де M i, j дорівнює i + j . Це зручний спосіб представлення двійкових операторів на множині.)

Ми можемо показати, що існує ідентичність досить легко 0. Скасувати дещо складніше, але цей підхід дає грубу силу

b a → 0 1 2 3
↓
0     0 1 2 3
1     1 0 3 2
2     2 3 0 1
3     3 2 1 0

Де наші елементи - це рішення

a + x = b = x + a

(Ви можете помітити, що ця таблиця ідентична нашій таблиці Кейлі. Я залишу це як вправу для читача, щоб зрозуміти, чому це так для цієї петлі Муфанга)

Тепер нам потрібно перевірити ідентичності Муфанга для нашої структури. Існує два способи зробити це для конкретної структури. Перший спосіб - це зрозуміти, що вона асоціативна і, таким чином, автоматично виконує критерії, однак це взагалі не спрацює, тому ми б швидше примусили результат. Тут є 3 вільних змінних, у яких кожен потенційний вираз має 4 значення. Це означає, що ми повинні виконати обчислення 7 * 4 3 або 448. Я залишу нераціональні обчислення, але ось декілька Haskell ви можете використовувати для перевірки цього .

Завдання

З урахуванням додатного цілого числа n як вхідного виводу кількість циклів Муфанга, що мають порядок n . (порядок групи - це розмір набору)

Це тому відповіді будуть набрані в байтах, а менша кількість байтів буде кращою.

Тестові справи

Ось кількість петель Муфанга для перших 71 входів

1,1,1,2,1,2,1,5,2,2,1,6,1,2,1,19,1,5,1,6,2,2,1,20,2,2,5,5,1,4,1,122,1,2,1,18,1,2,2,19,1,7,1,5,2,2,1,103,2,5,1,6,1,17,2,17,2,2,1,18,1,2,4,4529,1,4,1,6,1,4,1

1
Що таке " G × G "?
Ерік Аутгольфер

8
Я відмовився від цього завдання, тому що математика, що займається, є досить пухнастою і недоступною для всіх, хто читає це завдання. Можливо, корисний був би відпрацьований приклад (наприклад, пояснення, чому 8-й вхід призводить до 5)? Якщо ви додасте один, я думаю, що я відмовиться від свого голосу, але, звичайно, це залежить від вас.

6
@ IanGödel Чи не могли б ви пояснити, що ви маєте на увазі пухнастий? Це, звичайно, більш просунута математична тема, але я не думаю, що ми повинні ухилятися від математики на PPCG. Я додам відпрацьований приклад циклу Муфанга, але обчислення всього введення вручну, ймовірно, перешкоджатиме проблемі.
Пост Рок-Гарф Мисливець

2
@WheatWizard "Пухнастий", як, можливо, "Розширений". EDIT: Я відмовився від нижньої частини, але все ще чекаю прикладу.

1
@Giuseppe Не відчувайте себе дуже погано, я також помилився, виправляючи ваше, це 12не так 11. Я повинен був усвідомити, що 11це проста кількість.
Пост Рок-Гарф Мисливець

Відповіді:


4

Python 3 , 475 410 байт

Дякуємо Mr.Xcoder за збереження деяких байтів!

Використовуйте симетрію формули, щоб зберегти 65 байт. Так, це дуже багато.

from itertools import*
n=int(input())
P=permutations
R=[*range(n)]
u=[]
A=all
S=sorted
for T in P(P(R),n):u+=[T]*(A(A(R==S(x)for x in
t)and any([*x]==S(x)for x in t)and
A(t[z][t[x][t[z][y]]]==t[t[t[z][x]][z]][y]and
t[t[z][x]][t[y][z]]==t[t[z][t[x][y]]][z]for x in R
for y in R for z in R)for t
in(T,[*zip(*T)]))and A(A(1-A(p[T[i][j]]==U[p[i]][p[j]]for i in R
for j in R)for p in P(R))for U in u))
print(len(u))

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


Деякі з них andможуть бути замінені на *, що призводить до меншої кількості рахунків, але ціною значно повільніше час виконання:

Пітон 3 , ??? байт

[TODO поставив тут код]

(звичайно, не все *робить програму значно повільнішою, лише деякі з них є критичними)


Безумовно:

from itertools import *
n = 4 # int(input())
rangeN = list(range(n))

def is_moufang_loop(T):
    A = tuple(zip(*T))
    return all(
        all(sorted(x) == rangeN for x in t)
        and any(list(x) == sorted(x) for x in t)
        and all(
                T[z][T[x][T[z][y]]] == T[T[T[z][x]][z]][y]
            and T[T[z][x]][T[y][z]] == T[T[z][T[x][y]]][z]
            for x in rangeN for y in rangeN for z in rangeN)
        for t in (T, A)
    )

def isomorphic(loop1, loop2):
    for p in permutations(rangeN):
        if all(
            p[loop1[i][j]] == loop2[p[i]][p[j]]
            for i in rangeN
            for j in rangeN
        ): return True
    return False

unique_moufang_loops = []
for x in [
        cayley_table 
        for cayley_table in permutations(permutations(rangeN), n)
        if is_moufang_loop(cayley_table)
]:
    if all(not isomorphic(x, y) for y in unique_moufang_loops):
        unique_moufang_loops.append(x)

print(len(unique_moufang_loops))

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

Немає смуг прокрутки ...


Пояснення:

Програма досить проста.

  • Кожен можливий "двійковий оператор" представлений таблицею Кейлі (0-індексація).
  • Властивість "ідентичність" означає, що існує eтаке, що і e"рядок", і e"стовпець" рівні [0, 1, 2, ..., n-1], що є тією ж умовою, що і "

    і масив, Tі його транспонінг мають рядок, рівний [0, 1, 2, ..., n-1].

  • Властивість "скасування" еквівалентна

    Кожен рядок і кожен стовпець є перестановкою [0, 1, 2, ..., n-1].

Отже, частина

all(
        all(sorted(x) == rangeN for x in t) 
        and any(list(x) == sorted(x) for x in t) 
        for t in (T, A))

коду перевіряє це. (Для всіх рядка в масиві Tі його транспозиції A, воно сортується одно rangeN, і існує ряд в обох , Tі Aякий дорівнює собі сортується)

Чотири умови петлі Муфанга перевіряються вручну.

z + (x + (z + y)) = ((z + x) + z) + y
((y + z) + x) + z = y + (z + (x + z))
(z + x) + (y + z) = (z + (x + y)) + z
(z + x) + (y + z) = z + ((x + y) + z)

У коді (a + b)представлено як T[a][b]. (через представлення як таблиця Кейлі). Використовуйте порівняння рівності Python, щоб уникнути дублювання (z + x) + (y + z).

Однак, оскільки формула симетрична:

Якщо переключити операнди +у першій формулі, отримаємо другу формулу; і якщо ми переключимо операнди +в третій формулі, ми отримаємо четверту формулу xі yпоміняємо місце.

Зауважимо, що транспозиція таблиці Кейлі еквівалентна бінарним операторам, що мають замінені операнди. ( x + y -> y + x)

Нарешті, зібрано всіх кандидатів з таблиці Кейлі

permutations(permutations(rangeN), n) 

так що кожен рядок є перестановкою rangeN(що є [0, 1, 2, ..., n-1]) і є nчіткі рядки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.