def space(self): r''' Calculates the homology space as a Z-module. ''' verb = get_verbose() set_verbose(0) V = self.coefficient_module() R = V.base_ring() Vdim = V.dimension() G = self.group() gens = G.gens() ambient = R**(Vdim * len(gens)) if self.trivial_action(): cycles = ambient else: # Now find the subspace of cycles A = Matrix(R, Vdim, 0) for g in gens: for v in V.gens(): A = A.augment(matrix(R,Vdim,1,list(vector(g**-1 * v - v)))) K = A.right_kernel_matrix() cycles = ambient.submodule([ambient(list(o)) for o in K.rows()]) boundaries = [] for r in G.get_relation_words(): grad = self.twisted_fox_gradient(G(r).word_rep) for v in V.gens(): boundaries.append(cycles(ambient(sum([list(a * vector(v)) for a in grad],[])))) boundaries = cycles.submodule(boundaries) ans = cycles.quotient(boundaries) set_verbose(verb) return ans
def _compute_q_expansion_basis(self, prec=None): r""" Compute q-expansion basis using Schaeffer's algorithm. EXAMPLES:: sage: CuspForms(GammaH(31, [7]), 1).q_expansion_basis() # indirect doctest [ q - q^2 - q^5 + O(q^6) ] A more elaborate example (two Galois-conjugate characters each giving a 2-dimensional space):: sage: CuspForms(GammaH(124, [85]), 1).q_expansion_basis() [ q - q^4 - q^6 + O(q^7), q^2 + O(q^7), q^3 + O(q^7), q^5 - q^6 + O(q^7) ] """ if prec is None: prec = self.prec() else: prec = Integer(prec) chars=self.group().characters_mod_H(sign=-1, galois_orbits=True) B = [] dim = 0 for c in chars: chi = c.minimize_base_ring() Bchi = [weight1.modular_ratio_to_prec(chi, f, prec) for f in weight1.hecke_stable_subspace(chi) ] if Bchi == []: continue if chi.base_ring() == QQ: B += [f.padded_list(prec) for f in Bchi] dim += len(Bchi) else: d = chi.base_ring().degree() dim += d * len(Bchi) for f in Bchi: w = f.padded_list(prec) for i in range(d): B.append([x[i] for x in w]) basis_mat = Matrix(QQ, B) if basis_mat.is_zero(): return [] # Daft thing: "transformation=True" parameter to echelonize # is ignored for rational matrices! big_mat = basis_mat.augment(identity_matrix(dim)) big_mat.echelonize() c = big_mat.pivots()[-1] echelon_basis_mat = big_mat[:, :prec] R = self._q_expansion_ring() if c >= prec: verbose("Precision %s insufficient to determine basis" % prec, level=1) else: verbose("Minimal precision for basis: %s" % (c+1), level=1) t = big_mat[:, prec:] assert echelon_basis_mat == t * basis_mat self.__transformation_matrix = t self._char_basis = [R(f.list(), c+1) for f in basis_mat.rows()] return [R(f.list(), prec) for f in echelon_basis_mat.rows() if f != 0]