]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/octonions.py
octonions: add QuaternionMatrixAlgebra; prepare for rename...
[sage.d.git] / mjo / octonions.py
index bd014c22eb4c180117cf70291e4f2357c091bd20..78365e298ec7a46fcaff0603039f6410aa768c96 100644 (file)
@@ -7,7 +7,7 @@ from sage.rings.all import AA, ZZ
 from sage.matrix.matrix_space import MatrixSpace
 from sage.misc.table import table
 
-from mjo.matrix_algebra import MatrixAlgebra
+from mjo.matrix_algebra import HurwitzMatrixAlgebra
 
 class Octonion(IndexedFreeModuleElement):
     def conjugate(self):
@@ -347,18 +347,18 @@ class Octonions(CombinatorialFreeModule):
 
 
 
-class OctonionMatrixAlgebra(MatrixAlgebra):
+class OctonionMatrixAlgebra(HurwitzMatrixAlgebra):
     r"""
     The algebra of ``n``-by-``n`` matrices with octonion entries over
     (a subfield of) the real numbers.
 
     The usual matrix spaces in SageMath don't support octonion entries
     because they assume that the entries of the matrix come from a
-    commutative and associative ring (i.e. very NOT the octonions).
+    commutative and associative ring, and the octonions are neither.
 
     SETUP::
 
-        sage: from mjo.octonions import Octonions, OctonionMatrixAlgebra
+        sage: from mjo.octonions import OctonionMatrixAlgebra
 
     EXAMPLES::
 
@@ -371,23 +371,32 @@ 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: A = OctonionMatrixAlgebra(2)
+        sage: e0,e1,e2,e3,e4,e5,e6,e7 = A.entry_algebra().gens()
+        sage: A([ [e0+e4, e1+e5],
+        ....:     [e2-e6, e3-e7] ])
         +---------+---------+
         | e0 + e4 | e1 + e5 |
         +---------+---------+
         | e2 - e6 | e3 - e7 |
         +---------+---------+
 
+    ::
+
+        sage: A1 = OctonionMatrixAlgebra(1,QQ)
+        sage: A2 = OctonionMatrixAlgebra(1,QQ)
+        sage: cartesian_product([A1,A2])
+        Module of 1 by 1 matrices with entries in Octonion algebra with
+        base ring Rational Field over the scalar ring Rational Field (+)
+        Module of 1 by 1 matrices with entries in Octonion algebra with
+        base ring Rational Field over the scalar ring Rational Field
+
     TESTS::
 
         sage: set_random_seed()
-        sage: MS = OctonionMatrixAlgebra(ZZ.random_element(10))
-        sage: x = MS.random_element()
-        sage: x*MS.one() == x and MS.one()*x == x
+        sage: A = OctonionMatrixAlgebra(ZZ.random_element(10))
+        sage: x = A.random_element()
+        sage: x*A.one() == x and A.one()*x == x
         True
 
     """
@@ -397,3 +406,64 @@ class OctonionMatrixAlgebra(MatrixAlgebra):
                          n,
                          prefix=prefix,
                          **kwargs)
+
+class QuaternionMatrixAlgebra(HurwitzMatrixAlgebra):
+    r"""
+    The algebra of ``n``-by-``n`` matrices with quaternion entries over
+    (a subfield of) the real numbers.
+
+    The usual matrix spaces in SageMath don't support quaternion entries
+    because they assume that the entries of the matrix come from a
+    commutative ring, and the quaternions are not commutative.
+
+    SETUP::
+
+        sage: from mjo.octonions import QuaternionMatrixAlgebra
+
+    EXAMPLES::
+
+        sage: QuaternionMatrixAlgebra(3)
+        Module of 3 by 3 matrices with entries in Quaternion
+        Algebra (-1, -1) with base ring Algebraic Real Field
+        over the scalar ring Algebraic Real Field
+        sage: QuaternionMatrixAlgebra(3,QQ)
+        Module of 3 by 3 matrices with entries in Quaternion
+        Algebra (-1, -1) with base ring Rational Field over
+        the scalar ring Rational Field
+
+    ::
+
+        sage: A = QuaternionMatrixAlgebra(2)
+        sage: i,j,k = A.entry_algebra().gens()
+        sage: A([ [1+i, j-2],
+        ....:     [k,   k+j] ])
+        +-------+--------+
+        | 1 + i | -2 + j |
+        +-------+--------+
+        | k     | j + k  |
+        +-------+--------+
+
+    ::
+
+        sage: A1 = QuaternionMatrixAlgebra(1,QQ)
+        sage: A2 = QuaternionMatrixAlgebra(2,QQ)
+        sage: cartesian_product([A1,A2])
+        Module of 1 by 1 matrices with entries in Quaternion Algebra
+        (-1, -1) with base ring Rational Field over the scalar ring
+        Rational Field (+) Module of 2 by 2 matrices with entries in
+        Quaternion Algebra (-1, -1) with base ring Rational Field over
+        the scalar ring Rational Field
+
+    TESTS::
+
+        sage: set_random_seed()
+        sage: A = QuaternionMatrixAlgebra(ZZ.random_element(10))
+        sage: x = A.random_element()
+        sage: x*A.one() == x and A.one()*x == x
+        True
+
+    """
+    def __init__(self, n, scalars=AA, **kwargs):
+        # The -1,-1 gives us the "usual" definition of quaternion
+        Q = QuaternionAlgebra(scalars,-1,-1)
+        super().__init__(Q, scalars, n, **kwargs)