]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/euclidean_jordan_algebra.py
eja: use different generator names in subalgebras.
[sage.d.git] / mjo / eja / euclidean_jordan_algebra.py
index 849243c81d56a2781a8b0abe5c9e6ae795f264eb..28e2a0b7a7ca354d83b77708382bb17b04028072 100644 (file)
@@ -85,6 +85,10 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
         also the left multiplication matrix and must be symmetric::
 
             sage: set_random_seed()
+            sage: n = ZZ.random_element(1,10).abs()
+            sage: J = eja_rn(5)
+            sage: J.random_element().matrix().is_symmetric()
+            True
             sage: J = eja_ln(5)
             sage: J.random_element().matrix().is_symmetric()
             True
@@ -151,7 +155,22 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
 
         def subalgebra_generated_by(self):
             """
-            Return the subalgebra of the parent EJA generated by this element.
+            Return the associative subalgebra of the parent EJA generated
+            by this element.
+
+            TESTS::
+
+                sage: set_random_seed()
+                sage: n = ZZ.random_element(1,10).abs()
+                sage: J = eja_rn(n)
+                sage: x = J.random_element()
+                sage: x.subalgebra_generated_by().is_associative()
+                True
+                sage: J = eja_ln(n)
+                sage: x = J.random_element()
+                sage: x.subalgebra_generated_by().is_associative()
+                True
+
             """
             # First get the subspace spanned by the powers of myself...
             V = self.span_of_powers()
@@ -178,7 +197,11 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
                 b_right_matrix = matrix(F, b_right_rows)
                 mats.append(b_right_matrix)
 
-            return FiniteDimensionalEuclideanJordanAlgebra(F, mats)
+            # It's an algebra of polynomials in one element, and EJAs
+            # are power-associative.
+            #
+            # TODO: choose generator names intelligently.
+            return FiniteDimensionalEuclideanJordanAlgebra(F, mats, assume_associative=True, names='f')
 
 
         def minimal_polynomial(self):
@@ -221,13 +244,80 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
                 True
 
             """
-            V = self.span_of_powers()
-            assoc_subalg = self.subalgebra_generated_by()
-            # Mis-design warning: the basis used for span_of_powers()
-            # and subalgebra_generated_by() must be the same, and in
-            # the same order!
-            subalg_self = assoc_subalg(V.coordinates(self.vector()))
-            return subalg_self.matrix().minimal_polynomial()
+            # The element we're going to call "minimal_polynomial()" on.
+            # Either myself, interpreted as an element of a finite-
+            # dimensional algebra, or an element of an associative
+            # subalgebra.
+            elt = None
+
+            if self.parent().is_associative():
+                elt = FiniteDimensionalAlgebraElement(self.parent(), self)
+            else:
+                V = self.span_of_powers()
+                assoc_subalg = self.subalgebra_generated_by()
+                # Mis-design warning: the basis used for span_of_powers()
+                # and subalgebra_generated_by() must be the same, and in
+                # the same order!
+                elt = assoc_subalg(V.coordinates(self.vector()))
+
+            # Recursive call, but should work since elt lives in an
+            # associative algebra.
+            return elt.minimal_polynomial()
+
+
+        def is_nilpotent(self):
+            """
+            Return whether or not some power of this element is zero.
+
+            The superclass method won't work unless we're in an
+            associative algebra, and we aren't. However, we generate
+            an assocoative subalgebra and we're nilpotent there if and
+            only if we're nilpotent here (probably).
+
+            TESTS:
+
+            The identity element is never nilpotent::
+
+                sage: set_random_seed()
+                sage: n = ZZ.random_element(2,10).abs()
+                sage: J = eja_rn(n)
+                sage: J.one().is_nilpotent()
+                False
+                sage: J = eja_ln(n)
+                sage: J.one().is_nilpotent()
+                False
+
+            The additive identity is always nilpotent::
+
+                sage: set_random_seed()
+                sage: n = ZZ.random_element(2,10).abs()
+                sage: J = eja_rn(n)
+                sage: J.zero().is_nilpotent()
+                True
+                sage: J = eja_ln(n)
+                sage: J.zero().is_nilpotent()
+                True
+
+            """
+            # The element we're going to call "is_nilpotent()" on.
+            # Either myself, interpreted as an element of a finite-
+            # dimensional algebra, or an element of an associative
+            # subalgebra.
+            elt = None
+
+            if self.parent().is_associative():
+                elt = FiniteDimensionalAlgebraElement(self.parent(), self)
+            else:
+                V = self.span_of_powers()
+                assoc_subalg = self.subalgebra_generated_by()
+                # Mis-design warning: the basis used for span_of_powers()
+                # and subalgebra_generated_by() must be the same, and in
+                # the same order!
+                elt = assoc_subalg(V.coordinates(self.vector()))
+
+            # Recursive call, but should work since elt lives in an
+            # associative algebra.
+            return elt.is_nilpotent()
 
 
         def characteristic_polynomial(self):
@@ -317,4 +407,8 @@ def eja_ln(dimension, field=QQ):
         Qi[0,0] = Qi[0,0] * ~field(2)
         Qs.append(Qi)
 
-    return FiniteDimensionalEuclideanJordanAlgebra(field,Qs,rank=2)
+    # The rank of the spin factor algebra is two, UNLESS we're in a
+    # one-dimensional ambient space (the rank is bounded by the
+    # ambient dimension).
+    rank = min(dimension,2)
+    return FiniteDimensionalEuclideanJordanAlgebra(field,Qs,rank=rank)