# long run to have the multiplication table be in terms of
# algebra elements. We do this after calling the superclass
# constructor so that from_vector() knows what to do.
- self._multiplication_table = [
- list(map(lambda x: self.from_vector(x), ls))
- for ls in mult_table
- ]
+ self._multiplication_table = [ [ self.vector_space().zero()
+ for i in range(n) ]
+ for j in range(n) ]
+ # take advantage of symmetry
+ for i in range(n):
+ for j in range(i+1):
+ elt = self.from_vector(mult_table[i][j])
+ self._multiplication_table[i][j] = elt
+ self._multiplication_table[j][i] = elt
if check_axioms:
if not self._is_commutative():
Element = FiniteDimensionalEuclideanJordanAlgebraElement
+class RationalBasisEuclideanJordanAlgebraNg(FiniteDimensionalEuclideanJordanAlgebra):
+ def __init__(self,
+ field,
+ basis,
+ jordan_product,
+ inner_product,
+ orthonormalize=True,
+ prefix='e',
+ category=None,
+ check_field=True,
+ check_axioms=True):
+
+ n = len(basis)
+ vector_basis = basis
+
+ from sage.matrix.matrix import is_Matrix
+ basis_is_matrices = False
+
+ degree = 0
+ if n > 0:
+ if is_Matrix(basis[0]):
+ basis_is_matrices = True
+ vector_basis = tuple( map(_mat2vec,basis) )
+ degree = basis[0].nrows()**2
+ else:
+ degree = basis[0].degree()
+
+ V = VectorSpace(field, degree)
+
+ self._deorthonormalization_matrix = matrix.identity(field,n)
+ if orthonormalize:
+ A = matrix(field, vector_basis)
+ # uh oh, this is only the "usual" inner product
+ Q,R = A.gram_schmidt(orthonormal=True)
+ self._deorthonormalization_matrix = R.inverse().transpose()
+ vector_basis = Q.rows()
+ W = V.span_of_basis( vector_basis )
+ if basis_is_matrices:
+ from mjo.eja.eja_utils import _vec2mat
+ basis = tuple( map(_vec2mat,vector_basis) )
+
+ mult_table = [ [0 for i in range(n)] for j in range(n) ]
+ ip_table = [ [0 for i in range(n)] for j in range(n) ]
+
+ for i in range(n):
+ for j in range(i+1):
+ # do another mat2vec because the multiplication
+ # table is in terms of vectors
+ elt = _mat2vec(jordan_product(basis[i],basis[j]))
+ elt = W.coordinate_vector(elt)
+ mult_table[i][j] = elt
+ mult_table[j][i] = elt
+ ip = inner_product(basis[i],basis[j])
+ ip_table[i][j] = ip
+ ip_table[j][i] = ip
+
+ self._inner_product_matrix = matrix(field,ip_table)
+
+ if basis_is_matrices:
+ for m in basis:
+ m.set_immutable()
+
+ super().__init__(field,
+ mult_table,
+ prefix,
+ category,
+ basis,
+ check_field,
+ check_axioms)
class RationalBasisEuclideanJordanAlgebra(FiniteDimensionalEuclideanJordanAlgebra):
r"""
return superclass._charpoly_coefficients()
mult_table = tuple(
- map(lambda x: x.to_vector(), ls)
+ tuple(map(lambda x: x.to_vector(), ls))
for ls in self._multiplication_table
)