Создайте конечную размерную алгебру из рабочей таблицы

#sage

Вопрос:

Давайте предположим, что у нас есть OperationTable T .

 sage: T = OperationTable(Set, operation=operation, names='elements');
 

Мы хотели бы создать FiniteDimensionalAlgebra из T .

Вопрос.
Каков самый быстрый способ преобразования таблицы T в ожидаемую форму FiniteDimensionalAlgebra ?

Таблица списка должна иметь следующий вид: существует конечномерная k-алгебра степени n с базисом (e1,…,en) (e1,… ,en), такая, что i-й элемент таблицы является матрицей правильного умножения на ei относительно базиса (e1,…,en).

Пример.
Пример списка матриц, принятых FiniteDimensionalAlgebra полем over QQ .

 sage: B = FiniteDimensionalAlgebra(QQ, [Matrix([[1,0,0], [0,1,0], [0,0,0]]), Matrix([[0,1,0], [0,0,0], [0,0,0]]), Matrix([[0,0,0], [0,0,0], [0,0,1]])])
 

Пример T .

 sage: T
 
 .  a b c d e f g h i j
  --------------------
a| a a a a a a a a a a
b| a a a a a a b b b b
c| a a a b b b b b c c
d| a a b b b c c c c d
e| a a b b c c c d d e
f| a a b c c c d e e e
g| a b b c c d e e f f
h| a b b c d e e f g g
i| a b c c d e f g g h
j| a b c d e e f g h i
 
 sage: T.table()
 
 [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 0, 1, 1, 1, 1, 1, 2, 2],
 [0, 0, 1, 1, 1, 2, 2, 2, 2, 3],
 [0, 0, 1, 1, 2, 2, 2, 3, 3, 4],
 [0, 0, 1, 2, 2, 2, 3, 4, 4, 4],
 [0, 1, 1, 2, 2, 3, 4, 4, 5, 5],
 [0, 1, 1, 2, 3, 4, 4, 5, 6, 6],
 [0, 1, 2, 2, 3, 4, 5, 6, 6, 7],
 [0, 1, 2, 3, 4, 4, 5, 6, 7, 8]]
 

Комментарии:

1. Как вы продюсируете T ? Если у вас есть конечный моноид (а именно, элементы a , b ,…, j ), называемый M , то вы можете сделать M.algebra(QQ) , чтобы получить соответствующую алгебру.

2. У меня есть пользовательская операция def operation(x,y) и пользовательский конечный набор S . operation(x,y) закрывается под S .

Ответ №1:

Я не уверен, правильно ли я здесь управлял влево/вправо, но что-то вроде этого сработает:

 # elt_to_idx: looks like {'a': 0, 'b': 1, ...}
elt_to_idx = {b:a for (a,b) in enumerate(T.column_keys())}

mat_list = []

# Convert T to a list of matrices.
for a in T.column_keys():
    # dictionary to define matrix for right multiplication by a:
    dict_a = {}
    for (idx_b, b) in enumerate(T.column_keys()):
        # Each row (or should it be column?) should have a single entry of "1"
        dict_a[idx_b, elt_to_idx[T[b, a]]] = 1
    mat_list.append(matrix(QQ, 4, 4, dict_a))

FiniteDimensionalAlgebra(QQ, mat_list)