#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)