]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_algebra.py
Revert "eja: always use the rationals for denormalized bases."
[sage.d.git] / mjo / eja / eja_algebra.py
index 4504362a4f76c66112db8d47c00f8cd42711d305..4673e916433509876638cfaeabfba5883c2a0192 100644 (file)
@@ -939,8 +939,9 @@ class MatrixEuclideanJordanAlgebra(FiniteDimensionalEuclideanJordanAlgebra):
         else:
             basis = ( (b/n) for (b,n) in izip(self.natural_basis(),
                                               self._basis_normalizers) )
-            field = self.base_ring().base_ring() # yeeeaahhhhhhh
-            J = MatrixEuclideanJordanAlgebra(field,
+
+            # Do this over the rationals and convert back at the end.
+            J = MatrixEuclideanJordanAlgebra(QQ,
                                              basis,
                                              self.rank(),
                                              normalize_basis=False)
@@ -949,7 +950,14 @@ class MatrixEuclideanJordanAlgebra(FiniteDimensionalEuclideanJordanAlgebra):
             # p might be missing some vars, have to substitute "optionally"
             pairs = izip(x.base_ring().gens(), self._basis_normalizers)
             substitutions = { v: v*c for (v,c) in pairs }
-            return p.subs(substitutions)
+            result = p.subs(substitutions)
+
+            # The result of "subs" can be either a coefficient-ring
+            # element or a polynomial. Gotta handle both cases.
+            if result in QQ:
+                return self.base_ring()(result)
+            else:
+                return result.change_ring(self.base_ring())
 
 
     @staticmethod
@@ -1255,7 +1263,7 @@ class ComplexMatrixEuclideanJordanAlgebra(MatrixEuclideanJordanAlgebra):
         if not n.mod(2).is_zero():
             raise ValueError("the matrix 'M' must be a complex embedding")
 
-        field = QQ
+        field = M.base_ring() # This should already have sqrt2
         R = PolynomialRing(field, 'z')
         z = R.gen()
         F = NumberField(z**2 + 1,'i', embedding=CLF(-1).sqrt())
@@ -1395,7 +1403,7 @@ class ComplexHermitianEJA(ComplexMatrixEuclideanJordanAlgebra, KnownRankEJA):
             True
 
         """
-        R = PolynomialRing(QQ, 'z')
+        R = PolynomialRing(field, 'z')
         z = R.gen()
         F = NumberField(z**2 + 1, 'I', embedding=CLF(-1).sqrt())
         I = F.gen()
@@ -1532,7 +1540,7 @@ class QuaternionMatrixEuclideanJordanAlgebra(MatrixEuclideanJordanAlgebra):
         if M.ncols() != n:
             raise ValueError("the matrix 'M' must be square")
         if not n.mod(4).is_zero():
-            raise ValueError("the matrix 'M' must be a complex embedding")
+            raise ValueError("the matrix 'M' must be a quaternion embedding")
 
         # Use the base ring of the matrix to ensure that its entries can be
         # multiplied by elements of the quaternion algebra.
@@ -1704,7 +1712,10 @@ class QuaternionHermitianEJA(QuaternionMatrixEuclideanJordanAlgebra,
                     S.append(Sij_J)
                     Sij_K = cls.real_embed(K*Eij - K*Eij.transpose())
                     S.append(Sij_K)
-        return S
+
+        # Since we embedded these, we can drop back to the "field" that we
+        # started with instead of the quaternion algebra "Q".
+        return ( s.change_ring(field) for s in S )
 
 
     def __init__(self, n, field=QQ, **kwargs):