X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_element.py;h=166c9d217cf71d43fe4bfc0911e6fe6c3e1ec9d2;hb=5d646c586de50b571d2983b546a05899bf0c20c2;hp=a4af4eaedbb4ce96c16aa31ab0e98c2fa4c5b6c7;hpb=64a06cae592dafa4ad007110d5d7ea9ae62dcee5;p=sage.d.git diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index a4af4ea..166c9d2 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -430,6 +430,13 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: x.inverse() == J.from_vector(x_inverse) True + Trying to invert a non-invertible element throws an error: + + sage: JordanSpinEJA(3).zero().inverse() + Traceback (most recent call last): + ... + ValueError: element is not invertible + TESTS: The identity element is its own inverse:: @@ -455,14 +462,6 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: (not x.is_invertible()) or (x.inverse().inverse() == x) True - The zero element is never invertible:: - - sage: set_random_seed() - sage: J = random_eja().zero().inverse() - Traceback (most recent call last): - ... - ValueError: element is not invertible - Proposition II.2.3 in Faraut and Korányi says that the inverse of an element is the inverse of its left-multiplication operator applied to the algebra's identity, when that inverse exists:: @@ -574,10 +573,11 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): TESTS: - The identity element is never nilpotent:: + The identity element is never nilpotent, except in a trivial EJA:: sage: set_random_seed() - sage: random_eja().one().is_nilpotent() + sage: J = random_eja() + sage: J.one().is_nilpotent() and not J.is_trivial() False The additive identity is always nilpotent:: @@ -621,11 +621,11 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): TESTS: The zero element should never be regular, unless the parent - algebra has dimension one:: + algebra has dimension less than or equal to one:: sage: set_random_seed() sage: J = random_eja() - sage: J.dimension() == 1 or not J.zero().is_regular() + sage: J.dimension() <= 1 or not J.zero().is_regular() True The unit element isn't regular unless the algebra happens to @@ -633,7 +633,7 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: set_random_seed() sage: J = random_eja() - sage: J.dimension() == 1 or not J.one().is_regular() + sage: J.dimension() <= 1 or not J.one().is_regular() True """ @@ -677,14 +677,17 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): TESTS: - The zero and unit elements are both of degree one:: + The zero and unit elements are both of degree one in nontrivial + algebras:: sage: set_random_seed() sage: J = random_eja() - sage: J.zero().degree() - 1 - sage: J.one().degree() - 1 + sage: d = J.zero().degree() + sage: (J.is_trivial() and d == 0) or d == 1 + True + sage: d = J.one().degree() + sage: (J.is_trivial() and d == 0) or d == 1 + True Our implementation agrees with the definition:: @@ -728,15 +731,29 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: from mjo.eja.eja_algebra import (JordanSpinEJA, ....: RealSymmetricEJA, + ....: TrivialEJA, ....: random_eja) + EXAMPLES: + + Keeping in mind that the polynomial ``1`` evaluates the identity + element (also the zero element) of the trivial algebra, it is clear + that the polynomial ``1`` is the minimal polynomial of the only + element in a trivial algebra:: + + sage: J = TrivialEJA() + sage: J.one().minimal_polynomial() + 1 + sage: J.zero().minimal_polynomial() + 1 + TESTS: The minimal polynomial of the identity and zero elements are always the same:: sage: set_random_seed() - sage: J = random_eja() + sage: J = random_eja(nontrivial=True) sage: J.one().minimal_polynomial() t - 1 sage: J.zero().minimal_polynomial() @@ -1140,13 +1157,15 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: A(x^2) == A(x)*A(x) True - By definition, the subalgebra generated by the zero element is the - one-dimensional algebra generated by the identity element:: + By definition, the subalgebra generated by the zero element is + the one-dimensional algebra generated by the identity + element... unless the original algebra was trivial, in which + case the subalgebra is trivial too:: sage: set_random_seed() sage: A = random_eja().zero().subalgebra_generated_by() - sage: A.dimension() - 1 + sage: (A.is_trivial() and A.dimension() == 0) or A.dimension() == 1 + True """ return FiniteDimensionalEuclideanJordanElementSubalgebra(self, orthonormalize_basis) @@ -1212,14 +1231,23 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): """ Return my trace, the sum of my eigenvalues. + In a trivial algebra, however you want to look at it, the trace is + an empty sum for which we declare the result to be zero. + SETUP:: sage: from mjo.eja.eja_algebra import (JordanSpinEJA, ....: RealCartesianProductEJA, + ....: TrivialEJA, ....: random_eja) EXAMPLES:: + sage: J = TrivialEJA() + sage: J.zero().trace() + 0 + + :: sage: J = JordanSpinEJA(3) sage: x = sum(J.gens()) sage: x.trace() @@ -1243,6 +1271,12 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): """ P = self.parent() r = P.rank() + + if r == 0: + # Special case for the trivial algebra where + # the trace is an empty sum. + return P.base_ring().zero() + p = P._charpoly_coeff(r-1) # The _charpoly_coeff function already adds the factor of # -1 to ensure that _charpoly_coeff(r-1) is really what