def CO_delta(r, p, N, eps): r""" This is used as an intermediate value in computations related to the paper of Cohen-Oesterle. INPUT: - ``r`` - positive integer - ``p`` - a prime - ``N`` - positive integer - ``eps`` - character OUTPUT: element of the base ring of the character EXAMPLES:: sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CO_delta(1,5,7,eps^3) 2 """ if not is_prime(p): raise ValueError, "p must be prime" K = eps.base_ring() if p % 4 == 3: return K(0) if p == 2: if r == 1: return K(1) return K(0) # interesting case: p=1(mod 4). # omega is a primitive 4th root of unity mod p. omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 4) # this n is within a p-power root of a "local" 4th root of 1 modulo p. n = Mod(int(omega.crt(Mod(1, N // (p**r)))), N) n = n**(p**(r - 1)) # this is correct now t = eps(n) if t == K(1): return K(2) if t == K(-1): return K(-2) return K(0)
def CO_nu(r, p, N, eps): r""" This is used as an intermediate value in computations related to the paper of Cohen-Oesterle. INPUT: - ``r`` - positive integer - ``p`` - a prime - ``N`` - positive integer - ``eps`` - character OUTPUT: element of the base ring of the character EXAMPLES:: sage: G.<eps> = DirichletGroup(7) sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CO_nu(1,7,7,eps) -1 """ K = eps.base_ring() if p % 3 == 2: return K(0) if p == 3: if r == 1: return K(1) return K(0) # interesting case: p=1(mod 3) # omega is a cube root of 1 mod p. omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 3) n = Mod(omega.crt(Mod(1, N // (p**r))), N) # within a p-power root of a "local" cube root of 1 mod p. n = n**(p**(r - 1)) # this is right now t = eps(n) if t == K(1): return K(2) return K(-1)
def additive_order(self): """ Return the additive order of this element. EXAMPLES:: sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2]) sage: Q = V/W; Q Finitely generated module V/W over Integer Ring with invariants (4, 12) sage: Q.0.additive_order() 4 sage: Q.1.additive_order() 12 sage: (Q.0+Q.1).additive_order() 12 sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1]) sage: Q = V/W; Q Finitely generated module V/W over Integer Ring with invariants (12, 0) sage: Q.0.additive_order() 12 sage: type(Q.0.additive_order()) <type 'sage.rings.integer.Integer'> sage: Q.1.additive_order() +Infinity """ Q = self.parent() I = Q.invariants() v = self.vector() from sage.rings.all import infinity, Mod, Integer from sage.arith.all import lcm n = Integer(1) for i, a in enumerate(I): if a == 0: if v[i] != 0: return infinity else: n = lcm(n, Mod(v[i],a).additive_order()) return n
def __init__(self, disc, level, reduced = True) : self.__level = level if isinstance(disc, ParamodularFormD2Filter_discriminant) : disc = disc.index() if disc is infinity : self.__disc = disc else : oDmod = (-disc + 1) % (4 * level) Dmod = oDmod while Dmod > 0 : if not Mod(Dmod, 4 * level) : Dmod = Dmod - 1 else : break self.__disc = disc - (oDmod - Dmod) self.__reduced = reduced self.__p1list = P1List(level)
def iter_positive_forms(self) : if self.__disc is infinity : raise ValueError, "infinity is not a true filter index" if self.__reduced : for (l, (u,x)) in enumerate(self.__p1list) : if u == 0 : for a in xrange(self.__level, isqrt(self.__disc // 4) + 1, self.__level) : for b in xrange(a+1) : for c in xrange(a, (b**2 + (self.__disc - 1))//(4*a) + 1) : yield ((a,b,c), l) else : for a in xrange(1, isqrt(self.__disc // 3) + 1) : for b in xrange(a+1) : ## We need x**2 * a + x * b + c % N == 0 h = (-((x**2 + 1) * a + x * b)) % self.__level for c in xrange( a + h, (b**2 + (self.__disc - 1))//(4*a) + 1, self.__level ) : yield ((a,b,c), l) #! if self.__reduced else : maxtrace = floor(self.__disc / Integer(3) + sqrt(self.__disc / Integer(3))) for (l, (u,x)) in enumerate(self.__p1list) : if u == 0 : for a in xrange(self.__level, maxtrace + 1, self.__level) : for c in xrange(1, maxtrace - a + 1) : Bu = isqrt(4*a*c - 1) di = 4*a*c - self.__disc if di >= 0 : Bl = isqrt(di) + 1 else : Bl = 0 for b in xrange(-Bu, -Bl + 1) : yield ((a,b,c), l) for b in xrange(Bl, Bu + 1) : yield ((a,b,c), l) else : for a in xrange(1, maxtrace + 1) : for c in xrange(1, maxtrace - a + 1) : Bu = isqrt(4*a*c - 1) di = 4*a*c - self.__disc if di >= 0 : Bl = isqrt(di) + 1 else : Bl = 0 h = (-x * a - int(Mod(x, self.__level)**-1) * c - Bu) % self.__level \ if x != 0 else \ (-Bu) % self.__level for b in xrange(-Bu + self.__level - h, -Bl + 1, self.__level) : yield ((a,b,c), l) h = (-x * a - int(Mod(x, self.__level)**-1) * c + Bl) % self.__level \ if x !=0 else \ Bl % self.__level for b in xrange(Bl + self.__level - h, Bu + 1, self.__level) : yield ((a,b,c), l) #! else self.__reduced raise StopIteration