https://habr.com/ru/post/504644/Совсем немного теории
Латинский квадрат — табличка, заполненная буквами так, что в каждой строке и в каждом столбце никакая не повторяется дважды.
Такую таблицу называют еще таблицей умножения.Таким образом мы определили операцию умножения на упорядоченном множестве
. Например,
или
. Умножение, заданное с помощью такой таблицы, как правило некоммутативно (
). В дальнейшем, определяя элемент
по таблице, я буду смотреть пересечение сроки с порядковым номером элемента
и столбца с порядковым номером элемента
.
Латинский квадрат будем называть
группой, если операция
ассоциативна, т.е.
для всех возможных троек элементов. Приведенная выше таблица является групповой (хотите верьте, хотите проверьте). А вот латинский квадрат
свойством ассоциативности не обладает (неассоциативный латинский квадрат будем называть
квазигруппой). Действительно,
, а
. Далее идет сказ о том как мужик квазигруппы искал.
И совсем мало практики
Дальше изложение ведется с огромными пробелами, т.к. хочется показать нечто, не отвлекаясь пока на технические подробности. Внимание ко всем деталям потребует не одной статьи.
Рассмотрим множество перестановок на трех символах
(вышмат, привет):
,
,
,
,
,
.
Выпишем таблицу умножения (это всем хорошо известная группа
)
A B C D E F
B C A F D E
C A B E F D
D E F A B C
E F D C A B
F D E B C A
Напомню лишь как получить, например, элемент
0>0 0>1 0>0>1
1>2 1>2 1>2>0
2>1 2>0 2>1>2
Множество
— группа, а
— подгруппа. Элементы
,
и
обладают свойством
(элемент
является единицей группы). Осталось заметить, что если на множестве
ввести умножение по правилу
то мы получим квазигруппу
D E F
F D E
E F D
Ура! Маленькая удача: у нас в кармане вполне конкретная квазигруппа, элементы которой составляют подмножество группы
. Идем дальше. Рассмотрим группу
. Давайте найдем все перестановки
со свойством
, где
— тождественная перестановка.
F=[]
A=[]
B=[]
C=[]
for i in range(720):
A=list(G[i])
B=list(Q[i])
for k in range(6):
C.append(A[B[k]])
if C==[0, 1, 2, 3, 4, 5]:
F.append(list(A))
C=[]
else:
C=[]
d=len(F)
for j in range(d):
print(str(F[j]))
Здесь G и Q — одинаковые списки, содержащие все 720 перестановок на 6 символах. Программа выдает следующий список перестановок (перестановки со свойством
будем называть инволюциями).
[3, 4, 5, 0, 1, 2]
[5, 1, 2, 3, 4, 0]
[0, 1, 2, 3, 4, 5]
[1, 0, 2, 3, 4, 5]
[0, 4, 5, 3, 1, 2]
[3, 1, 2, 0, 4, 5]
[2, 5, 0, 3, 4, 1]
[5, 3, 4, 1, 2, 0]
[0, 3, 4, 1, 2, 5]
[4, 1, 2, 5, 0, 3]
[0, 1, 4, 5, 2, 3]
[1, 0, 4, 5, 2, 3]
[4, 5, 2, 3, 0, 1]
[2, 3, 0, 1, 4, 5]
[0, 5, 2, 4, 3, 1]
[2, 4, 0, 3, 1, 5]
[0, 3, 5, 1, 4, 2]
[0, 4, 2, 5, 1, 3]
[0, 5, 3, 2, 4, 1]
[4, 1, 5, 3, 0, 2]
[4, 1, 3, 2, 0, 5]
[0, 1, 3, 2, 5, 4]
[1, 0, 3, 2, 5, 4]
[5, 2, 1, 4, 3, 0]
[0, 2, 1, 4, 3, 5]
[2, 1, 0, 4, 3, 5]
[0, 5, 4, 3, 2, 1]
[5, 4, 3, 2, 1, 0]
[0, 4, 3, 2, 1, 5]
[4, 3, 2, 1, 0, 5]
[0, 3, 2, 1, 5, 4]
[3, 2, 1, 0, 5, 4]
[0, 2, 1, 5, 4, 3]
[2, 1, 0, 5, 4, 3]
[0, 1, 5, 4, 3, 2]
[1, 0, 5, 4, 3, 2]
[4, 2, 1, 3, 0, 5]
[0, 2, 1, 3, 5, 4]
[2, 1, 0, 3, 5, 4]
[3, 5, 4, 0, 2, 1]
[5, 2, 1, 3, 4, 0]
[0, 2, 1, 3, 4, 5]
[2, 1, 0, 3, 4, 5]
[4, 5, 3, 2, 0, 1]
[5, 3, 2, 1, 4, 0]
[0, 3, 2, 1, 4, 5]
[3, 2, 1, 0, 4, 5]
[0, 1, 5, 3, 4, 2]
[1, 0, 5, 3, 4, 2]
[3, 4, 2, 0, 1, 5]
[4, 2, 1, 5, 0, 3]
[2, 4, 0, 5, 1, 3]
[5, 1, 3, 2, 4, 0]
[0, 1, 3, 2, 4, 5]
[1, 0, 3, 2, 4, 5]
[5, 1, 4, 3, 2, 0]
[0, 1, 4, 3, 2, 5]
[1, 0, 4, 3, 2, 5]
[3, 5, 2, 0, 4, 1]
[0, 5, 2, 3, 4, 1]
[3, 1, 4, 0, 2, 5]
[5, 4, 2, 3, 1, 0]
[0, 4, 2, 3, 1, 5]
[2, 3, 0, 1, 5, 4]
[3, 1, 5, 0, 4, 2]
[5, 1, 2, 4, 3, 0]
[0, 1, 2, 4, 3, 5]
[1, 0, 2, 4, 3, 5]
[4, 3, 5, 1, 0, 2]
[3, 1, 2, 0, 5, 4]
[0, 1, 2, 5, 4, 3]
[1, 0, 2, 5, 4, 3]
[2, 5, 0, 4, 3, 1]
[4, 1, 2, 3, 0, 5]
[0, 1, 2, 3, 5, 4]
[1, 0, 2, 3, 5, 4]
На этом мой программистский запал почти иссякает и я продолжаю работу в полуручном режиме. Из 76 инволюций я оставил только 36 (на то были свои причины). Перемножил их
#G*Q
Q=[[5, 2, 1, 3, 4, 0],
[0, 2, 1, 3, 4, 5],
[2, 1, 0, 3, 4, 5],
[4, 5, 3, 2, 0, 1],
[5, 3, 2, 1, 4, 0],
[0, 3, 2, 1, 4, 5],
[3, 2, 1, 0, 4, 5],
[0, 1, 5, 3, 4, 2],
[1, 0, 5, 3, 4, 2],
[3, 4, 2, 0, 1, 5],
[4, 2, 1, 5, 0, 3],
[2, 4, 0, 5, 1, 3],
[5, 1, 3, 2, 4, 0],
[0, 1, 3, 2, 4, 5],
[1, 0, 3, 2, 4, 5],
[5, 1, 4, 3, 2, 0],
[0, 1, 4, 3, 2, 5],
[1, 0, 4, 3, 2, 5],
[3, 5, 2, 0, 4, 1],
[0, 5, 2, 3, 4, 1],
[3, 1, 4, 0, 2, 5],
[5, 4, 2, 3, 1, 0],
[0, 4, 2, 3, 1, 5],
[2, 3, 0, 1, 5, 4],
[3, 1, 5, 0, 4, 2],
[5, 1, 2, 4, 3, 0],
[0, 1, 2, 4, 3, 5],
[1, 0, 2, 4, 3, 5],
[4, 3, 5, 1, 0, 2],
[3, 1, 2, 0, 5, 4],
[0, 1, 2, 5, 4, 3],
[1, 0, 2, 5, 4, 3],
[2, 5, 0, 4, 3, 1],
[4, 1, 2, 3, 0, 5],
[0, 1, 2, 3, 5, 4],
[1, 0, 2, 3, 5, 4]]
#
G=[[5, 2, 1, 3, 4, 0],
[0, 2, 1, 3, 4, 5],
[2, 1, 0, 3, 4, 5],
[4, 5, 3, 2, 0, 1],
[5, 3, 2, 1, 4, 0],
[0, 3, 2, 1, 4, 5],
[3, 2, 1, 0, 4, 5],
[0, 1, 5, 3, 4, 2],
[1, 0, 5, 3, 4, 2],
[3, 4, 2, 0, 1, 5],
[4, 2, 1, 5, 0, 3],
[2, 4, 0, 5, 1, 3],
[5, 1, 3, 2, 4, 0],
[0, 1, 3, 2, 4, 5],
[1, 0, 3, 2, 4, 5],
[5, 1, 4, 3, 2, 0],
[0, 1, 4, 3, 2, 5],
[1, 0, 4, 3, 2, 5],
[3, 5, 2, 0, 4, 1],
[0, 5, 2, 3, 4, 1],
[3, 1, 4, 0, 2, 5],
[5, 4, 2, 3, 1, 0],
[0, 4, 2, 3, 1, 5],
[2, 3, 0, 1, 5, 4],
[3, 1, 5, 0, 4, 2],
[5, 1, 2, 4, 3, 0],
[0, 1, 2, 4, 3, 5],
[1, 0, 2, 4, 3, 5],
[4, 3, 5, 1, 0, 2],
[3, 1, 2, 0, 5, 4],
[0, 1, 2, 5, 4, 3],
[1, 0, 2, 5, 4, 3],
[2, 5, 0, 4, 3, 1],
[4, 1, 2, 3, 0, 5],
[0, 1, 2, 3, 5, 4],
[1, 0, 2, 3, 5, 4]]
#
F=[]
H=[]
A=[]
B=[]
C=[]
q=len(Q)
for i in range(36):
A=list(G[i])
for j in range(q):
B=list(Q[j])
for k in range(6):
C.append(A[B[k]])
F.append(list(C))
C=[]
H.append(list(F))
F=[]
#for i in range(36):
for j in range(36):
print(str(H[j]))
#print('New line')
Самым сложным было запихать все в электронную таблицу. И вот! Он! Долгожданный результат!
Цветом отмечены квазигруппы. Я не комментирую более результат, т.к. получен он на коленке, по принципу «Пойди туда, не зная куда. Принеси то, не зная что (ну т.е. квазигруппу)». Далее можно брать группы
, где
— большое число. Однако, без теории вся эта деятельность бесперспективна.
Кое-что еще я рассказываю
здесь и
здесь.