-class OctonionMatrix:
- r"""
- A pseudo-matrix class that supports octonion entries.
-
- Matrices in SageMath can't have base rings that are
- non-commutative, much less non-associative. The "matrix" scaling,
- addition, and multiplication operations for this class are all
- wholly inefficient, but are hand-written to guarantee that they
- are performed in the correct order. Of course, it can't guarantee
- that you won't write something visually ambiguous like
- `A*B*C`... but you already have that problem with the
- non-associative octonions themselves.
-
- This class is only as sophisticated as it need to be to implement
- the Jordan and inner-products in the space of Hermitian matrices
- with octonion entries, namely ``(X*Y+Y*X)/2`` and
- ``(X*Y).trace().real()`` for two octonion matrices ``X`` and
- ``Y``.
-
- .. WARNING:
-
- These are not matrices in the usual sense! Matrix
- multiplication is associative. Multiplication of octonion
- "matrices" cannot be, since the multiplication of the
- underlying octonions is not (consider two 1-by-1 matrices each
- containing a single octonion).
- """
- def __init__(self, entries):
- r"""
- Initialize this matrix with a list of lists in (row,column) order,
- just like in SageMath.
- """
- self._nrows = len(entries)
-
- if self._nrows == 0:
- self._ncols = 0
- else:
- # We don't check that you haven't supplied two rows (or
- # columns) of different lengths!
- self._ncols = len(entries[0])
-
- self._entries = entries
-
- def __getitem__(self, indices):
- r"""
- SETUP::
-
- sage: from mjo.octonions import Octonions, OctonionMatrix
-
- EXAMPLES::
-
- sage: O = Octonions(field=QQ)
- sage: M = OctonionMatrix([ [O.one(), O.zero()],
- ....: [O.zero(), O.one() ] ])
- sage: M[0,0]
- e0
- sage: M[0,1]
- 0
- sage: M[1,0]
- 0
- sage: M[1,1]
- e0
- """
- i,j = indices
- return self._entries[i][j]
-
- def nrows(self):
- r"""
- SETUP::
-
- sage: from mjo.octonions import Octonions, OctonionMatrix
-
- EXAMPLES::
-
- sage: O = Octonions(field=QQ)
- sage: M = OctonionMatrix([ [O.one(), O.zero()],
- ....: [O.zero(), O.one() ],
- ....: [O.zero(), O.zero()] ])
- sage: M.nrows()
- 3
-
- """
- return self._nrows
-
- def ncols(self):
- r"""
-
- SETUP::
-
- sage: from mjo.octonions import Octonions, OctonionMatrix
-
- EXAMPLES::