def __init__(self,
field,
mult_table,
- rank,
prefix='e',
category=None,
natural_basis=None,
# a real embedding.
raise ValueError('field is not real')
- self._rank = rank
self._natural_basis = natural_basis
if category is None:
SETUP::
- sage: from mjo.eja.eja_algebra import (JordanSpinEJA,
+ sage: from mjo.eja.eja_algebra import (HadamardEJA,
+ ....: JordanSpinEJA,
....: RealSymmetricEJA,
....: ComplexHermitianEJA,
....: QuaternionHermitianEJA,
for i in range(n) ]
fdeja = super(HadamardEJA, self)
- return fdeja.__init__(field, mult_table, rank=n, **kwargs)
+ fdeja.__init__(field, mult_table, **kwargs)
+ self.rank.set_cache(n)
def inner_product(self, x, y):
"""
# field can have dimension 4 (quaternions) too.
return 2
- def __init__(self, field, basis, rank, normalize_basis=True, **kwargs):
+ def __init__(self, field, basis, normalize_basis=True, **kwargs):
"""
Compared to the superclass constructor, we take a basis instead of
a multiplication table because the latter can be computed in terms
# time to ensure that it isn't a generator expression.
basis = tuple(basis)
- if rank > 1 and normalize_basis:
+ if len(basis) > 1 and normalize_basis:
# We'll need sqrt(2) to normalize the basis, and this
# winds up in the multiplication table, so the whole
# algebra needs to be over the field extension.
Qs = self.multiplication_table_from_matrix_basis(basis)
fdeja = super(MatrixEuclideanJordanAlgebra, self)
- return fdeja.__init__(field,
- Qs,
- rank=rank,
- natural_basis=basis,
- **kwargs)
+ fdeja.__init__(field, Qs, natural_basis=basis, **kwargs)
+ return
- def _rank_computation(self):
+ @cached_method
+ def rank(self):
r"""
Override the parent method with something that tries to compute
over a faster (non-extension) field.
if self._basis_normalizers is None:
# We didn't normalize, so assume that the basis we started
# with had entries in a nice field.
- return super(MatrixEuclideanJordanAlgebra, self)._rank_computation()
+ return super(MatrixEuclideanJordanAlgebra, self).rank()
else:
basis = ( (b/n) for (b,n) in zip(self.natural_basis(),
self._basis_normalizers) )
# integers.
J = MatrixEuclideanJordanAlgebra(QQ,
basis,
- self.rank(),
normalize_basis=False)
- return J._rank_computation()
+ return J.rank()
@cached_method
def _charpoly_coeff(self, i):
# Do this over the rationals and convert back at the end.
J = MatrixEuclideanJordanAlgebra(QQ,
basis,
- self.rank(),
normalize_basis=False)
(_,x,_,_) = J._charpoly_matrix_system()
p = J._charpoly_coeff(i)
def __init__(self, n, field=AA, **kwargs):
basis = self._denormalized_basis(n, field)
- super(RealSymmetricEJA, self).__init__(field, basis, n, **kwargs)
+ super(RealSymmetricEJA, self).__init__(field, basis, **kwargs)
+ self.rank.set_cache(n)
class ComplexMatrixEuclideanJordanAlgebra(MatrixEuclideanJordanAlgebra):
def __init__(self, n, field=AA, **kwargs):
basis = self._denormalized_basis(n,field)
- super(ComplexHermitianEJA,self).__init__(field, basis, n, **kwargs)
+ super(ComplexHermitianEJA,self).__init__(field, basis, **kwargs)
+ self.rank.set_cache(n)
class QuaternionMatrixEuclideanJordanAlgebra(MatrixEuclideanJordanAlgebra):
def __init__(self, n, field=AA, **kwargs):
basis = self._denormalized_basis(n,field)
- super(QuaternionHermitianEJA,self).__init__(field, basis, n, **kwargs)
+ super(QuaternionHermitianEJA,self).__init__(field, basis, **kwargs)
+ self.rank.set_cache(n)
class BilinearFormEJA(FiniteDimensionalEuclideanJordanAlgebra, KnownRankEJA):
# one-dimensional ambient space (because the rank is bounded
# by the ambient dimension).
fdeja = super(BilinearFormEJA, self)
- return fdeja.__init__(field, mult_table, rank=min(n,2), **kwargs)
+ fdeja.__init__(field, mult_table, **kwargs)
+ self.rank.set_cache(min(n,2))
def inner_product(self, x, y):
r"""
fdeja = super(TrivialEJA, self)
# The rank is zero using my definition, namely the dimension of the
# largest subalgebra generated by any element.
- return fdeja.__init__(field, mult_table, rank=0, **kwargs)
+ fdeja.__init__(field, mult_table, **kwargs)
+ self.rank.set_cache(0)