The inner product associated with this Euclidean Jordan algebra.
Will default to the trace inner product if nothing else.
+
+ EXAMPLES:
+
+ The inner product must satisfy its axiom for this algebra to truly
+ be a Euclidean Jordan Algebra::
+
+ sage: set_random_seed()
+ sage: J = random_eja()
+ sage: x = J.random_element()
+ sage: y = J.random_element()
+ sage: z = J.random_element()
+ sage: (x*y).inner_product(z) == y.inner_product(x*z)
+ True
+
"""
if (not x in self) or (not y in self):
raise TypeError("arguments must live in this algebra")
An element of a Euclidean Jordan algebra.
"""
+ def __init__(self, A, elt=None):
+ """
+ EXAMPLES:
+
+ The identity in `S^n` is converted to the identity in the EJA::
+
+ sage: J = RealSymmetricSimpleEJA(3)
+ sage: I = identity_matrix(QQ,3)
+ sage: J(I) == J.one()
+ True
+
+ This skew-symmetric matrix can't be represented in the EJA::
+
+ sage: J = RealSymmetricSimpleEJA(3)
+ sage: A = matrix(QQ,3, lambda i,j: i-j)
+ sage: J(A)
+ Traceback (most recent call last):
+ ...
+ ArithmeticError: vector is not in free module
+
+ """
+ # Goal: if we're given a matrix, and if it lives in our
+ # parent algebra's "natural ambient space," convert it
+ # into an algebra element.
+ #
+ # The catch is, we make a recursive call after converting
+ # the given matrix into a vector that lives in the algebra.
+ # This we need to try the parent class initializer first,
+ # to avoid recursing forever if we're given something that
+ # already fits into the algebra, but also happens to live
+ # in the parent's "natural ambient space" (this happens with
+ # vectors in R^n).
+ try:
+ FiniteDimensionalAlgebraElement.__init__(self, A, elt)
+ except ValueError:
+ natural_basis = A.natural_basis()
+ if elt in natural_basis[0].matrix_space():
+ # Thanks for nothing! Matrix spaces aren't vector
+ # spaces in Sage, so we have to figure out its
+ # natural-basis coordinates ourselves.
+ V = VectorSpace(elt.base_ring(), elt.nrows()**2)
+ W = V.span( _mat2vec(s) for s in natural_basis )
+ coords = W.coordinates(_mat2vec(elt))
+ FiniteDimensionalAlgebraElement.__init__(self, A, coords)
+
def __pow__(self, n):
"""
Return ``self`` raised to the power ``n``.
sage: x2 = F(1 + 2*i)
sage: x3 = F(-i)
sage: x4 = F(6)
- sage: M = matrix(F,2,[x1,x2,x3,x4])
+ sage: M = matrix(F,2,[[x1,x2],[x3,x4]])
sage: _embed_complex_matrix(M)
- [ 4 2| 1 -2]
- [-2 4| 2 1]
+ [ 4 -2| 1 2]
+ [ 2 4|-2 1]
[-----+-----]
- [ 0 1| 6 0]
- [-1 0| 0 6]
+ [ 0 -1| 6 0]
+ [ 1 0| 0 6]
"""
n = M.nrows()
for z in M.list():
a = z.real()
b = z.imag()
- blocks.append(matrix(field, 2, [[a,-b],[b,a]]))
+ blocks.append(matrix(field, 2, [[a,b],[-b,a]]))
# We can drop the imaginaries here.
return block_matrix(field.base_ring(), n, blocks)
....: [ 9, 10, 11, 12],
....: [-10, 9, -12, 11] ])
sage: _unembed_complex_matrix(A)
- [ -2*i + 1 -4*i + 3]
- [ -10*i + 9 -12*i + 11]
+ [ 2*i + 1 4*i + 3]
+ [ 10*i + 9 12*i + 11]
+
+ TESTS::
+
+ sage: set_random_seed()
+ sage: F = QuadraticField(-1, 'i')
+ sage: M = random_matrix(F, 3)
+ sage: _unembed_complex_matrix(_embed_complex_matrix(M)) == M
+ True
+
"""
n = ZZ(M.nrows())
if M.ncols() != n:
raise ValueError('bad real submatrix')
if submat[0,1] != -submat[1,0]:
raise ValueError('bad imag submatrix')
- z = submat[0,0] + submat[1,0]*i
+ z = submat[0,0] + submat[0,1]*i
elements.append(z)
return matrix(F, n/2, elements)