sage: x = random_eja().random_element()
sage: m = ZZ.random_element(0,10)
sage: n = ZZ.random_element(0,10)
sage: x = random_eja().random_element()
sage: m = ZZ.random_element(0,10)
sage: n = ZZ.random_element(0,10)
sage: p = PolynomialRing(AA, 't').random_element()
sage: J = random_eja()
sage: x = J.random_element()
sage: p = PolynomialRing(AA, 't').random_element()
sage: J = random_eja()
sage: x = J.random_element()
sage: x = random_eja().random_element()
sage: p = x.characteristic_polynomial()
sage: x.apply_univariate_polynomial(p).is_zero()
sage: x = random_eja().random_element()
sage: p = x.characteristic_polynomial()
sage: x.apply_univariate_polynomial(p).is_zero()
Ensure that we can always compute an inner product, and that
it gives us back a real number::
Ensure that we can always compute an inner product, and that
it gives us back a real number::
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: x.inner_product(y) in RLF
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: x.inner_product(y) in RLF
sage: u,v = random_eja().random_elements(2)
sage: lhs = u.operator_commutes_with(u*v)
sage: rhs = v.operator_commutes_with(u^2)
sage: u,v = random_eja().random_elements(2)
sage: lhs = u.operator_commutes_with(u*v)
sage: rhs = v.operator_commutes_with(u^2)
Test the first polarization identity from my notes, Koecher
Chapter III, or from Baes (2.3)::
Test the first polarization identity from my notes, Koecher
Chapter III, or from Baes (2.3)::
Ensure that the determinant is multiplicative on an associative
subalgebra as in Faraut and Korányi's Proposition II.2.2::
Ensure that the determinant is multiplicative on an associative
subalgebra as in Faraut and Korányi's Proposition II.2.2::
sage: J = random_eja().random_element().subalgebra_generated_by()
sage: x,y = J.random_elements(2)
sage: (x*y).det() == x.det()*y.det()
sage: J = random_eja().random_element().subalgebra_generated_by()
sage: x,y = J.random_elements(2)
sage: (x*y).det() == x.det()*y.det()
sage: X = matrix.random(QQ,3)
sage: X = X + X.T
sage: J1 = RealSymmetricEJA(3)
sage: X = matrix.random(QQ,3)
sage: X = X + X.T
sage: J1 = RealSymmetricEJA(3)
sage: J = JordanSpinEJA.random_instance()
sage: x = J.random_element()
sage: while not x.is_invertible():
sage: J = JordanSpinEJA.random_instance()
sage: x = J.random_element()
sage: while not x.is_invertible():
sage: J = random_eja()
sage: J.one().inverse() == J.one()
True
If an element has an inverse, it acts like one::
sage: J = random_eja()
sage: J.one().inverse() == J.one()
True
If an element has an inverse, it acts like one::
of an element is the inverse of its left-multiplication operator
applied to the algebra's identity, when that inverse exists::
of an element is the inverse of its left-multiplication operator
applied to the algebra's identity, when that inverse exists::
sage: J = random_eja(field=QQ, orthonormalize=False) # long time
sage: x = J.random_element() # long time
sage: while not x.is_invertible(): # long time
sage: J = random_eja(field=QQ, orthonormalize=False) # long time
sage: x = J.random_element() # long time
sage: while not x.is_invertible(): # long time
sage: J = random_eja(field=QQ, orthonormalize=False) # long time
sage: x = J.random_element() # long time
sage: slow = x.is_invertible() # long time
sage: J = random_eja(field=QQ, orthonormalize=False) # long time
sage: x = J.random_element() # long time
sage: slow = x.is_invertible() # long time
sage: J = random_eja()
sage: J.rank() == 1 or not J.one().is_primitive_idempotent()
True
A non-idempotent cannot be a minimal idempotent::
sage: J = random_eja()
sage: J.rank() == 1 or not J.one().is_primitive_idempotent()
True
A non-idempotent cannot be a minimal idempotent::
sage: J = JordanSpinEJA(4)
sage: x = J.random_element()
sage: (not x.is_idempotent()) and x.is_primitive_idempotent()
sage: J = JordanSpinEJA(4)
sage: x = J.random_element()
sage: (not x.is_idempotent()) and x.is_primitive_idempotent()
sage: J = JordanSpinEJA(4)
sage: x = J.random_element()
sage: expected = (x.is_idempotent() and x.trace() == 1)
sage: J = JordanSpinEJA(4)
sage: x = J.random_element()
sage: expected = (x.is_idempotent() and x.trace() == 1)
The zero element should never be regular, unless the parent
algebra has dimension less than or equal to one::
The zero element should never be regular, unless the parent
algebra has dimension less than or equal to one::
In the spin factor algebra (of rank two), all elements that
aren't multiples of the identity are regular::
In the spin factor algebra (of rank two), all elements that
aren't multiples of the identity are regular::
always the same, except in trivial algebras where the minimal
polynomial of the unit/zero element is ``1``::
always the same, except in trivial algebras where the minimal
polynomial of the unit/zero element is ``1``::
identity. We require the dimension of the algebra to be at least
two here so that said elements actually exist::
identity. We require the dimension of the algebra to be at least
two here so that said elements actually exist::
sage: d_max = JordanSpinEJA._max_random_instance_dimension()
sage: n = ZZ.random_element(2, max(2,d_max))
sage: J = JordanSpinEJA(n)
sage: d_max = JordanSpinEJA._max_random_instance_dimension()
sage: n = ZZ.random_element(2, max(2,d_max))
sage: J = JordanSpinEJA(n)
sage: x = random_eja().random_element()
sage: p = x.minimal_polynomial()
sage: x.apply_univariate_polynomial(p)
sage: x = random_eja().random_element()
sage: p = x.minimal_polynomial()
sage: x.apply_univariate_polynomial(p)
The minimal polynomial is invariant under a change of basis,
and in particular, a re-scaling of the basis::
The minimal polynomial is invariant under a change of basis,
and in particular, a re-scaling of the basis::
sage: d_max = RealSymmetricEJA._max_random_instance_dimension()
sage: d = ZZ.random_element(1, d_max)
sage: n = RealSymmetricEJA._max_random_instance_size(d)
sage: d_max = RealSymmetricEJA._max_random_instance_dimension()
sage: d = ZZ.random_element(1, d_max)
sage: n = RealSymmetricEJA._max_random_instance_size(d)
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: x.operator()(y) == x*y
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: x.operator()(y) == x*y
sage: x = JordanSpinEJA.random_instance().random_element()
sage: x_vec = x.to_vector()
sage: Q = matrix.identity(x.base_ring(), 0)
sage: x = JordanSpinEJA.random_instance().random_element()
sage: x_vec = x.to_vector()
sage: Q = matrix.identity(x.base_ring(), 0)
sage: x0 = random_eja().random_element()
sage: A = x0.subalgebra_generated_by()
sage: x,y,z = A.random_elements(3)
sage: x0 = random_eja().random_element()
sage: A = x0.subalgebra_generated_by()
sage: x,y,z = A.random_elements(3)
sage: x = random_eja().random_element()
sage: A = x.subalgebra_generated_by()
sage: A(x^2) == A(x)*A(x)
sage: x = random_eja().random_element()
sage: A = x.subalgebra_generated_by()
sage: A(x^2) == A(x)*A(x)
element... unless the original algebra was trivial, in which
case the subalgebra is trivial too::
element... unless the original algebra was trivial, in which
case the subalgebra is trivial too::
sage: A = random_eja().zero().subalgebra_generated_by()
sage: (A.is_trivial() and A.dimension() == 0) or A.dimension() == 1
True
sage: A = random_eja().zero().subalgebra_generated_by()
sage: (A.is_trivial() and A.dimension() == 0) or A.dimension() == 1
True
where there are non-nilpotent elements, or that we get the dumb
solution in the trivial algebra::
where there are non-nilpotent elements, or that we get the dumb
solution in the trivial algebra::
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: alpha = J.base_ring().random_element()
sage: J = random_eja()
sage: x,y = J.random_elements(2)
sage: alpha = J.base_ring().random_element()