- 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.
- 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(self._superalgebra.one().to_vector())]
- W = V.span_of_basis(basis_vectors)
- for exponent in range(1, V.dimension()):
- new_power = elt**exponent
- basis_vectors.append( V.from_vector(new_power.to_vector()) )
- try:
- W = V.span_of_basis(basis_vectors)
- superalgebra_basis.append( new_power )
- except ValueError:
- # Vectors weren't independent; bail and keep the
- # last subspace that worked.
- break
-
- # Make the basis hashable for UniqueRepresentation.
- superalgebra_basis = tuple(superalgebra_basis)
-
- # Now figure out the entries of the right-multiplication
- # matrix for the successive basis elements b0, b1,... of
- # that subspace.
- n = len(superalgebra_basis)
- mult_table = [[W.zero() for i in range(n)] for j in range(n)]
- for i in range(n):
- for j in range(n):
- product = superalgebra_basis[i]*superalgebra_basis[j]
- # product.to_vector() might live in a vector subspace
- # if our parent algebra is already a subalgebra. We
- # use V.from_vector() to make it "the right size" in
- # that case.
- product_vector = V.from_vector(product.to_vector())
- mult_table[i][j] = W.coordinate_vector(product_vector)
-
- # 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
- # polynomial has the same degree as the space's dimension
- # (remember how we constructed the space?), so that must be
- # its rank too.
- rank = W.dimension()
-
- natural_basis = tuple( b.natural_representation()
- for b in superalgebra_basis )
-
-
- self._vector_space = W
- self._superalgebra_basis = superalgebra_basis
-
-
- fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, self)
- return fdeja.__init__(field,
- mult_table,
- rank,
- prefix=prefix,
- category=category,
- natural_basis=natural_basis)
+ # The superalgebra constructor expects these to be in original matrix
+ # form, not algebra-element form.
+ matrix_basis = tuple( b.to_matrix() for b in basis )
+ def jordan_product(x,y):
+ return (self._superalgebra(x)*self._superalgebra(y)).to_matrix()
+
+ def inner_product(x,y):
+ return self._superalgebra(x).inner_product(self._superalgebra(y))
+
+ super().__init__(matrix_basis,
+ jordan_product,
+ inner_product,
+ prefix=prefix,
+ **kwargs)
+