won't stray beyond the rational numbers. The example above would
have worked only because ``sqrt(16) == 4`` is rational.
-Another option for your basis is to use elemebts of a
+Another option for your basis is to use elements of a
:class:`MatrixAlgebra`::
sage: from mjo.matrix_algebra import MatrixAlgebra
sage: J4
Euclidean Jordan algebra of dimension 1 over Algebraic Real Field
sage: J4.basis()[0].to_matrix()
- +---+
- | 1 |
- +---+
+ ┌───┐
+ │ 1 │
+ └───┘
An easier way to view the entire EJA basis in its original (but
perhaps orthonormalized) matrix form is to use the ``matrix_basis``
method::
sage: J4.matrix_basis()
- (+---+
- | 1 |
- +---+,)
+ (┌───┐
+ │ 1 │
+ └───┘,)
In particular, a :class:`MatrixAlgebra` is needed to work around the
fact that matrices in SageMath must have entries in the same
sage: J = JordanSpinEJA(4)
sage: J.multiplication_table()
- +----++----+----+----+----+
- | * || b0 | b1 | b2 | b3 |
- +====++====+====+====+====+
- | b0 || b0 | b1 | b2 | b3 |
- +----++----+----+----+----+
- | b1 || b1 | b0 | 0 | 0 |
- +----++----+----+----+----+
- | b2 || b2 | 0 | b0 | 0 |
- +----++----+----+----+----+
- | b3 || b3 | 0 | 0 | b0 |
- +----++----+----+----+----+
+ ┌────╥────┬────┬────┬────┐
+ │ * ║ b0 │ b1 │ b2 │ b3 │
+ ╞════╫════╪════╪════╪════╡
+ │ b0 ║ b0 │ b1 │ b2 │ b3 │
+ ├────╫────┼────┼────┼────┤
+ │ b1 ║ b1 │ b0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┤
+ │ b2 ║ b2 │ 0 │ b0 │ 0 │
+ ├────╫────┼────┼────┼────┤
+ │ b3 ║ b3 │ 0 │ 0 │ b0 │
+ └────╨────┴────┴────┴────┘
"""
n = self.dimension()
....: field=QQ,
....: orthonormalize=False)
sage: J.multiplication_table()
- +----++----+----+----+----+----+----+----+----+----+----+
- | * || b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 | b9 |
- +====++====+====+====+====+====+====+====+====+====+====+
- | b0 || b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 | b9 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b1 || b1 | b0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b2 || b2 | 0 | b0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b3 || b3 | 0 | 0 | b0 | 0 | 0 | 0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b4 || b4 | 0 | 0 | 0 | b0 | 0 | 0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b5 || b5 | 0 | 0 | 0 | 0 | b0 | 0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b6 || b6 | 0 | 0 | 0 | 0 | 0 | b0 | 0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b7 || b7 | 0 | 0 | 0 | 0 | 0 | 0 | b0 | 0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b8 || b8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | b0 | 0 |
- +----++----+----+----+----+----+----+----+----+----+----+
- | b9 || b9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | b0 |
- +----++----+----+----+----+----+----+----+----+----+----+
+ ┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+ │ * ║ b0 │ b1 │ b2 │ b3 │ b4 │ b5 │ b6 │ b7 │ b8 │ b9 │
+ ╞════╫════╪════╪════╪════╪════╪════╪════╪════╪════╪════╡
+ │ b0 ║ b0 │ b1 │ b2 │ b3 │ b4 │ b5 │ b6 │ b7 │ b8 │ b9 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b1 ║ b1 │ b0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b2 ║ b2 │ 0 │ b0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b3 ║ b3 │ 0 │ 0 │ b0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b4 ║ b4 │ 0 │ 0 │ 0 │ b0 │ 0 │ 0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b5 ║ b5 │ 0 │ 0 │ 0 │ 0 │ b0 │ 0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b6 ║ b6 │ 0 │ 0 │ 0 │ 0 │ 0 │ b0 │ 0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b7 ║ b7 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ b0 │ 0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b8 ║ b8 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ b0 │ 0 │
+ ├────╫────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ │ b9 ║ b9 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ b0 │
+ └────╨────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
TESTS:
sage: J.one()
b0 + b9 + b26
sage: J.one().to_matrix()
- +----+----+----+
- | e0 | 0 | 0 |
- +----+----+----+
- | 0 | e0 | 0 |
- +----+----+----+
- | 0 | 0 | e0 |
- +----+----+----+
+ ┌────┬────┬────┐
+ │ e0 │ 0 │ 0 │
+ ├────┼────┼────┤
+ │ 0 │ e0 │ 0 │
+ ├────┼────┼────┤
+ │ 0 │ 0 │ e0 │
+ └────┴────┴────┘
The 2-by-2 algebra is isomorphic to the ten-dimensional Jordan
spin algebra, but just to be sure, we recompute its rank::
sage: J3 = JordanSpinEJA(1)
sage: J = cartesian_product([J1,cartesian_product([J2,J3])])
sage: J.multiplication_table()
- +----++----+----+----+
- | * || b0 | b1 | b2 |
- +====++====+====+====+
- | b0 || b0 | 0 | 0 |
- +----++----+----+----+
- | b1 || 0 | b1 | 0 |
- +----++----+----+----+
- | b2 || 0 | 0 | b2 |
- +----++----+----+----+
+ ┌────╥────┬────┬────┐
+ │ * ║ b0 │ b1 │ b2 │
+ ╞════╫════╪════╪════╡
+ │ b0 ║ b0 │ 0 │ 0 │
+ ├────╫────┼────┼────┤
+ │ b1 ║ 0 │ b1 │ 0 │
+ ├────╫────┼────┼────┤
+ │ b2 ║ 0 │ 0 │ b2 │
+ └────╨────┴────┴────┘
sage: HadamardEJA(3).multiplication_table()
- +----++----+----+----+
- | * || b0 | b1 | b2 |
- +====++====+====+====+
- | b0 || b0 | 0 | 0 |
- +----++----+----+----+
- | b1 || 0 | b1 | 0 |
- +----++----+----+----+
- | b2 || 0 | 0 | b2 |
- +----++----+----+----+
+ ┌────╥────┬────┬────┐
+ │ * ║ b0 │ b1 │ b2 │
+ ╞════╫════╪════╪════╡
+ │ b0 ║ b0 │ 0 │ 0 │
+ ├────╫────┼────┼────┤
+ │ b1 ║ 0 │ b1 │ 0 │
+ ├────╫────┼────┼────┤
+ │ b2 ║ 0 │ 0 │ b2 │
+ └────╨────┴────┴────┘
The "matrix space" of a Cartesian product always consists of
ordered pairs (or triples, or...) whose components are the
[1]
[1]
sage: J.one().to_matrix()[1]
- +---+---+
- | 1 | 0 |
- +---+---+
- | 0 | 1 |
- +---+---+
+ ┌───┬───┐
+ │ 1 │ 0 │
+ ├───┼───┤
+ │ 0 │ 1 │
+ └───┴───┘
TESTS:
The multiplication table is what Wikipedia says it is::
sage: Octonions().multiplication_table()
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | * || e0 | e1 | e2 | e3 | e4 | e5 | e6 | e7 |
- +====++====+=====+=====+=====+=====+=====+=====+=====+
- | e0 || e0 | e1 | e2 | e3 | e4 | e5 | e6 | e7 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e1 || e1 | -e0 | e3 | -e2 | e5 | -e4 | -e7 | e6 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e2 || e2 | -e3 | -e0 | e1 | e6 | e7 | -e4 | -e5 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e3 || e3 | e2 | -e1 | -e0 | e7 | -e6 | e5 | -e4 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e4 || e4 | -e5 | -e6 | -e7 | -e0 | e1 | e2 | e3 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e5 || e5 | e4 | -e7 | e6 | -e1 | -e0 | -e3 | e2 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e6 || e6 | e7 | e4 | -e5 | -e2 | e3 | -e0 | -e1 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
- | e7 || e7 | -e6 | e5 | e4 | -e3 | -e2 | e1 | -e0 |
- +----++----+-----+-----+-----+-----+-----+-----+-----+
+ ┌────╥────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
+ │ * ║ e0 │ e1 │ e2 │ e3 │ e4 │ e5 │ e6 │ e7 │
+ ╞════╫════╪═════╪═════╪═════╪═════╪═════╪═════╪═════╡
+ │ e0 ║ e0 │ e1 │ e2 │ e3 │ e4 │ e5 │ e6 │ e7 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e1 ║ e1 │ -e0 │ e3 │ -e2 │ e5 │ -e4 │ -e7 │ e6 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e2 ║ e2 │ -e3 │ -e0 │ e1 │ e6 │ e7 │ -e4 │ -e5 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e3 ║ e3 │ e2 │ -e1 │ -e0 │ e7 │ -e6 │ e5 │ -e4 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e4 ║ e4 │ -e5 │ -e6 │ -e7 │ -e0 │ e1 │ e2 │ e3 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e5 ║ e5 │ e4 │ -e7 │ e6 │ -e1 │ -e0 │ -e3 │ e2 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e6 ║ e6 │ e7 │ e4 │ -e5 │ -e2 │ e3 │ -e0 │ -e1 │
+ ├────╫────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ │ e7 ║ e7 │ -e6 │ e5 │ e4 │ -e3 │ -e2 │ e1 │ -e0 │
+ └────╨────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
"""
n = self.dimension()
sage: M = A([ [ I, 1 + 2*I],
....: [ 3*I, 4*I] ])
sage: M.conjugate()
- +------+----------+
- | -I | -2*I + 1 |
- +------+----------+
- | -3*I | -4*I |
- +------+----------+
+ ┌──────┬──────────┐
+ │ -I │ -2*I + 1 │
+ ├──────┼──────────┤
+ │ -3*I │ -4*I │
+ └──────┴──────────┘
::
sage: M = A([ [ I, 2*I],
....: [ 3*I, 4*I] ])
sage: M.conjugate_transpose()
- +------+------+
- | -I | -3*I |
- +------+------+
- | -2*I | -4*I |
- +------+------+
+ ┌──────┬──────┐
+ │ -I │ -3*I │
+ ├──────┼──────┤
+ │ -2*I │ -4*I │
+ └──────┴──────┘
sage: M.conjugate_transpose().to_vector()
(0, -1, 0, -3, 0, -2, 0, -4)
base ring Real Field with 53 bits of precision over the scalar
ring Algebraic Real Field
sage: A.one()
- +---------------------+
- | 1.00000000000000*e0 |
- +---------------------+
+ ┌─────────────────────┐
+ │ 1.00000000000000*e0 │
+ └─────────────────────┘
sage: A.gens()
- (+---------------------+
- | 1.00000000000000*e0 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e1 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e2 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e3 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e4 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e5 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e6 |
- +---------------------+,
- +---------------------+
- | 1.00000000000000*e7 |
- +---------------------+)
+ (┌─────────────────────┐
+ │ 1.00000000000000*e0 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e1 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e2 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e3 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e4 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e5 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e6 │
+ └─────────────────────┘,
+ ┌─────────────────────┐
+ │ 1.00000000000000*e7 │
+ └─────────────────────┘)
::
sage: e0,e1,e2,e3,e4,e5,e6,e7 = A.entry_algebra().gens()
sage: A([ [e0+e4, e1+e5],
....: [e2-e6, e3-e7] ])
- +---------+---------+
- | e0 + e4 | e1 + e5 |
- +---------+---------+
- | e2 - e6 | e3 - e7 |
- +---------+---------+
+ ┌─────────┬─────────┐
+ │ e0 + e4 │ e1 + e5 │
+ ├─────────┼─────────┤
+ │ e2 - e6 │ e3 - e7 │
+ └─────────┴─────────┘
::
(-1.0, -1.0) with base ring Real Double Field over the scalar
ring Algebraic Real Field
sage: A.one()
- +-----+
- | 1.0 |
- +-----+
+ ┌─────┐
+ │ 1.0 │
+ └─────┘
sage: A.gens()
- (+-----+
- | 1.0 |
- +-----+,
- +---+
- | i |
- +---+,
- +---+
- | j |
- +---+,
- +---+
- | k |
- +---+)
+ (┌─────┐
+ │ 1.0 │
+ └─────┘,
+ ┌───┐
+ │ i │
+ └───┘,
+ ┌───┐
+ │ j │
+ └───┘,
+ ┌───┐
+ │ k │
+ └───┘)
::
sage: i,j,k = A.entry_algebra().gens()
sage: A([ [1+i, j-2],
....: [k, k+j] ])
- +-------+--------+
- | 1 + i | -2 + j |
- +-------+--------+
- | k | j + k |
- +-------+--------+
+ ┌───────┬────────┐
+ │ 1 + i │ -2 + j │
+ ├───────┼────────┤
+ │ k │ j + k │
+ └───────┴────────┘
::
Module of 1 by 1 matrices with entries in Complex Field with
53 bits of precision over the scalar ring Algebraic Real Field
sage: A.one()
- +------------------+
- | 1.00000000000000 |
- +------------------+
+ ┌──────────────────┐
+ │ 1.00000000000000 │
+ └──────────────────┘
sage: A.gens()
- (+------------------+
- | 1.00000000000000 |
- +------------------+,
- +--------------------+
- | 1.00000000000000*I |
- +--------------------+)
+ (┌──────────────────┐
+ │ 1.00000000000000 │
+ └──────────────────┘,
+ ┌────────────────────┐
+ │ 1.00000000000000*I │
+ └────────────────────┘)
::
sage: (I,) = A.entry_algebra().gens()
sage: A([ [1+I, 1],
....: [-1, -I] ])
- +---------+------+
- | 1 + 1*I | 1 |
- +---------+------+
- | -1 | -1*I |
- +---------+------+
+ ┌─────────┬──────┐
+ │ 1 + 1*I │ 1 │
+ ├─────────┼──────┤
+ │ -1 │ -1*I │
+ └─────────┴──────┘
::
sage: M = MatrixAlgebra(2, QQbar,RDF)
sage: A = M.monomial((0,0,1)) + 4*M.monomial((0,1,1))
sage: A
- +-----+-----+
- | 1.0 | 4.0 |
- +-----+-----+
- | 0 | 0 |
- +-----+-----+
+ ┌─────┬─────┐
+ │ 1.0 │ 4.0 │
+ ├─────┼─────┤
+ │ 0 │ 0 │
+ └─────┴─────┘
sage: A.rows()
[[1.0, 4.0], [0, 0]]
EXAMPLES::
sage: MatrixAlgebra(2,ZZ,ZZ).zero()
- +---+---+
- | 0 | 0 |
- +---+---+
- | 0 | 0 |
- +---+---+
+ ┌───┬───┐
+ │ 0 │ 0 │
+ ├───┼───┤
+ │ 0 │ 0 │
+ └───┴───┘
TESTS::
sage: from mjo.matrix_algebra import MatrixAlgebra
- EXAMPLES::
+ EXAMPLES:
The existence of a unit element is determined dynamically::
sage: MatrixAlgebra(2,ZZ,ZZ).one()
- +---+---+
- | 1 | 0 |
- +---+---+
- | 0 | 1 |
- +---+---+
+ ┌───┬───┐
+ │ 1 │ 0 │
+ ├───┼───┤
+ │ 0 │ 1 │
+ └───┴───┘
"""
Element = MatrixAlgebraElement
-e3
sage: A = MatrixAlgebra(2,O,QQ)
sage: A.product_on_basis( (0,0,e[2]), (0,0,e[1]) )
- +-----+---+
- | -e3 | 0 |
- +-----+---+
- | 0 | 0 |
- +-----+---+
+ ┌─────┬───┐
+ │ -e3 │ 0 │
+ ├─────┼───┤
+ │ 0 │ 0 │
+ └─────┴───┘
"""
(i,j,e1) = mon1
sage: A = ComplexMatrixAlgebra(2, QQbar, ZZ)
sage: M = A.from_list([[0,I],[-I,0]])
sage: M
- +----+---+
- | 0 | I |
- +----+---+
- | -I | 0 |
- +----+---+
+ ┌────┬───┐
+ │ 0 │ I │
+ ├────┼───┤
+ │ -I │ 0 │
+ └────┴───┘
sage: M.to_vector()
(0, 0, 0, 1, 0, -1, 0, 0)