]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/matrix_algebra.py
COPYING,LICENSE: add (AGPL-3.0+)
[sage.d.git] / mjo / matrix_algebra.py
index bd173eaba835b8b82632587e62fcf6a8e7ec4e44..6817af1e046d65efeab32f45dc17396cd7fb4906 100644 (file)
@@ -57,7 +57,18 @@ class MatrixAlgebraElement(IndexedFreeModuleElement):
             | 0 | 0 |
             +---+---+
 
+        TESTS::
+
+            sage: MatrixAlgebra(0,ZZ,ZZ).zero()
+            []
+
         """
+        if self.nrows() == 0 or self.ncols() == 0:
+            # Otherwise we get a crash or a blank space, depending on
+            # how hard we work for it. This is what MatrixSpace(...,
+            # 0) returns.
+            return "[]"
+
         return table(self.rows(), frame=True)._repr_()
 
 
@@ -100,7 +111,12 @@ class MatrixAlgebraElement(IndexedFreeModuleElement):
 
         """
         i,j = indices
-        return self.rows()[i][j]
+        d = self.monomial_coefficients()
+        A = self.parent().entry_algebra()
+        return A.sum( d[k]*k[2]
+                      for k in d
+                      if k[0] == i and k[1] == j )
+
 
     def trace(self):
         r"""
@@ -125,8 +141,9 @@ class MatrixAlgebraElement(IndexedFreeModuleElement):
             [0 2]
 
         """
-        zero = self.parent().entry_algebra().zero()
-        return sum( (self[i,i] for i in range(self.nrows())), zero )
+        d = self.monomial_coefficients()
+        A = self.parent().entry_algebra()
+        return A.sum( d[k]*k[2] for k in d if k[0] == k[1] )
 
     def matrix_space(self):
         r"""
@@ -137,7 +154,6 @@ class MatrixAlgebraElement(IndexedFreeModuleElement):
 
         TESTS::
 
-            sage: set_random_seed()
             sage: entries = QuaternionAlgebra(QQ,-1,-1)
             sage: M = MatrixAlgebra(3, entries, QQ)
             sage: M.random_element().matrix_space() == M
@@ -193,7 +209,7 @@ class MatrixAlgebra(CombinatorialFreeModule):
 
         self._nrows = n
 
-        # Since the scalar ring is real but the entries are not,
+        # Since the scalar ring is (say) real but the entries are not,
         # sticking a "1" in each position doesn't give us a basis for
         # the space. We actually need to stick each of e0, e1, ...  (a
         # basis for the entry algebra itself) into each position.