associative=False,
check_field=True,
check_axioms=True,
- prefix='e'):
+ prefix='e',
+ category=None):
if check_field:
if not field.is_subring(RR):
raise ValueError("inner-product is not commutative")
- category = MagmaticAlgebras(field).FiniteDimensional()
- category = category.WithBasis().Unital()
- if associative:
- # Element subalgebras can take advantage of this.
- category = category.Associative()
+ if category is None:
+ category = MagmaticAlgebras(field).FiniteDimensional()
+ category = category.WithBasis().Unital()
+ if associative:
+ # Element subalgebras can take advantage of this.
+ category = category.Associative()
# Call the superclass constructor so that we can use its from_vector()
# method to build our multiplication table.
"""
def __init__(self, modules, **kwargs):
- CombinatorialFreeModule_CartesianProduct.__init__(self, modules, **kwargs)
+ CombinatorialFreeModule_CartesianProduct.__init__(self,
+ modules,
+ **kwargs)
field = modules[0].base_ring()
if not all( J.base_ring() == field for J in modules ):
raise ValueError("all factors must share the same base field")
- M = cartesian_product( [J.matrix_space() for J in modules] )
-
- m = len(modules)
- W = VectorSpace(field,m)
- self._matrix_basis = []
- for k in range(m):
- for a in modules[k].matrix_basis():
- v = W.zero().list()
- v[k] = a
- self._matrix_basis.append(M(v))
-
- self._matrix_basis = tuple(self._matrix_basis)
-
- n = len(self._matrix_basis)
+ basis = tuple( b.to_vector().column() for b in self.basis() )
+
+ # Define jordan/inner products that operate on the basis.
+ def jordan_product(x_mat,y_mat):
+ x = self.from_vector(_mat2vec(x_mat))
+ y = self.from_vector(_mat2vec(y_mat))
+ return self.cartesian_jordan_product(x,y).to_vector().column()
+
+ def inner_product(x_mat, y_mat):
+ x = self.from_vector(_mat2vec(x_mat))
+ y = self.from_vector(_mat2vec(y_mat))
+ return self.cartesian_inner_product(x,y)
+
+ FiniteDimensionalEJA.__init__(self,
+ basis,
+ jordan_product,
+ inner_product,
+ field=field,
+ orthonormalize=False,
+ check_field=False,
+ check_axioms=False,
+ category=self.category())
# TODO:
#
# Initialize the FDEJA class, too. Does this override the
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.
+ 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)