from sage.misc.prandom import choice
from sage.misc.table import table
from sage.modules.free_module import FreeModule, VectorSpace
-from sage.rings.integer_ring import ZZ
-from sage.rings.number_field.number_field import QuadraticField
-from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
-from sage.rings.rational_field import QQ
-from sage.rings.real_lazy import CLF, RLF
-
+from sage.rings.all import (ZZ, QQ, RR, RLF, CLF,
+ PolynomialRing,
+ QuadraticField)
from mjo.eja.eja_element import FiniteDimensionalEuclideanJordanAlgebraElement
from mjo.eja.eja_utils import _mat2vec
rank,
prefix='e',
category=None,
- natural_basis=None):
+ natural_basis=None,
+ check=True):
"""
SETUP::
- sage: from mjo.eja.eja_algebra import random_eja
+ sage: from mjo.eja.eja_algebra import (JordanSpinEJA, random_eja)
EXAMPLES:
sage: x*y == y*x
True
+ TESTS:
+
+ The ``field`` we're given must be real::
+
+ sage: JordanSpinEJA(2,QQbar)
+ Traceback (most recent call last):
+ ...
+ ValueError: field is not real
+
"""
+ if check:
+ if not field.is_subring(RR):
+ # Note: this does return true for the real algebraic
+ # field, and any quadratic field where we've specified
+ # a real embedding.
+ raise ValueError('field is not real')
+
self._rank = rank
self._natural_basis = natural_basis
sage: J = ComplexHermitianEJA(3)
sage: J.is_trivial()
False
- sage: A = J.zero().subalgebra_generated_by()
- sage: A.is_trivial()
- True
"""
return self.dimension() == 0
return self.linear_combination(zip(self.gens(), coeffs))
- def random_element(self):
- # Temporary workaround for https://trac.sagemath.org/ticket/28327
- if self.is_trivial():
- return self.zero()
- else:
- s = super(FiniteDimensionalEuclideanJordanAlgebra, self)
- return s.random_element()
-
def random_elements(self, count):
"""
Return ``count`` random elements as a tuple.
TESTS:
Ensure that every EJA that we know how to construct has a
- positive integer rank::
+ positive integer rank, unless the algebra is trivial in
+ which case its rank will be zero::
sage: set_random_seed()
- sage: r = random_eja().rank()
- sage: r in ZZ and r > 0
+ sage: J = random_eja()
+ sage: r = J.rank()
+ sage: r in ZZ
+ True
+ sage: r > 0 or (r == 0 and J.is_trivial())
True
"""
return x.to_vector().inner_product(y.to_vector())
-def random_eja():
+def random_eja(field=QQ):
"""
Return a "random" finite-dimensional Euclidean Jordan Algebra.
"""
classname = choice(KnownRankEJA.__subclasses__())
- return classname.random_instance()
+ return classname.random_instance(field=field)