X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feuclidean_jordan_algebra.py;h=038de61f481c4036dec9032806f22bdf5d2e2602;hb=eabb7b6ad9c1be19f90c9125e79c00eb09a0b68c;hp=f71f75d690054a0facd849de639d7a0ead3b8cbe;hpb=78eb37d0cec0870b70171688cc8a30a433606e71;p=sage.d.git diff --git a/mjo/eja/euclidean_jordan_algebra.py b/mjo/eja/euclidean_jordan_algebra.py index f71f75d..038de61 100644 --- a/mjo/eja/euclidean_jordan_algebra.py +++ b/mjo/eja/euclidean_jordan_algebra.py @@ -80,19 +80,6 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): class Element(FiniteDimensionalAlgebraElement): """ An element of a Euclidean Jordan algebra. - - Since EJAs are commutative, the "right multiplication" matrix is - 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 - """ def __pow__(self, n): @@ -111,8 +98,7 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): EXAMPLES: sage: set_random_seed() - sage: J = eja_ln(5) - sage: x = J.random_element() + sage: x = random_eja().random_element() sage: x.matrix()*x.vector() == (x**2).vector() True @@ -181,23 +167,13 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): 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() + sage: random_eja().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() + sage: random_eja().zero().is_nilpotent() True """ @@ -295,18 +271,14 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): EXAMPLES:: sage: set_random_seed() - sage: n = ZZ.random_element(1,10).abs() - sage: J = eja_rn(n) - sage: x = J.random_element() + sage: x = random_eja().random_element() sage: x.degree() == x.minimal_polynomial().degree() True :: sage: set_random_seed() - sage: n = ZZ.random_element(1,10).abs() - sage: J = eja_ln(n) - sage: x = J.random_element() + sage: x = random_eja().random_element() sage: x.degree() == x.minimal_polynomial().degree() True @@ -371,21 +343,15 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra): 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 = random_eja().random_element() sage: x.subalgebra_generated_by().is_associative() True Squaring in the subalgebra should be the same thing as squaring in the superalgebra:: - sage: J = eja_ln(5) - sage: x = J.random_element() + sage: set_random_seed() + sage: x = random_eja().random_element() sage: u = x.subalgebra_generated_by().random_element() sage: u.matrix()*u.vector() == (u**2).vector() True @@ -640,12 +606,24 @@ def eja_sn(dimension, field=QQ): def mat2vec(m): return vector(field, m.list()) + def vec2mat(v): + return matrix(field, dimension, v.list()) + W = V.span( mat2vec(s) for s in S ) + # Taking the span above reorders our basis (thanks, jerk!) so we + # need to put our "matrix basis" in the same order as the + # (reordered) vector basis. + S = [ vec2mat(b) for b in W.basis() ] + for s in S: - # Brute force the right-multiplication-by-s matrix by looping + # Brute force the multiplication-by-s matrix by looping # through all elements of the basis and doing the computation - # to find out what the corresponding row should be. + # to find out what the corresponding row should be. BEWARE: + # these multiplication tables won't be symmetric! It therefore + # becomes REALLY IMPORTANT that the underlying algebra + # constructor uses ROW vectors and not COLUMN vectors. That's + # why we're computing rows here and not columns. Q_rows = [] for t in S: this_row = mat2vec((s*t + t*s)/2) @@ -654,3 +632,34 @@ def eja_sn(dimension, field=QQ): Qs.append(Q) return FiniteDimensionalEuclideanJordanAlgebra(field,Qs,rank=dimension) + + +def random_eja(): + """ + Return a "random" finite-dimensional Euclidean Jordan Algebra. + + ALGORITHM: + + For now, we choose a random natural number ``n`` (greater than zero) + and then give you back one of the following: + + * The cartesian product of the rational numbers ``n`` times; this is + ``QQ^n`` with the Hadamard product. + + * The Jordan spin algebra on ``QQ^n``. + + * The ``n``-by-``n`` rational symmetric matrices with the symmetric + product. + + Later this might be extended to return Cartesian products of the + EJAs above. + + TESTS:: + + sage: random_eja() + Euclidean Jordan algebra of degree... + + """ + n = ZZ.random_element(1,10).abs() + constructor = choice([eja_rn, eja_ln, eja_sn]) + return constructor(dimension=n, field=QQ)