X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feuclidean_jordan_algebra.py;h=4b46380708e05fdeb564d300c6f5cca7f91178e7;hb=9144c528176a467bec604e334ba05379cc995ae3;hp=2fa4800b09f4f26ca784532e154cde1665ed7b84;hpb=87644b67c69d96150793929470507522a8fa2b0b;p=sage.d.git diff --git a/mjo/eja/euclidean_jordan_algebra.py b/mjo/eja/euclidean_jordan_algebra.py index 2fa4800..4b46380 100644 --- a/mjo/eja/euclidean_jordan_algebra.py +++ b/mjo/eja/euclidean_jordan_algebra.py @@ -658,8 +658,10 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): """ Return the Jordan-multiplicative inverse of this element. - We can't use the superclass method because it relies on the - algebra being associative. + ALGORITHM: + + We appeal to the quadratic representation as in Koecher's + Theorem 12 in Chapter III, Section 5. EXAMPLES: @@ -698,35 +700,28 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): sage: (not x.is_invertible()) or (x.inverse()*x == J.one()) True - """ - if self.parent().is_associative(): - elt = FiniteDimensionalAlgebraElement(self.parent(), self) - return elt.inverse() + The inverse of the inverse is what we started with:: - # TODO: we can do better once the call to is_invertible() - # doesn't crash on irregular elements. - #if not self.is_invertible(): - # raise ValueError('element is not invertible') + sage: set_random_seed() + sage: J = random_eja() + sage: x = J.random_element() + sage: (not x.is_invertible()) or (x.inverse().inverse() == x) + True - # We do this a little different than the usual recursive - # call to a finite-dimensional algebra element, because we - # wind up with an inverse that lives in the subalgebra and - # we need information about the parent to convert it back. - 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())) + The zero element is never invertible:: - # This will be in the subalgebra's coordinates... - fda_elt = FiniteDimensionalAlgebraElement(assoc_subalg, elt) - subalg_inverse = fda_elt.inverse() + sage: set_random_seed() + sage: J = random_eja().zero().inverse() + Traceback (most recent call last): + ... + ValueError: element is not invertible - # So we have to convert back... - basis = [ self.parent(v) for v in V.basis() ] - pairs = zip(subalg_inverse.vector(), basis) - return self.parent().linear_combination(pairs) + """ + if not self.is_invertible(): + raise ValueError("element is not invertible") + + P = self.parent() + return P(self.quadratic_representation().inverse()*self.vector()) def is_invertible(self): @@ -1087,38 +1082,77 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): sage: J = random_eja() sage: x = J.random_element() sage: y = J.random_element() + sage: Lx = x.operator_matrix() + sage: Lxx = (x*x).operator_matrix() + sage: Qx = x.quadratic_representation() + sage: Qy = y.quadratic_representation() + sage: Qxy = x.quadratic_representation(y) + sage: Qex = J.one().quadratic_representation(x) + sage: n = ZZ.random_element(10) + sage: Qxn = (x^n).quadratic_representation() Property 1: - sage: actual = x.quadratic_representation(y) - sage: expected = ( (x+y).quadratic_representation() - ....: -x.quadratic_representation() - ....: -y.quadratic_representation() ) / 2 - sage: actual == expected + sage: 2*Qxy == (x+y).quadratic_representation() - Qx - Qy True Property 2: sage: alpha = QQ.random_element() - sage: actual = (alpha*x).quadratic_representation() - sage: expected = (alpha^2)*x.quadratic_representation() - sage: actual == expected + sage: (alpha*x).quadratic_representation() == (alpha^2)*Qx + True + + Property 3: + + sage: not x.is_invertible() or ( + ....: Qx*x.inverse().vector() == x.vector() ) + True + + sage: not x.is_invertible() or ( + ....: Qx.inverse() + ....: == + ....: x.inverse().quadratic_representation() ) + True + + sage: Qxy*(J.one().vector()) == (x*y).vector() + True + + Property 4: + + sage: not x.is_invertible() or ( + ....: x.quadratic_representation(x.inverse())*Qx + ....: == Qx*x.quadratic_representation(x.inverse()) ) + True + + sage: not x.is_invertible() or ( + ....: x.quadratic_representation(x.inverse())*Qx + ....: == + ....: 2*x.operator_matrix()*Qex - Qx ) + True + + sage: 2*x.operator_matrix()*Qex - Qx == Lxx True Property 5: - sage: Qy = y.quadratic_representation() - sage: actual = J(Qy*x.vector()).quadratic_representation() - sage: expected = Qy*x.quadratic_representation()*Qy - sage: actual == expected + sage: J(Qy*x.vector()).quadratic_representation() == Qy*Qx*Qy True Property 6: - sage: k = ZZ.random_element(1,10) - sage: actual = (x^k).quadratic_representation() - sage: expected = (x.quadratic_representation())^k - sage: actual == expected + sage: Qxn == (Qx)^n + True + + Property 7: + + sage: not x.is_invertible() or ( + ....: Qx*x.inverse().operator_matrix() == Lx ) + True + + Property 8: + + sage: not x.operator_commutes_with(y) or ( + ....: J(Qx*y.vector())^n == J(Qxn*(y^n).vector()) ) True """ @@ -1212,12 +1246,11 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): TESTS:: sage: set_random_seed() - sage: J = RealCartesianProductEJA(5) - sage: c = J.random_element().subalgebra_idempotent() - sage: c^2 == c - True - sage: J = JordanSpinEJA(5) - sage: c = J.random_element().subalgebra_idempotent() + sage: J = random_eja() + sage: x = J.random_element() + sage: while x.is_nilpotent(): + ....: x = J.random_element() + sage: c = x.subalgebra_idempotent() sage: c^2 == c True