From: Michael Orlitzky Date: Sat, 23 Nov 2024 02:50:05 +0000 (-0500) Subject: mjo/**/*.py: update table rendering X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=3aece19f8f00034a8d9f5823065485cfe75d44c4;p=sage.d.git mjo/**/*.py: update table rendering Sage's tables are rendered using unicode characters for the borders now. --- diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 85d466d..3c6bb42 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -113,7 +113,7 @@ also Use rational numbers, but only if you either pass 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 @@ -122,18 +122,18 @@ Another option for your basis is to use elemebts of a 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 @@ -1014,17 +1014,17 @@ class EJA(CombinatorialFreeModule): 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() @@ -2372,29 +2372,29 @@ class OctonionHermitianEJA(HermitianMatrixEJA, RationalBasisEJA, ConcreteEJA): ....: 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: @@ -2409,13 +2409,13 @@ class OctonionHermitianEJA(HermitianMatrixEJA, RationalBasisEJA, ConcreteEJA): 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:: @@ -3020,25 +3020,25 @@ class CartesianProductEJA(EJA): 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 @@ -3056,11 +3056,11 @@ class CartesianProductEJA(EJA): [1] [1] sage: J.one().to_matrix()[1] - +---+---+ - | 1 | 0 | - +---+---+ - | 0 | 1 | - +---+---+ + ┌───┬───┐ + │ 1 │ 0 │ + ├───┼───┤ + │ 0 │ 1 │ + └───┴───┘ TESTS: diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index c0e0d09..1ded736 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -1091,13 +1091,13 @@ class EJAElement(IndexedFreeModuleElement): sage: J.one() b0 + b3 + b8 sage: J.one().to_matrix() - +---+---+---+ - | 1 | 0 | 0 | - +---+---+---+ - | 0 | 1 | 0 | - +---+---+---+ - | 0 | 0 | 1 | - +---+---+---+ + ┌───┬───┬───┐ + │ 1 │ 0 │ 0 │ + ├───┼───┼───┤ + │ 0 │ 1 │ 0 │ + ├───┼───┼───┤ + │ 0 │ 0 │ 1 │ + └───┴───┴───┘ :: @@ -1105,11 +1105,11 @@ class EJAElement(IndexedFreeModuleElement): sage: J.one() b0 + b5 sage: J.one().to_matrix() - +---+---+ - | 1 | 0 | - +---+---+ - | 0 | 1 | - +---+---+ + ┌───┬───┐ + │ 1 │ 0 │ + ├───┼───┤ + │ 0 │ 1 │ + └───┴───┘ This also works in Cartesian product algebras:: diff --git a/mjo/hurwitz.py b/mjo/hurwitz.py index 07eace6..4d8aa8c 100644 --- a/mjo/hurwitz.py +++ b/mjo/hurwitz.py @@ -260,25 +260,25 @@ class Octonions(CombinatorialFreeModule): 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() @@ -313,11 +313,11 @@ class HurwitzMatrixAlgebraElement(MatrixAlgebraElement): 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 │ + └──────┴──────────┘ :: @@ -349,11 +349,11 @@ class HurwitzMatrixAlgebraElement(MatrixAlgebraElement): 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) @@ -602,34 +602,34 @@ class OctonionMatrixAlgebra(HurwitzMatrixAlgebra): 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 │ + └─────────────────────┘) :: @@ -637,11 +637,11 @@ class OctonionMatrixAlgebra(HurwitzMatrixAlgebra): 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 │ + └─────────┴─────────┘ :: @@ -705,22 +705,22 @@ class QuaternionMatrixAlgebra(HurwitzMatrixAlgebra): (-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 │ + └───┘) :: @@ -728,11 +728,11 @@ class QuaternionMatrixAlgebra(HurwitzMatrixAlgebra): 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 │ + └───────┴────────┘ :: @@ -822,16 +822,16 @@ class ComplexMatrixAlgebra(HurwitzMatrixAlgebra): 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 │ + └────────────────────┘) :: @@ -839,11 +839,11 @@ class ComplexMatrixAlgebra(HurwitzMatrixAlgebra): 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 │ + └─────────┴──────┘ :: diff --git a/mjo/matrix_algebra.py b/mjo/matrix_algebra.py index 6817af1..d12e7b3 100644 --- a/mjo/matrix_algebra.py +++ b/mjo/matrix_algebra.py @@ -21,11 +21,11 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): 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]] @@ -51,11 +51,11 @@ class MatrixAlgebraElement(IndexedFreeModuleElement): EXAMPLES:: sage: MatrixAlgebra(2,ZZ,ZZ).zero() - +---+---+ - | 0 | 0 | - +---+---+ - | 0 | 0 | - +---+---+ + ┌───┬───┐ + │ 0 │ 0 │ + ├───┼───┤ + │ 0 │ 0 │ + └───┴───┘ TESTS:: @@ -179,16 +179,16 @@ class MatrixAlgebra(CombinatorialFreeModule): 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 @@ -350,11 +350,11 @@ class MatrixAlgebra(CombinatorialFreeModule): -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 @@ -388,11 +388,11 @@ class MatrixAlgebra(CombinatorialFreeModule): 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)