- sage: set_random_seed()
- sage: n = ZZ.random_element(1,5)
- sage: B = RealSymmetricEJA._denormalized_basis(n)
- sage: all( M.is_symmetric() for M in B)
- True
-
- """
- # The basis of symmetric matrices, as matrices, in their R^(n-by-n)
- # coordinates.
- S = []
- for i in range(n):
- for j in range(i+1):
- Eij = matrix(ZZ, n, lambda k,l: k==i and l==j)
- if i == j:
- Sij = Eij
- else:
- Sij = Eij + Eij.transpose()
- S.append(Sij)
- return tuple(S)
-
-
- @staticmethod
- def _max_random_instance_size():
- return 4 # Dimension 10
-
- @classmethod
- def random_instance(cls, **kwargs):
- """
- Return a random instance of this type of algebra.
- """
- n = ZZ.random_element(cls._max_random_instance_size() + 1)
- return cls(n, **kwargs)
-
- def __init__(self, n, **kwargs):
- # We know this is a valid EJA, but will double-check
- # if the user passes check_axioms=True.
- if "check_axioms" not in kwargs: kwargs["check_axioms"] = False
-
- super(RealSymmetricEJA, self).__init__(self._denormalized_basis(n),
- self.jordan_product,
- self.trace_inner_product,
- **kwargs)
-
- # TODO: this could be factored out somehow, but is left here
- # because the MatrixEJA is not presently a subclass of the
- # FDEJA class that defines rank() and one().
- self.rank.set_cache(n)
- idV = matrix.identity(ZZ, self.dimension_over_reals()*n)
- self.one.set_cache(self(idV))
-
-
-
-class ComplexMatrixEJA(MatrixEJA):
- # A manual dictionary-cache for the complex_extension() method,
- # since apparently @classmethods can't also be @cached_methods.
- _complex_extension = {}
-
- @classmethod
- def complex_extension(cls,field):
- r"""
- The complex field that we embed/unembed, as an extension
- of the given ``field``.
- """
- if field in cls._complex_extension:
- return cls._complex_extension[field]
-
- # Sage doesn't know how to adjoin the complex "i" (the root of
- # x^2 + 1) to a field in a general way. Here, we just enumerate
- # all of the cases that I have cared to support so far.
- if field is AA:
- # Sage doesn't know how to embed AA into QQbar, i.e. how
- # to adjoin sqrt(-1) to AA.
- F = QQbar
- elif not field.is_exact():
- # RDF or RR
- F = field.complex_field()
- else:
- # Works for QQ and... maybe some other fields.
- R = PolynomialRing(field, 'z')
- z = R.gen()
- F = field.extension(z**2 + 1, 'I', embedding=CLF(-1).sqrt())
-
- cls._complex_extension[field] = F
- return F
-
- @staticmethod
- def dimension_over_reals():
- return 2
-
- @classmethod
- def real_embed(cls,M):
- """
- Embed the n-by-n complex matrix ``M`` into the space of real
- matrices of size 2n-by-2n via the map the sends each entry `z = a +
- bi` to the block matrix ``[[a,b],[-b,a]]``.
-
- SETUP::
-
- sage: from mjo.eja.eja_algebra import ComplexMatrixEJA