SETUP::
- sage: from mjo.eja.eja_algebra import (CartesianProductEJA,
+ sage: from mjo.eja.eja_algebra import (random_eja,
+ ....: CartesianProductEJA,
....: HadamardEJA,
....: JordanSpinEJA,
....: RealSymmetricEJA)
...
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
+
"""
def __init__(self, modules, **kwargs):
CombinatorialFreeModule_CartesianProduct.__init__(self,
# Use whatever category the superclass came up with. Usually
# some join of the EJA and Cartesian product
# categories. There's no need to check the field since it
- # already came from an EJA. Likewise the axioms are guaranteed
- # to be satisfied. We can't orthonormalize by default because
- # there's no way to pass "orthonormalize=False" to
- # cartesian_product(...) when the base ring is QQ and
- # orthonormalizing would give us irrational entries.
+ # already came from an EJA.
#
- # TODO: create a separate constructor that is capable of
- # orthonormalizing and is only used by the cartesian_product()
- # thingy.
+ # If you want the basis to be orthonormalized, orthonormalize
+ # the factors.
FiniteDimensionalEJA.__init__(self,
basis,
jordan_product,
check_field=False,
check_axioms=False,
category=self.category())
- # TODO:
- #
- # Initialize the FDEJA class, too. Does this override the
- # initialization that we did for the
- # CombinatorialFreeModule_CartesianProduct class? If not, we
- # will probably have to duplicate some of the work (i.e. one
- # of the constructors). Since the CartesianProduct one is
- # smaller, that makes the most sense to copy/paste if it comes
- # down to that.
- #
self.rank.set_cache(sum(J.rank() for J in modules))