self._rank = rank
self._natural_basis = natural_basis
- # TODO: HACK for the charpoly.. needs redesign badly.
- self._basis_normalizers = None
-
if category is None:
category = MagmaticAlgebras(field).FiniteDimensional()
category = category.WithBasis().Unital()
store the trace/determinant (a_{r-1} and a_{0} respectively)
separate from the entire characteristic polynomial.
"""
- if self._basis_normalizers is not None:
- # Must be a matrix class?
- # WARNING/TODO: this whole mess is mis-designed.
- n = self.natural_basis_space().nrows()
- field = self.base_ring().base_ring() # yeeeeaaaahhh
- J = self.__class__(n, field, False)
- (_,x,_,_) = J._charpoly_matrix_system()
- p = J._charpoly_coeff(i)
- # p might be missing some vars, have to substitute "optionally"
- pairs = zip(x.base_ring().gens(), self._basis_normalizers)
- substitutions = { v: v*c for (v,c) in pairs }
- return p.subs(substitutions)
-
(A_of_x, x, xr, detA) = self._charpoly_matrix_system()
R = A_of_x.base_ring()
if i >= self.rank():
def __init__(self, n, field=QQ, normalize_basis=True, **kwargs):
S = self._denormalized_basis(n, field)
+ # Used in this class's fast _charpoly_coeff() override.
+ self._basis_normalizers = None
+
if n > 1 and normalize_basis:
# We'll need sqrt(2) to normalize the basis, and this
# winds up in the multiplication table, so the whole
**kwargs)
+ @cached_method
+ def _charpoly_coeff(self, i):
+ """
+ Override the parent method with something that tries to compute
+ over a faster (non-extension) field.
+ """
+ if self._basis_normalizers is None:
+ # We didn't normalize, so assume that the basis we started
+ # with had entries in a nice field.
+ return super(MatrixEuclideanJordanAlgebra, self)._charpoly_coeff(i)
+ else:
+ n = self.natural_basis_space().nrows()
+ field = self.base_ring().base_ring() # yeeeeaaaahhh
+ J = self.__class__(n, field, False)
+ (_,x,_,_) = J._charpoly_matrix_system()
+ p = J._charpoly_coeff(i)
+ # p might be missing some vars, have to substitute "optionally"
+ pairs = zip(x.base_ring().gens(), self._basis_normalizers)
+ substitutions = { v: v*c for (v,c) in pairs }
+ return p.subs(substitutions)
+
+
@staticmethod
def multiplication_table_from_matrix_basis(basis):
"""