def get_cocycle_from_elliptic_curve(self,E,sign = 1,use_magma = True): if sign == 0: return self.get_cocycle_from_elliptic_curve(E,1,use_magma) + self.get_cocycle_from_elliptic_curve(E,-1,use_magma) if not sign in [1, -1]: raise NotImplementedError F = self.group().base_ring() if F.signature()[1] == 0 or (F.signature() == (0,1) and 'G' not in self.group()._grouptype): K = (self.hecke_matrix(oo).transpose()-sign).kernel().change_ring(QQ) else: K = Matrix(QQ,self.dimension(),self.dimension(),0).kernel() disc = self.S_arithgroup().Gpn._O_discriminant discnorm = disc.norm() try: N = ZZ(discnorm.gen()) except AttributeError: N = ZZ(discnorm) if F == QQ: x = QQ['x'].gen() F = NumberField(x,names='a') E = E.change_ring(F) def getap(q): if F == QQ: return E.ap(q) else: Q = F.ideal(q).factor()[0][0] return ZZ(Q.norm() + 1 - E.reduction(Q).count_points()) q = ZZ(1) g0 = None while K.dimension() > 1: q = q.next_prime() for qq,e in F.ideal(q).factor(): if ZZ(qq.norm()).is_prime() and not qq.divides(F.ideal(disc.gens_reduced()[0])): try: ap = getap(qq) except (ValueError,ArithmeticError): continue try: K1 = (self.hecke_matrix(qq.gens_reduced()[0],g0 = g0,use_magma = use_magma).transpose()-ap).kernel() except RuntimeError: continue K = K.intersection(K1) if K.dimension() != 1: raise ValueError,'Did not obtain a one-dimensional space corresponding to E' col = [ZZ(o) for o in (K.denominator()*K.matrix()).list()] return sum([a * self.gen(i) for i,a in enumerate(col) if a != 0],self(0))
def get_rational_cocycle_from_ap(self,getap,sign = 1,use_magma = True): F = self.group().base_ring() if F.signature()[1] == 0 or (F.signature() == (0,1) and 'G' not in self.group()._grouptype): K = (self.hecke_matrix(oo).transpose()-sign).kernel().change_ring(QQ) else: K = Matrix(QQ,self.dimension(),self.dimension(),0).kernel() disc = self.S_arithgroup().Gpn._O_discriminant discnorm = disc.norm() try: N = ZZ(discnorm.gen()) except AttributeError: N = ZZ(discnorm) if F == QQ: x = QQ['x'].gen() F = NumberField(x,names='a') q = ZZ(1) g0 = None while K.dimension() > 1: q = q.next_prime() for qq,e in F.ideal(q).factor(): if ZZ(qq.norm()).is_prime() and not qq.divides(F.ideal(disc.gens_reduced()[0])): try: ap = getap(qq) except (ValueError,ArithmeticError): continue try: K1 = (self.hecke_matrix(qq.gens_reduced()[0],g0 = g0,use_magma = use_magma).transpose()-ap).kernel() except RuntimeError: continue K = K.intersection(K1) if K.dimension() != 1: raise ValueError,'Group does not have the required system of eigenvalues' col = [ZZ(o) for o in (K.denominator()*K.matrix()).list()] return sum([ a * self.gen(i) for i,a in enumerate(col) if a != 0], self(0))