X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_subalgebra.py;h=68f1ce4cf8b5f07087e4474069ad4ebe5c6a4998;hb=757cc5c671346394eff0a6de15c879598e508c61;hp=3eee24866216ca84aa8acf2484e07d01d6cad019;hpb=4c8f9aac69d1cb4097b60b10e5b198b6372ec55e;p=sage.d.git diff --git a/mjo/eja/eja_subalgebra.py b/mjo/eja/eja_subalgebra.py index 3eee248..68f1ce4 100644 --- a/mjo/eja/eja_subalgebra.py +++ b/mjo/eja/eja_subalgebra.py @@ -1,4 +1,5 @@ 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 @@ -15,7 +16,8 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): the same as its matrix representation in the superalgebra:: sage: set_random_seed() - sage: A = random_eja().random_element().subalgebra_generated_by() + sage: x = random_eja(field=QQ,orthonormalize=False).random_element() + sage: A = x.subalgebra_generated_by(orthonormalize=False) sage: y = A.random_element() sage: actual = y.to_matrix() sage: expected = y.superalgebra_element().to_matrix() @@ -28,7 +30,7 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): sage: set_random_seed() sage: x = random_eja(field=AA).random_element() - sage: A = x.subalgebra_generated_by(orthonormalize_basis=True) + sage: A = x.subalgebra_generated_by(orthonormalize=True) sage: y = A.random_element() sage: y.operator()(A.one()) == y True @@ -50,40 +52,40 @@ class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement): sage: J = RealSymmetricEJA(3) sage: x = sum(J.gens()) sage: x - e0 + e1 + e2 + e3 + e4 + e5 - sage: A = x.subalgebra_generated_by() + b0 + b1 + b2 + b3 + b4 + b5 + sage: A = x.subalgebra_generated_by(orthonormalize=False) sage: A(x) - f1 + c1 sage: A(x).superalgebra_element() - e0 + e1 + e2 + e3 + e4 + e5 + b0 + b1 + b2 + b3 + b4 + b5 sage: y = sum(A.gens()) sage: y - f0 + f1 - sage: B = y.subalgebra_generated_by() + c0 + c1 + sage: B = y.subalgebra_generated_by(orthonormalize=False) sage: B(y) - g1 + d1 sage: B(y).superalgebra_element() - f0 + f1 + c0 + c1 TESTS: We can convert back and forth faithfully:: sage: set_random_seed() - sage: J = random_eja() + sage: J = random_eja(field=QQ, orthonormalize=False) sage: x = J.random_element() - sage: A = x.subalgebra_generated_by() + sage: A = x.subalgebra_generated_by(orthonormalize=False) sage: A(x).superalgebra_element() == x True sage: y = A.random_element() sage: A(y.superalgebra_element()) == y True - sage: B = y.subalgebra_generated_by() + sage: B = y.subalgebra_generated_by(orthonormalize=False) sage: B(y).superalgebra_element() == y True """ - return self._superalgebra(self.to_matrix()) + return self.parent().superalgebra_embedding()(self) @@ -109,28 +111,29 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): ....: [0,0] ]) sage: E22 = matrix(AA, [ [0,0], ....: [0,1] ]) - sage: K1 = FiniteDimensionalEJASubalgebra(J, (J(E11),)) + sage: K1 = FiniteDimensionalEJASubalgebra(J, (J(E11),), associative=True) sage: K1.one().to_matrix() [1 0] [0 0] - sage: K2 = FiniteDimensionalEJASubalgebra(J, (J(E22),)) + sage: K2 = FiniteDimensionalEJASubalgebra(J, (J(E22),), associative=True) sage: K2.one().to_matrix() [0 0] [0 1] TESTS: - Ensure that our generator names don't conflict with the superalgebra:: + Ensure that our generator names don't conflict with the + superalgebra:: sage: J = JordanSpinEJA(3) sage: J.one().subalgebra_generated_by().gens() - (f0,) + (c0,) sage: J = JordanSpinEJA(3, prefix='f') sage: J.one().subalgebra_generated_by().gens() (g0,) - sage: J = JordanSpinEJA(3, prefix='b') + sage: J = JordanSpinEJA(3, prefix='a') sage: J.one().subalgebra_generated_by().gens() - (c0,) + (b0,) Ensure that we can find subalgebras of subalgebras:: @@ -138,7 +141,6 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): sage: B = A.one().subalgebra_generated_by() sage: B.dimension() 1 - """ def __init__(self, superalgebra, basis, **kwargs): self._superalgebra = superalgebra @@ -151,7 +153,7 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): # try to "increment" the parent algebra's prefix, although # this idea goes out the window fast because some prefixen # are off-limits. - prefixen = [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ] + prefixen = ["b","c","d","e","f","g","h","l","m"] try: prefix = prefixen[prefixen.index(self._superalgebra.prefix()) + 1] except ValueError: @@ -169,6 +171,8 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): super().__init__(matrix_basis, jordan_product, inner_product, + field=field, + matrix_space=superalgebra.matrix_space(), prefix=prefix, **kwargs) @@ -193,11 +197,14 @@ 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, basis, orthonormalize=False) + sage: K = FiniteDimensionalEJASubalgebra(J, + ....: basis, + ....: associative=True, + ....: orthonormalize=False) sage: K(J.one()) - f1 + c1 sage: K(J.one() + x) - f0 + f1 + c0 + c1 :: @@ -208,19 +215,6 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): return super()._element_constructor_(elt) - - def matrix_space(self): - """ - Return the matrix space of this algebra, which is identical to - that of its superalgebra. - - This is correct "by definition," and avoids a mismatch when - the subalgebra is trivial (with no matrix basis elements to - infer anything from) and the parent is not. - """ - return self.superalgebra().matrix_space() - - def superalgebra(self): """ Return the superalgebra that this algebra was generated from. @@ -228,4 +222,35 @@ class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA): return self._superalgebra + @cached_method + def superalgebra_embedding(self): + r""" + Return the embedding from this subalgebra into the superalgebra. + + EXAMPLES:: + + sage: J = HadamardEJA(4) + sage: A = J.one().subalgebra_generated_by() + sage: iota = A.superalgebra_embedding() + sage: iota + Linear operator between finite-dimensional Euclidean Jordan algebras represented by the matrix: + [1/2] + [1/2] + [1/2] + [1/2] + Domain: Euclidean Jordan algebra of dimension 1 over Algebraic Real Field + Codomain: Euclidean Jordan algebra of dimension 4 over Algebraic Real Field + sage: iota(A.one()) == J.one() + True + + """ + from mjo.eja.eja_operator import FiniteDimensionalEJAOperator + mm = self._module_morphism(lambda j: self.superalgebra()(self.monomial(j).to_matrix()), + codomain=self.superalgebra()) + return FiniteDimensionalEJAOperator(self, + self.superalgebra(), + mm.matrix()) + + + Element = FiniteDimensionalEJASubalgebraElement