From: Michael Orlitzky Date: Fri, 9 Aug 2019 17:17:55 +0000 (-0400) Subject: eja: fix the subalgebra generated by zero. X-Git-Url: http://gitweb.michael.orlitzky.com/?p=sage.d.git;a=commitdiff_plain;h=16dfa403c6eb709d3a5188a0f19919652b6a225d eja: fix the subalgebra generated by zero. --- diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index 287a217..97c048d 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -964,6 +964,15 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: A(x^2) == A(x)*A(x) True + The subalgebra generated by the zero element is trivial:: + + sage: set_random_seed() + sage: A = random_eja().zero().subalgebra_generated_by() + sage: A + Euclidean Jordan algebra of dimension 0 over Rational Field + sage: A.one() + 0 + """ return FiniteDimensionalEuclideanJordanElementSubalgebra(self) diff --git a/mjo/eja/eja_subalgebra.py b/mjo/eja/eja_subalgebra.py index 9e5b010..c82bd1a 100644 --- a/mjo/eja/eja_subalgebra.py +++ b/mjo/eja/eja_subalgebra.py @@ -100,16 +100,48 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide """ def __init__(self, elt): - superalgebra = elt.parent() + self._superalgebra = elt.parent() + category = self._superalgebra.category().Associative() + V = self._superalgebra.vector_space() + field = self._superalgebra.base_ring() + + # A half-assed attempt to ensure that we don't collide with + # the superalgebra's prefix (ignoring the fact that there + # could be super-superelgrbas in scope). If possible, we + # try to "increment" the parent algebra's prefix, although + # this idea goes out the window fast because some prefixen + # are off-limits. + prefixen = [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ] + try: + prefix = prefixen[prefixen.index(self._superalgebra.prefix()) + 1] + except ValueError: + prefix = prefixen[0] + + if elt.is_zero(): + # Short circuit because 0^0 == 1 is going to make us + # think we have a one-dimensional algebra otherwise. + natural_basis = tuple() + mult_table = tuple() + rank = 0 + self._vector_space = V.zero_subspace() + self._superalgebra_basis = [] + fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, + self) + return fdeja.__init__(field, + mult_table, + rank, + prefix=prefix, + category=category, + natural_basis=natural_basis) + # First compute the vector subspace spanned by the powers of # the given element. - V = superalgebra.vector_space() - superalgebra_basis = [superalgebra.one()] + superalgebra_basis = [self._superalgebra.one()] # If our superalgebra is a subalgebra of something else, then # superalgebra.one().to_vector() won't have the right # coordinates unless we use V.from_vector() below. - basis_vectors = [V.from_vector(superalgebra.one().to_vector())] + basis_vectors = [V.from_vector(self._superalgebra.one().to_vector())] W = V.span_of_basis(basis_vectors) for exponent in range(1, V.dimension()): new_power = elt**exponent @@ -128,7 +160,6 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide # Now figure out the entries of the right-multiplication # matrix for the successive basis elements b0, b1,... of # that subspace. - field = superalgebra.base_ring() n = len(superalgebra_basis) mult_table = [[W.zero() for i in range(n)] for j in range(n)] for i in range(n): @@ -141,18 +172,6 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide product_vector = V.from_vector(product.to_vector()) mult_table[i][j] = W.coordinate_vector(product_vector) - # A half-assed attempt to ensure that we don't collide with - # the superalgebra's prefix (ignoring the fact that there - # could be super-superelgrbas in scope). If possible, we - # try to "increment" the parent algebra's prefix, although - # this idea goes out the window fast because some prefixen - # are off-limits. - prefixen = [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ] - try: - prefix = prefixen[prefixen.index(superalgebra.prefix()) + 1] - except ValueError: - prefix = prefixen[0] - # The rank is the highest possible degree of a minimal # polynomial, and is bounded above by the dimension. We know # in this case that there's an element whose minimal @@ -161,11 +180,10 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide # its rank too. rank = W.dimension() - category = superalgebra.category().Associative() natural_basis = tuple( b.natural_representation() for b in superalgebra_basis ) - self._superalgebra = superalgebra + self._vector_space = W self._superalgebra_basis = superalgebra_basis @@ -265,7 +283,10 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide sage: actual == expected True """ - return self.monomial(self.one_basis()) + if self.dimension() == 0: + return self.zero() + else: + return self.monomial(self.one_basis()) def superalgebra(self):