X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_operator.py;h=0b52f555d51f58341fe56f5b63984f88cdf99da0;hb=4c6ab92d378613a9a053b62382b7e0cda7c450ab;hp=030b94f73c5b4d1da8762a9cd9613e3d5725c4ad;hpb=44182089cc3e0f0a6aecb6e652ad2a5c42bbb36a;p=sage.d.git diff --git a/mjo/eja/eja_operator.py b/mjo/eja/eja_operator.py index 030b94f..0b52f55 100644 --- a/mjo/eja/eja_operator.py +++ b/mjo/eja/eja_operator.py @@ -3,12 +3,48 @@ from sage.categories.all import FreeModules from sage.categories.map import Map class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): + r""" + An operator between two finite-dimensional Euclidean Jordan algebras. + + SETUP:: + + sage: from mjo.eja.eja_algebra import HadamardEJA + sage: from mjo.eja.eja_operator import FiniteDimensionalEuclideanJordanAlgebraOperator + + EXAMPLES: + + The domain and codomain must be finite-dimensional Euclidean + Jordan algebras; if either is not, then an error is raised:: + + sage: J = HadamardEJA(3) + sage: V = VectorSpace(J.base_ring(), 3) + sage: M = matrix.identity(J.base_ring(), 3) + sage: FiniteDimensionalEuclideanJordanAlgebraOperator(V,J,M) + Traceback (most recent call last): + ... + TypeError: domain must be a finite-dimensional Euclidean + Jordan algebra + sage: FiniteDimensionalEuclideanJordanAlgebraOperator(J,V,M) + Traceback (most recent call last): + ... + TypeError: codomain must be a finite-dimensional Euclidean + Jordan algebra + + """ + def __init__(self, domain_eja, codomain_eja, mat): - # if not ( - # isinstance(domain_eja, FiniteDimensionalEuclideanJordanAlgebra) and - # isinstance(codomain_eja, FiniteDimensionalEuclideanJordanAlgebra) ): - # raise ValueError('(co)domains must be finite-dimensional Euclidean ' - # 'Jordan algebras') + from mjo.eja.eja_algebra import FiniteDimensionalEuclideanJordanAlgebra + + # I guess we should check this, because otherwise you could + # pass in pretty much anything algebraish. + if not isinstance(domain_eja, + FiniteDimensionalEuclideanJordanAlgebra): + raise TypeError('domain must be a finite-dimensional ' + 'Euclidean Jordan algebra') + if not isinstance(codomain_eja, + FiniteDimensionalEuclideanJordanAlgebra): + raise TypeError('codomain must be a finite-dimensional ' + 'Euclidean Jordan algebra') F = domain_eja.base_ring() if not (F == codomain_eja.base_ring()): @@ -117,17 +153,17 @@ class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): sage: from mjo.eja.eja_operator import FiniteDimensionalEuclideanJordanAlgebraOperator sage: from mjo.eja.eja_algebra import ( ....: JordanSpinEJA, - ....: RealCartesianProductEJA, + ....: HadamardEJA, ....: RealSymmetricEJA) EXAMPLES:: sage: J1 = JordanSpinEJA(3) - sage: J2 = RealCartesianProductEJA(2) + sage: J2 = HadamardEJA(2) sage: J3 = RealSymmetricEJA(1) - sage: mat1 = matrix(QQ, [[1,2,3], + sage: mat1 = matrix(AA, [[1,2,3], ....: [4,5,6]]) - sage: mat2 = matrix(QQ, [[7,8]]) + sage: mat2 = matrix(AA, [[7,8]]) sage: g = FiniteDimensionalEuclideanJordanAlgebraOperator(J1, ....: J2, ....: mat1) @@ -139,9 +175,9 @@ class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): algebras represented by the matrix: [39 54 69] Domain: Euclidean Jordan algebra of dimension 3 over - Rational Field + Algebraic Real Field Codomain: Euclidean Jordan algebra of dimension 1 over - Rational Field + Algebraic Real Field """ return FiniteDimensionalEuclideanJordanAlgebraOperator( @@ -341,9 +377,9 @@ class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): [1 0] [0 1] Domain: Euclidean Jordan algebra of dimension 2 over - Rational Field + Algebraic Real Field Codomain: Euclidean Jordan algebra of dimension 2 over - Rational Field + Algebraic Real Field """ msg = ("Linear operator between finite-dimensional Euclidean Jordan " @@ -383,6 +419,73 @@ class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): return (self + (-other)) + def is_self_adjoint(self): + r""" + Return whether or not this operator is self-adjoint. + + At least in Sage, the fact that the base field is real means + that the algebra elements have to be real as well (this is why + we embed the complex numbers and quaternions). As a result, the + matrix of this operator will contain only real entries, and it + suffices to check only symmetry, not conjugate symmetry. + + SETUP:: + + sage: from mjo.eja.eja_algebra import (JordanSpinEJA) + + EXAMPLES:: + + sage: J = JordanSpinEJA(4) + sage: J.one().operator().is_self_adjoint() + True + + """ + return self.matrix().is_symmetric() + + + def is_zero(self): + r""" + Return whether or not this map is the zero operator. + + SETUP:: + + sage: from mjo.eja.eja_operator import FiniteDimensionalEuclideanJordanAlgebraOperator + sage: from mjo.eja.eja_algebra import (random_eja, + ....: JordanSpinEJA, + ....: RealSymmetricEJA) + + EXAMPLES:: + + sage: J1 = JordanSpinEJA(2) + sage: J2 = RealSymmetricEJA(2) + sage: R = J1.base_ring() + sage: M = matrix(R, [ [0, 0], + ....: [0, 0], + ....: [0, 0] ]) + sage: L = FiniteDimensionalEuclideanJordanAlgebraOperator(J1,J2,M) + sage: L.is_zero() + True + sage: M = matrix(R, [ [0, 0], + ....: [0, 1], + ....: [0, 0] ]) + sage: L = FiniteDimensionalEuclideanJordanAlgebraOperator(J1,J2,M) + sage: L.is_zero() + False + + TESTS: + + The left-multiplication-by-zero operation on a given algebra + is its zero map:: + + sage: set_random_seed() + sage: J = random_eja() + sage: J.zero().operator().is_zero() + True + + """ + return self.matrix().is_zero() + + def inverse(self): """ Return the inverse of this operator, if it exists. @@ -542,7 +645,7 @@ class FiniteDimensionalEuclideanJordanAlgebraOperator(Map): EXAMPLES:: - sage: J = RealSymmetricEJA(4,AA) + sage: J = RealSymmetricEJA(4) sage: x = sum(J.gens()) sage: A = x.subalgebra_generated_by(orthonormalize_basis=True) sage: L0x = A(x).operator()