From ab0536f4db17eb78f3623927653b8f7f1a7e6808 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Wed, 3 Mar 2021 10:11:22 -0500 Subject: [PATCH] matrix_algebra: factor out Hurwitz subclass. --- mjo/matrix_algebra.py | 129 +++++++++++++++++++++++++++--------------- mjo/octonions.py | 4 +- 2 files changed, 85 insertions(+), 48 deletions(-) diff --git a/mjo/matrix_algebra.py b/mjo/matrix_algebra.py index 668a1c4..4049ef6 100644 --- a/mjo/matrix_algebra.py +++ b/mjo/matrix_algebra.py @@ -50,11 +50,11 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): EXAMPLES:: - sage: MatrixAlgebra(ZZ,ZZ,2).one() + sage: MatrixAlgebra(ZZ,ZZ,2).zero() +---+---+ - | 1 | 0 | + | 0 | 0 | +---+---+ - | 0 | 1 | + | 0 | 0 | +---+---+ """ @@ -71,8 +71,9 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): EXAMPLES:: - sage: MatrixAlgebra(ZZ,ZZ,2).one().list() - [1, 0, 0, 1] + sage: A = MatrixAlgebra(ZZ,ZZ,2) + sage: A([[1,2],[3,4]]).list() + [1, 2, 3, 4] """ return sum( self.rows(), [] ) @@ -87,15 +88,15 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): EXAMPLES:: - sage: M = MatrixAlgebra(ZZ,ZZ,2).one() + sage: M = MatrixAlgebra(ZZ,ZZ,2)([[1,2],[3,4]]) sage: M[0,0] 1 sage: M[0,1] - 0 + 2 sage: M[1,0] - 0 + 3 sage: M[1,1] - 1 + 4 """ i,j = indices @@ -117,7 +118,9 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): sage: entries = MatrixSpace(ZZ,2) sage: scalars = ZZ sage: M = MatrixAlgebra(entries, scalars, 2) - sage: M.one().trace() + sage: I = entries.one() + sage: Z = entries.zero() + sage: M([[I,Z],[Z,I]]).trace() [2 0] [0 2] @@ -143,25 +146,6 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): """ return self.parent() - # onlt valid in HurwitzMatrixAlgebra subclass - # def is_hermitian(self): - # r""" - - # SETUP:: - - # sage: from mjo.octonions import OctonionMatrixAlgebra - - # EXAMPLES:: - - # sage: MS = OctonionMatrixAlgebra(3) - # sage: MS.one().is_hermitian() - # True - - # """ - # return all( self[i,j] == self[j,i].conjugate() - # for i in range(self.nrows()) - # for j in range(self.ncols()) ) - class MatrixAlgebra(CombinatorialFreeModule): r""" @@ -234,18 +218,6 @@ class MatrixAlgebra(CombinatorialFreeModule): else: return self.zero() - # TODO: only makes sense if I'm unital. - def one(self): - r""" - SETUP:: - - sage: from mjo.matrix_algebra import MatrixAlgebra - - """ - return sum( (self.monomial((i,i,self.entry_algebra().one())) - for i in range(self.nrows()) ), - self.zero() ) - def from_list(self, entries): r""" Construct an element of this algebra from a list of lists of @@ -255,6 +227,16 @@ class MatrixAlgebra(CombinatorialFreeModule): sage: from mjo.matrix_algebra import MatrixAlgebra + EXAMPLES:: + + sage: A = MatrixAlgebra(QQbar, ZZ, 2) + sage: A.from_list([[0,I],[-I,0]]) + +----+---+ + | 0 | I | + +----+---+ + | -I | 0 | + +----+---+ + """ nrows = len(entries) ncols = 0 @@ -265,13 +247,68 @@ class MatrixAlgebra(CombinatorialFreeModule): raise ValueError("list must be square") def convert(e_ij): - # We have to pass through vectors to convert from the - # given entry algebra to ours. Otherwise we can fail - # to convert an element of (for example) Octonions(QQ) - # to Octonions(AA). - return self.entry_algebra().from_vector(e_ij.to_vector()) + if e_ij in self.entry_algebra(): + # Don't re-create an element if it already lives where + # it should! + return e_ij + + try: + # This branch works with e.g. QQbar, where no + # to/from_vector() methods are available. + return self.entry_algebra()(e_ij) + except TypeError: + # We have to pass through vectors to convert from the + # given entry algebra to ours. Otherwise we can fail to + # convert an element of (for example) Octonions(QQ) to + # Octonions(AA). + return self.entry_algebra().from_vector(e_ij.to_vector()) return sum( (self.monomial( (i,j, convert(entries[i][j])) ) for i in range(nrows) for j in range(ncols) ), self.zero() ) + + def _element_constructor_(self, elt): + if elt in self: + return self + else: + return self.from_list(elt) + + +class HurwitzMatrixAlgebraElement(MatrixAlgebraElement): + def is_hermitian(self): + r""" + + SETUP:: + + sage: from mjo.matrix_algebra import HurwitzMatrixAlgebra + + EXAMPLES:: + + sage: A = HurwitzMatrixAlgebra(QQbar, ZZ, 2) + sage: M = A([ [ 0,I], + ....: [-I,0] ]) + sage: M.is_hermitian() + True + + """ + return all( self[i,j] == self[j,i].conjugate() + for i in range(self.nrows()) + for j in range(self.ncols()) ) + + +class HurwitzMatrixAlgebra(MatrixAlgebra): + Element = HurwitzMatrixAlgebraElement + + def one(self): + r""" + SETUP:: + + sage: from mjo.matrix_algebra import HurwitzMatrixAlgebra + + """ + return sum( (self.monomial((i,i,self.entry_algebra().one())) + for i in range(self.nrows()) ), + self.zero() ) + + diff --git a/mjo/octonions.py b/mjo/octonions.py index bd014c2..289c46a 100644 --- a/mjo/octonions.py +++ b/mjo/octonions.py @@ -374,8 +374,8 @@ class OctonionMatrixAlgebra(MatrixAlgebra): sage: O = Octonions(QQ) sage: e0,e1,e2,e3,e4,e5,e6,e7 = O.gens() sage: MS = OctonionMatrixAlgebra(2) - sage: MS.from_list([ [e0+e4, e1+e5], - ....: [e2-e6, e3-e7] ]) + sage: MS([ [e0+e4, e1+e5], + ....: [e2-e6, e3-e7] ]) +---------+---------+ | e0 + e4 | e1 + e5 | +---------+---------+ -- 2.43.2