X-Git-Url: http://gitweb.michael.orlitzky.com/?p=sage.d.git;a=blobdiff_plain;f=mjo%2Feja%2Feja_subalgebra.py;h=ca8efa1fd410b8f5f3f6d177b62779b1a24ccaf5;hp=68f1ce4cf8b5f07087e4474069ad4ebe5c6a4998;hb=HEAD;hpb=757cc5c671346394eff0a6de15c879598e508c61 diff --git a/mjo/eja/eja_subalgebra.py b/mjo/eja/eja_subalgebra.py index 68f1ce4..97a7978 100644 --- a/mjo/eja/eja_subalgebra.py +++ b/mjo/eja/eja_subalgebra.py @@ -1,10 +1,11 @@ from sage.matrix.constructor import matrix from sage.misc.cachefunc import cached_method -from mjo.eja.eja_algebra import FiniteDimensionalEJA -from mjo.eja.eja_element import FiniteDimensionalEJAElement +from mjo.eja.eja_algebra import EJA +from mjo.eja.eja_element import (EJAElement, + CartesianProductParentEJAElement) -class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): +class EJASubalgebraElement(EJAElement): """ SETUP:: @@ -15,7 +16,6 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): The matrix representation of an element in the subalgebra is the same as its matrix representation in the superalgebra:: - sage: set_random_seed() sage: x = random_eja(field=QQ,orthonormalize=False).random_element() sage: A = x.subalgebra_generated_by(orthonormalize=False) sage: y = A.random_element() @@ -28,11 +28,10 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): works like it does in the superalgebra, even if we orthonormalize our basis:: - sage: set_random_seed() - sage: x = random_eja(field=AA).random_element() - sage: A = x.subalgebra_generated_by(orthonormalize=True) - sage: y = A.random_element() - sage: y.operator()(A.one()) == y + sage: x = random_eja(field=AA).random_element() # long time + sage: A = x.subalgebra_generated_by(orthonormalize=True) # long time + sage: y = A.random_element() # long time + sage: y.operator()(A.one()) == y # long time True """ @@ -71,7 +70,6 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): We can convert back and forth faithfully:: - sage: set_random_seed() sage: J = random_eja(field=QQ, orthonormalize=False) sage: x = J.random_element() sage: A = x.subalgebra_generated_by(orthonormalize=False) @@ -90,7 +88,7 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): -class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): +class EJASubalgebra(EJA): """ A subalgebra of an EJA with a given basis. @@ -99,7 +97,7 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA, ....: JordanSpinEJA, ....: RealSymmetricEJA) - sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra + sage: from mjo.eja.eja_subalgebra import EJASubalgebra EXAMPLES: @@ -111,11 +109,11 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): ....: [0,0] ]) sage: E22 = matrix(AA, [ [0,0], ....: [0,1] ]) - sage: K1 = FiniteDimensionalEJASubalgebra(J, (J(E11),), associative=True) + sage: K1 = EJASubalgebra(J, (J(E11),), associative=True) sage: K1.one().to_matrix() [1 0] [0 0] - sage: K2 = FiniteDimensionalEJASubalgebra(J, (J(E22),), associative=True) + sage: K2 = EJASubalgebra(J, (J(E22),), associative=True) sage: K2.one().to_matrix() [0 0] [0 1] @@ -187,7 +185,7 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): SETUP:: sage: from mjo.eja.eja_algebra import RealSymmetricEJA - sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra + sage: from mjo.eja.eja_subalgebra import EJASubalgebra EXAMPLES:: @@ -197,7 +195,7 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): ....: [1,0,0] ]) sage: x = J(X) sage: basis = ( x, x^2 ) # x^2 is the identity matrix - sage: K = FiniteDimensionalEJASubalgebra(J, + sage: K = EJASubalgebra(J, ....: basis, ....: associative=True, ....: orthonormalize=False) @@ -210,7 +208,17 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): """ if elt in self.superalgebra(): - return super()._element_constructor_(elt.to_matrix()) + # If the subalgebra is trivial, its _matrix_span will be empty + # but we still want to be able convert the superalgebra's zero() + # element into the subalgebra's zero() element. There's no great + # workaround for this because sage checks that your basis is + # linearly-independent everywhere, so we can't just give it a + # basis consisting of the zero element. + m = elt.to_matrix() + if self.is_trivial() and m.is_zero(): + return self.zero() + else: + return super()._element_constructor_(m) else: return super()._element_constructor_(elt) @@ -227,6 +235,10 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): r""" Return the embedding from this subalgebra into the superalgebra. + SETUP:: + + sage: from mjo.eja.eja_algebra import HadamardEJA + EXAMPLES:: sage: J = HadamardEJA(4) @@ -244,13 +256,52 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): True """ - from mjo.eja.eja_operator import FiniteDimensionalEJAOperator + from mjo.eja.eja_operator import EJAOperator mm = self._module_morphism(lambda j: self.superalgebra()(self.monomial(j).to_matrix()), codomain=self.superalgebra()) - return FiniteDimensionalEJAOperator(self, + return EJAOperator(self, self.superalgebra(), mm.matrix()) - Element = FiniteDimensionalEJASubalgebraElement + Element = EJASubalgebraElement + + + +class CartesianProductEJASubalgebraElement(EJASubalgebraElement, + CartesianProductParentEJAElement): + r""" + The class for elements that both belong to a subalgebra and + have a Cartesian product algebra as their parent. By inheriting + :class:`CartesianProductParentEJAElement` in addition to + :class:`EJASubalgebraElement`, we allow the + ``to_matrix()`` method to be overridden with the version that + works on Cartesian products. + + SETUP:: + + sage: from mjo.eja.eja_algebra import (HadamardEJA, + ....: RealSymmetricEJA) + + TESTS: + + This used to fail when ``subalgebra_idempotent()`` tried to + embed the subalgebra element back into the original EJA:: + + sage: J1 = HadamardEJA(0, field=QQ, orthonormalize=False) + sage: J2 = RealSymmetricEJA(2, field=QQ, orthonormalize=False) + sage: J = cartesian_product([J1,J2]) + sage: J.one().subalgebra_idempotent() == J.one() + True + + """ + pass + +class CartesianProductEJASubalgebra(EJASubalgebra): + r""" + Subalgebras whose parents are Cartesian products. Exists only + to specify a special element class that will (in addition) + inherit from ``CartesianProductParentEJAElement``. + """ + Element = CartesianProductEJASubalgebraElement