def eisen(p): """ Return the Eisenstein number `n` which is the numerator of `(p-1)/12`. INPUT: - ``p`` -- a prime OUTPUT: Integer EXAMPLES:: sage: [(p, sage.modular.dims.eisen(p)) for p in prime_range(24)] [(2, 1), (3, 1), (5, 1), (7, 1), (11, 5), (13, 1), (17, 4), (19, 3), (23, 11)] """ if not is_prime(p): raise ValueError("p must be prime") return frac(p - 1, 12).numerator()
def eisen(p): """ Return the Eisenstein number `n` which is the numerator of `(p-1)/12`. INPUT: - ``p`` - a prime OUTPUT: Integer EXAMPLES:: sage: [(p,sage.modular.dims.eisen(p)) for p in prime_range(24)] [(2, 1), (3, 1), (5, 1), (7, 1), (11, 5), (13, 1), (17, 4), (19, 3), (23, 11)] """ if not is_prime(p): raise ValueError, "p must be prime" return frac(p-1,12).numerator()
def CohenOesterle(eps, k): r""" Compute the Cohen-Oesterle function associate to eps, `k`. This is a summand in the formula for the dimension of the space of cusp forms of weight `2` with character `\varepsilon`. INPUT: - ``eps`` - Dirichlet character - ``k`` - integer OUTPUT: element of the base ring of eps. EXAMPLES:: sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CohenOesterle(eps, 2) -2/3 sage: sage.modular.dims.CohenOesterle(eps, 4) -1 """ N = eps.modulus() facN = factor(N) f = eps.conductor() gamma_k = 0 if k%4==2: gamma_k = frac(-1,4) elif k%4==0: gamma_k = frac(1,4) mu_k = 0 if k%3==2: mu_k = frac(-1,3) elif k%3==0: mu_k = frac(1,3) def _lambda(r,s,p): """ Used internally by the CohenOesterle function. INPUT: - ``r, s, p`` - integers OUTPUT: Integer EXAMPLES: (indirect doctest) :: sage: K = CyclotomicField(3) sage: eps = DirichletGroup(7*43,K).0^2 sage: sage.modular.dims.CohenOesterle(eps,2) -4/3 """ if 2*s<=r: if r%2==0: return p**(r//2) + p**((r//2)-1) return 2*p**((r-1)//2) return 2*(p**(r-s)) #end def of lambda K = eps.base_ring() return K(frac(-1,2) * mul([_lambda(r,valuation(f,p),p) for p, r in facN]) + \ gamma_k * mul([CO_delta(r,p,N,eps) for p, r in facN]) + \ mu_k * mul([CO_nu(r,p,N,eps) for p, r in facN]))
def CohenOesterle(eps, k): r""" Compute the Cohen-Oesterle function associate to eps, `k`. This is a summand in the formula for the dimension of the space of cusp forms of weight `2` with character `\varepsilon`. INPUT: - ``eps`` - Dirichlet character - ``k`` - integer OUTPUT: element of the base ring of eps. EXAMPLES:: sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CohenOesterle(eps, 2) -2/3 sage: sage.modular.dims.CohenOesterle(eps, 4) -1 """ N = eps.modulus() facN = factor(N) f = eps.conductor() gamma_k = 0 if k % 4 == 2: gamma_k = frac(-1, 4) elif k % 4 == 0: gamma_k = frac(1, 4) mu_k = 0 if k % 3 == 2: mu_k = frac(-1, 3) elif k % 3 == 0: mu_k = frac(1, 3) def _lambda(r, s, p): """ Used internally by the CohenOesterle function. INPUT: - ``r, s, p`` - integers OUTPUT: Integer EXAMPLES: (indirect doctest) :: sage: K = CyclotomicField(3) sage: eps = DirichletGroup(7*43,K).0^2 sage: sage.modular.dims.CohenOesterle(eps,2) -4/3 """ if 2 * s <= r: if r % 2 == 0: return p**(r // 2) + p**((r // 2) - 1) return 2 * p**((r - 1) // 2) return 2 * (p**(r - s)) #end def of lambda K = eps.base_ring() return K(frac(-1,2) * mul([_lambda(r,valuation(f,p),p) for p, r in facN]) + \ gamma_k * mul([CO_delta(r,p,N,eps) for p, r in facN]) + \ mu_k * mul([CO_nu(r,p,N,eps) for p, r in facN]))