def is_rep(self, image, n, force=False): """ Returns `True` if the map generated by mapping the generators to the matrices defined in `image` is an `n`-dimensional representation of `self`, and `False` otherwise. The entries of `image` must be `n`-by-`n` matrices with entries in the algebraic closure of the base field of `self`. Its length must match the number of generators of `self.` Use `force=True` if the function does not recognize the base field as computable, but the field is computable. """ if (not force and self.base_field() not in NumberFields and self.base_field() not in FiniteFields): raise TypeError('Base field must be computable. If %s is' % self.base_field() + ' computable then use force=True to bypass this.') if n not in ZZ or n < 1: raise ValueError('Dimension must be a positive integer.') M = MatrixSpace(self.base_field().algebraic_closure(), n, sparse=True) if len(image) != self.ngens(): raise ValueError( 'Length of image does not match number of generators.') if False in {mat in M for mat in image}: raise TypeError('Improper image, must contain elements of %s.' % M._repr_()) image = [M(image[i]) for i in range(len(image))] for rel in self.rels(): if self._to_matrix(rel, M, image) != M.zero(): return False return True
def to_matrix(self): r""" Return ``self`` as a matrix. We define a matrix `M_{xy} = \alpha(x, y)` for some element `\alpha \in I_P` in the incidence algebra `I_P` and we order the elements `x,y \in P` by some linear extension of `P`. This defines an algebra (iso)morphism; in particular, multiplication in the incidence algebra goes to matrix multiplication. EXAMPLES:: sage: P = posets.BooleanLattice(2) sage: I = P.incidence_algebra(QQ) sage: I.moebius().to_matrix() [ 1 -1 -1 1] [ 0 1 0 -1] [ 0 0 1 -1] [ 0 0 0 1] sage: I.zeta().to_matrix() [1 1 1 1] [0 1 0 1] [0 0 1 1] [0 0 0 1] TESTS: We check that this is an algebra (iso)morphism:: sage: P = posets.BooleanLattice(4) sage: I = P.incidence_algebra(QQ) sage: mu = I.moebius() sage: (mu*mu).to_matrix() == mu.to_matrix() * mu.to_matrix() True """ P = self.parent() MS = MatrixSpace(P.base_ring(), P._poset.cardinality(), sparse=True) L = P._linear_extension M = copy(MS.zero()) for i, c in self: M[L.index(i[0]), L.index(i[1])] = c M.set_immutable() return M
def __call__(self, A, name=''): r""" Create an element of the homspace ``self`` from `A`. INPUT: - ``A`` -- one of the following: - an element of a Hecke algebra - a Hecke module morphism - a matrix - a list of elements of the codomain specifying the images of the basis elements of the domain. EXAMPLES:: sage: M = ModularForms(Gamma0(7), 4) sage: H = M.Hom(M) sage: H(M.hecke_operator(7)) Hecke module morphism T_7 defined by the matrix [ -7 0 0] [ 0 1 240] [ 0 0 343] Domain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... Codomain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... sage: H(H(M.hecke_operator(7))) Hecke module morphism T_7 defined by the matrix [ -7 0 0] [ 0 1 240] [ 0 0 343] Domain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... Codomain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... sage: H(matrix(QQ, 3, srange(9))) Hecke module morphism defined by the matrix [0 1 2] [3 4 5] [6 7 8] Domain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... Codomain: Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(7) ... TESTS: Make sure that the element is created correctly when the codomain is not the full module (related to :trac:`21497`):: sage: M = ModularSymbols(Gamma0(3),weight=22,sign=1) sage: S = M.cuspidal_subspace() sage: H = S.Hom(S) sage: H(S.gens()) Hecke module morphism defined by the matrix [1 0 0 0 0 0] [0 1 0 0 0 0] [0 0 1 0 0 0] [0 0 0 1 0 0] [0 0 0 0 1 0] [0 0 0 0 0 1] Domain: Modular Symbols subspace of dimension 6 of Modular Symbols space ... Codomain: Modular Symbols subspace of dimension 6 of Modular Symbols space ... sage: H.zero() in H True sage: H.one() in H True """ try: if A.parent() == self: A._set_parent(self) return A A = A.hecke_module_morphism() if A.parent() == self: A._set_parent(self) return A else: raise TypeError("unable to coerce A to self") except AttributeError: pass if A in self.base_ring(): dim_dom = self.domain().rank() dim_codom = self.codomain().rank() MS = MatrixSpace(self.base_ring(), dim_dom, dim_codom) if self.domain() == self.codomain(): A = A * MS.identity_matrix() elif A == 0: A = MS.zero() else: raise ValueError('scalars do not coerce to this homspace') elif isinstance(A, (list, tuple)): A = matrix([self.codomain().coordinate_vector(f) for f in A]) return HeckeModuleMorphism_matrix(self, A, name)