if not c.is_idempotent():
raise ValueError("element is not idempotent: %s" % c)
- from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra
-
# Default these to what they should be if they turn out to be
# trivial, because eigenspaces_left() won't return eigenvalues
# corresponding to trivial spaces (e.g. it returns only the
# eigenspace corresponding to lambda=1 if you take the
# decomposition relative to the identity element).
- trivial = FiniteDimensionalEJASubalgebra(self, ())
+ trivial = self.subalgebra(())
J0 = trivial # eigenvalue zero
J5 = VectorSpace(self.base_ring(), 0) # eigenvalue one-half
J1 = trivial # eigenvalue one
J5 = eigspace
else:
gens = tuple( self.from_vector(b) for b in eigspace.basis() )
- subalg = FiniteDimensionalEJASubalgebra(self,
- gens,
- check_axioms=False)
+ subalg = self.subalgebra(gens, check_axioms=False)
if eigval == 0:
J0 = subalg
elif eigval == 1:
return len(self._charpoly_coefficients())
+ def subalgebra(self, basis, **kwargs):
+ r"""
+ Create a subalgebra of this algebra from the given basis.
+
+ This is a simple wrapper around a subalgebra class constructor
+ that can be overridden in subclasses.
+ """
+ from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra
+ return FiniteDimensionalEJASubalgebra(self, basis, **kwargs)
+
+
def vector_space(self):
"""
Return the vector space that underlies this algebra.
...
ValueError: all factors must share the same base field
- The "cached" Jordan and inner products are the componentwise
- ones::
-
- sage: set_random_seed()
- sage: J1 = random_eja()
- sage: J2 = random_eja()
- sage: J = cartesian_product([J1,J2])
- sage: x,y = J.random_elements(2)
- sage: x*y == J.cartesian_jordan_product(x,y)
- True
- sage: x.inner_product(y) == J.cartesian_inner_product(x,y)
- True
-
The cached unit element is the same one that would be computed::
sage: set_random_seed() # long time
return FiniteDimensionalEJAOperator(Ji,self,Ei.matrix())
- def cartesian_jordan_product(self, x, y):
- r"""
- The componentwise Jordan product.
-
- We project ``x`` and ``y`` onto our factors, and add up the
- Jordan products from the subalgebras. This may still be useful
- after (if) the default Jordan product in the Cartesian product
- algebra is overridden.
-
- SETUP::
-
- sage: from mjo.eja.eja_algebra import (HadamardEJA,
- ....: JordanSpinEJA)
-
- EXAMPLE::
-
- sage: J1 = HadamardEJA(3)
- sage: J2 = JordanSpinEJA(3)
- sage: J = cartesian_product([J1,J2])
- sage: x1 = J1.from_vector(vector(QQ,(1,2,1)))
- sage: y1 = J1.from_vector(vector(QQ,(1,0,2)))
- sage: x2 = J2.from_vector(vector(QQ,(1,2,3)))
- sage: y2 = J2.from_vector(vector(QQ,(1,1,1)))
- sage: z1 = J.from_vector(vector(QQ,(1,2,1,1,2,3)))
- sage: z2 = J.from_vector(vector(QQ,(1,0,2,1,1,1)))
- sage: (x1*y1).to_vector()
- (1, 0, 2)
- sage: (x2*y2).to_vector()
- (6, 3, 4)
- sage: J.cartesian_jordan_product(z1,z2).to_vector()
- (1, 0, 2, 6, 3, 4)
-
- """
- m = len(self.cartesian_factors())
- projections = ( self.cartesian_projection(i) for i in range(m) )
- products = ( P(x)*P(y) for P in projections )
- return self._cartesian_product_of_elements(tuple(products))
-
- def cartesian_inner_product(self, x, y):
- r"""
- The standard componentwise Cartesian inner-product.
-
- We project ``x`` and ``y`` onto our factors, and add up the
- inner-products from the subalgebras. This may still be useful
- after (if) the default inner product in the Cartesian product
- algebra is overridden.
-
- SETUP::
-
- sage: from mjo.eja.eja_algebra import (HadamardEJA,
- ....: QuaternionHermitianEJA)
-
- EXAMPLE::
-
- sage: J1 = HadamardEJA(3,field=QQ)
- sage: J2 = QuaternionHermitianEJA(2,field=QQ,orthonormalize=False)
- sage: J = cartesian_product([J1,J2])
- sage: x1 = J1.one()
- sage: x2 = x1
- sage: y1 = J2.one()
- sage: y2 = y1
- sage: x1.inner_product(x2)
- 3
- sage: y1.inner_product(y2)
- 2
- sage: z1 = J._cartesian_product_of_elements((x1,y1))
- sage: z2 = J._cartesian_product_of_elements((x2,y2))
- sage: J.cartesian_inner_product(z1,z2)
- 5
-
- """
- m = len(self.cartesian_factors())
- projections = ( self.cartesian_projection(i) for i in range(m) )
- return sum( P(x).inner_product(P(y)) for P in projections )
-
-
def _element_constructor_(self, elt):
r"""
Construct an element of this algebra from an ordered tuple.