]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_utils.py
eja: drop obsolete _vec2mat and _mat2vec helpers.
[sage.d.git] / mjo / eja / eja_utils.py
index 0b2d2a315989949c2431641c8f82dea9b576f9b8..79d8ecfce61c555375deffd40501b2fb100c0379 100644 (file)
@@ -1,6 +1,40 @@
-from sage.functions.other import sqrt
-from sage.matrix.constructor import matrix
-from sage.modules.free_module_element import vector
+from sage.structure.element import is_Matrix
+
+def _charpoly_sage_input(s):
+    r"""
+    Helper function that you can use on the string output from sage
+    to convert a charpoly coefficient into the corresponding input
+    to be cached.
+
+    SETUP::
+
+        sage: from mjo.eja.eja_algebra import JordanSpinEJA
+        sage: from mjo.eja.eja_utils import _charpoly_sage_input
+
+    EXAMPLES::
+
+        sage: J = JordanSpinEJA(4,QQ)
+        sage: a = J._charpoly_coefficients()
+        sage: a[0]
+        X1^2 - X2^2 - X3^2 - X4^2
+        sage: _charpoly_sage_input(str(a[0]))
+        'X[0]**2 - X[1]**2 - X[2]**2 - X[3]**2'
+
+    """
+    import re
+
+    exponent_out = r"\^"
+    exponent_in = r"**"
+
+    digit_out = r"X([0-9]+)"
+
+    def replace_digit(m):
+        # m is a match object
+        return "X[" + str(int(m.group(1)) - 1) + "]"
+
+    s = re.sub(exponent_out, exponent_in, s)
+    return re.sub(digit_out, replace_digit, s)
+
 
 def _scale(x, alpha):
     r"""
@@ -54,7 +88,9 @@ def _all2list(x):
     SETUP::
 
         sage: from mjo.eja.eja_utils import _all2list
-        sage: from mjo.octonions import Octonions, OctonionMatrixAlgebra
+        sage: from mjo.hurwitz import (QuaternionMatrixAlgebra,
+        ....:                          Octonions,
+        ....:                          OctonionMatrixAlgebra)
 
     EXAMPLES::
 
@@ -86,6 +122,13 @@ def _all2list(x):
         sage: _all2list(OctonionMatrixAlgebra(1).one())
         [1, 0, 0, 0, 0, 0, 0, 0]
 
+    ::
+
+        sage: _all2list(QuaternionAlgebra(QQ, -1, -1).one())
+        [1, 0, 0, 0]
+        sage: _all2list(QuaternionMatrixAlgebra(1).one())
+        [1, 0, 0, 0]
+
     ::
 
         sage: V1 = VectorSpace(QQ,2)
@@ -102,9 +145,16 @@ def _all2list(x):
         # first needing to convert them to a list of octonions and
         # then recursing down into the list. It also avoids the wonky
         # list(x) when x is an element of a CFM. I don't know what it
-        # returns but it aint the coordinates. This will fall through
-        # to the iterable case the next time around.
-        return _all2list(x.to_vector())
+        # returns but it aint the coordinates. We don't recurse
+        # because vectors can only contain ring elements as entries.
+        return x.to_vector().list()
+
+    if is_Matrix(x):
+        # This sucks, but for performance reasons we don't want to
+        # call _all2list recursively on the contents of a matrix
+        # when we don't have to (they only contain ring elements
+        # as entries)
+        return x.list()
 
     try:
         xl = list(x)
@@ -115,15 +165,8 @@ def _all2list(x):
         # Avoid the retardation of list(QQ(1)) == [1].
         return [x]
 
-    return sum(list( map(_all2list, xl) ), [])
-
-
-
-def _mat2vec(m):
-        return vector(m.base_ring(), m.list())
+    return sum( map(_all2list, xl) , [])
 
-def _vec2mat(v):
-        return matrix(v.base_ring(), sqrt(v.degree()), v.list())
 
 def gram_schmidt(v, inner_product=None):
     """