""" Euclidean Jordan Algebras. These are formally-real Jordan Algebras; specifically those where u^2 + v^2 = 0 implies that u = v = 0. They are used in optimization, and have some additional nice methods beyond what can be supported in a general Jordan Algebra. """ from sage.all import * def eja_rn(dimension, field=QQ): """ Return the Euclidean Jordan Algebra corresponding to the set `R^n` under the Hadamard product. EXAMPLES: This multiplication table can be verified by hand:: sage: J = eja_rn(3) sage: e0,e1,e2 = J.gens() sage: e0*e0 e0 sage: e0*e1 0 sage: e0*e2 0 sage: e1*e1 e1 sage: e1*e2 0 sage: e2*e2 e2 """ # The FiniteDimensionalAlgebra constructor takes a list of # matrices, the ith representing right multiplication by the ith # basis element in the vector space. So if e_1 = (1,0,0), then # right (Hadamard) multiplication of x by e_1 picks out the first # component of x; and likewise for the ith basis element e_i. Qs = [ matrix(field, dimension, dimension, lambda k,j: 1*(k == j == i)) for i in xrange(dimension) ] A = FiniteDimensionalAlgebra(QQ,Qs,assume_associative=True) return JordanAlgebra(A)