l[i][j] += v*e
return l
- def __repr__(self):
+ def _repr_(self):
r"""
Display this matrix as a table.
the entries come from a commutative and associative ring. This
is problematic in several interesting matrix algebras, like those
where the entries are quaternions or octonions.
+
+ SETUP::
+
+ sage: from mjo.matrix_algebra import MatrixAlgebra
+
+ EXAMPLES::
+
+ The existence of a unit element is determined dynamically::
+
+ sage: MatrixAlgebra(ZZ,ZZ,2).one()
+ +---+---+
+ | 1 | 0 |
+ +---+---+
+ | 0 | 1 |
+ +---+---+
+
"""
Element = MatrixAlgebraElement
if "Unital" in entry_algebra.category().axioms():
category = category.Unital()
+ entry_one = entry_algebra.one()
+ self.one = lambda: sum( (self.monomial((i,i,entry_one))
+ for i in range(self.nrows()) ),
+ self.zero() )
+
if "Associative" in entry_algebra.category().axioms():
category = category.Associative()
ncols = nrows
def product_on_basis(self, mon1, mon2):
+ r"""
+
+ SETUP::
+
+ sage: from mjo.octonions import Octonions
+ sage: from mjo.matrix_algebra import MatrixAlgebra
+
+ TESTS::
+
+ sage: O = Octonions(QQ)
+ sage: e = O.gens()
+ sage: e[2]*e[1]
+ -e3
+ sage: A = MatrixAlgebra(O,QQ,2)
+ sage: A.product_on_basis( (0,0,e[2]), (0,0,e[1]) )
+ +-----+---+
+ | -e3 | 0 |
+ +-----+---+
+ | 0 | 0 |
+ +-----+---+
+
+ """
(i,j,e1) = mon1
(k,l,e2) = mon2
if j == k:
- return self.monomial((i,l,e1*e2))
+ # If e1*e2 has a negative sign in front of it,
+ # then (i,l,e1*e2) won't be a monomial!
+ p = e1*e2
+ if (i,l,p) in self.indices():
+ return self.monomial((i,l,p))
+ else:
+ return -self.monomial((i,l,-p))
else:
return self.zero()
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() )
-
-