def ap(self, p): """ Return a list of the eigenvalues of the Hecke operator `T_p` on all the computed eigenforms. The eigenvalues match up between one prime and the next. INPUT: - ``p`` - integer, a prime number OUTPUT: - ``list`` - a list of double precision complex numbers EXAMPLES:: sage: n = numerical_eigenforms(11,4) sage: n.ap(2) # random order [9.0, 9.0, 2.73205080757, -0.732050807569] sage: n.ap(3) # random order [28.0, 28.0, -7.92820323028, 5.92820323028] sage: m = n.modular_symbols() sage: x = polygen(QQ, 'x') sage: m.T(2).charpoly('x').factor() (x - 9)^2 * (x^2 - 2*x - 2) sage: m.T(3).charpoly('x').factor() (x - 28)^2 * (x^2 + 2*x - 47) """ p = Integer(p) if not p.is_prime(): raise ValueError("p must be a prime") return Sequence(self.eigenvalues([p])[0], immutable=True)
def __init__(self, abvar, p): """ Create a `p`-adic `L`-series. EXAMPLES:: sage: J0(37)[0].padic_lseries(389) 389-adic L-series attached to Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37) """ Lseries.__init__(self, abvar) p = Integer(p) if not p.is_prime(): raise ValueError("p (=%s) must be prime"%p) self.__p = p
def __init__(self, abvar, p): """ Create a `p`-adic `L`-series. EXAMPLES:: sage: J0(37)[0].padic_lseries(389) 389-adic L-series attached to Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37) """ Lseries.__init__(self, abvar) p = Integer(p) if not p.is_prime(): raise ValueError("p (=%s) must be prime" % p) self.__p = p
def ap(self, p): """ Return a list of the eigenvalues of the Hecke operator `T_p` on all the computed eigenforms. The eigenvalues match up between one prime and the next. INPUT: - ``p`` - integer, a prime number OUTPUT: - ``list`` - a list of double precision complex numbers EXAMPLES:: sage: n = numerical_eigenforms(11,4) sage: n.ap(2) # random order [9.0, 9.0, 2.73205080757, -0.732050807569] sage: n.ap(3) # random order [28.0, 28.0, -7.92820323028, 5.92820323028] sage: m = n.modular_symbols() sage: x = polygen(QQ, 'x') sage: m.T(2).charpoly('x').factor() (x - 9)^2 * (x^2 - 2*x - 2) sage: m.T(3).charpoly('x').factor() (x - 28)^2 * (x^2 + 2*x - 47) """ p = Integer(p) if not p.is_prime(): raise ValueError("p must be a prime") try: return self._ap[p] except AttributeError: self._ap = {} except KeyError: pass a = Sequence(self.eigenvalues([p])[0], immutable=True) self._ap[p] = a return a
def check_prime(K,P): r""" Function to check that `P` determines a prime of `K`, and return that ideal. INPUT: - ``K`` -- a number field (including `\QQ`). - ``P`` -- an element of ``K`` or a (fractional) ideal of ``K``. OUTPUT: - If ``K`` is `\QQ`: the prime integer equal to or which generates `P`. - If ``K`` is not `\QQ`: the prime ideal equal to or generated by `P`. .. note:: If `P` is not a prime and does not generate a prime, a TypeError is raised. EXAMPLES:: sage: from sage.schemes.elliptic_curves.ell_local_data import check_prime sage: check_prime(QQ,3) 3 sage: check_prime(QQ,ZZ.ideal(31)) 31 sage: K.<a>=NumberField(x^2-5) sage: check_prime(K,a) Fractional ideal (a) sage: check_prime(K,a+1) Fractional ideal (a + 1) sage: [check_prime(K,P) for P in K.primes_above(31)] [Fractional ideal (5/2*a + 1/2), Fractional ideal (5/2*a - 1/2)] """ if K is QQ: if isinstance(P, (int,long,Integer)): P = Integer(P) if P.is_prime(): return P else: raise TypeError("%s is not prime"%P) else: if is_Ideal(P) and P.base_ring() is ZZ and P.is_prime(): return P.gen() raise TypeError("%s is not a prime ideal of %s"%(P,ZZ)) if not is_NumberField(K): raise TypeError("%s is not a number field"%K) if is_NumberFieldFractionalIdeal(P): if P.is_prime(): return P else: raise TypeError("%s is not a prime ideal of %s"%(P,K)) if is_NumberFieldElement(P): if P in K: P = K.ideal(P) else: raise TypeError("%s is not an element of %s"%(P,K)) if P.is_prime(): return P else: raise TypeError("%s is not a prime ideal of %s"%(P,K)) raise TypeError("%s is not a valid prime of %s"%(P,K))
def check_prime(K, P): r""" Function to check that `P` determines a prime of `K`, and return that ideal. INPUT: - ``K`` -- a number field (including `\QQ`). - ``P`` -- an element of ``K`` or a (fractional) ideal of ``K``. OUTPUT: - If ``K`` is `\QQ`: the prime integer equal to or which generates `P`. - If ``K`` is not `\QQ`: the prime ideal equal to or generated by `P`. .. NOTE:: If `P` is not a prime and does not generate a prime, a ``TypeError`` is raised. EXAMPLES:: sage: from sage.schemes.elliptic_curves.ell_local_data import check_prime sage: check_prime(QQ,3) 3 sage: check_prime(QQ,QQ(3)) 3 sage: check_prime(QQ,ZZ.ideal(31)) 31 sage: K.<a> = NumberField(x^2-5) sage: check_prime(K,a) Fractional ideal (a) sage: check_prime(K,a+1) Fractional ideal (a + 1) sage: [check_prime(K,P) for P in K.primes_above(31)] [Fractional ideal (5/2*a + 1/2), Fractional ideal (5/2*a - 1/2)] sage: L.<b> = NumberField(x^2+3) sage: check_prime(K, L.ideal(5)) Traceback (most recent call last): ... TypeError: The ideal Fractional ideal (5) is not a prime ideal of Number Field in a with defining polynomial x^2 - 5 sage: check_prime(K, L.ideal(b)) Traceback (most recent call last): ... TypeError: No compatible natural embeddings found for Number Field in a with defining polynomial x^2 - 5 and Number Field in b with defining polynomial x^2 + 3 """ if K is QQ: if P in ZZ or isinstance(P, integer_types + (Integer,)): P = Integer(P) if P.is_prime(): return P else: raise TypeError("The element %s is not prime" % (P,)) elif P in QQ: raise TypeError("The element %s is not prime" % (P,)) elif is_Ideal(P) and P.base_ring() is ZZ: if P.is_prime(): return P.gen() else: raise TypeError("The ideal %s is not a prime ideal of %s" % (P, ZZ)) else: raise TypeError("%s is neither an element of QQ or an ideal of %s" % (P, ZZ)) if not is_NumberField(K): raise TypeError("%s is not a number field" % (K,)) if is_NumberFieldFractionalIdeal(P) or P in K: # if P is an ideal, making sure it is an fractional ideal of K P = K.fractional_ideal(P) if P.is_prime(): return P else: raise TypeError("The ideal %s is not a prime ideal of %s" % (P, K)) raise TypeError("%s is not a valid prime of %s" % (P, K))
def hecke_operator_on_qexp(f, n, k, eps = None, prec=None, check=True, _return_list=False): r""" Given the `q`-expansion `f` of a modular form with character `\varepsilon`, this function computes the image of `f` under the Hecke operator `T_{n,k}` of weight `k`. EXAMPLES:: sage: M = ModularForms(1,12) sage: hecke_operator_on_qexp(M.basis()[0], 3, 12) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + O(q^5) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12, prec=7) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + 84480*q^8 - 113643*q^9 - 115920*q^10 + 534612*q^11 - 370944*q^12 - 577738*q^13 + O(q^14) sage: M.prec(20) 20 sage: hecke_operator_on_qexp(M.basis()[0], 3, 12) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + 1217160*q^5 - 1524096*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + 84480*q^8 - 113643*q^9 - 115920*q^10 + 534612*q^11 - 370944*q^12 - 577738*q^13 + 401856*q^14 + 1217160*q^15 + 987136*q^16 - 6905934*q^17 + 2727432*q^18 + 10661420*q^19 - 7109760*q^20 + O(q^21) sage: (hecke_operator_on_qexp(M.basis()[0], 1, 12)*252).add_bigoh(7) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + 1217160*q^5 - 1524096*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 6, 12) -6048*q + 145152*q^2 - 1524096*q^3 + O(q^4) An example on a formal power series:: sage: R.<q> = QQ[[]] sage: f = q + q^2 + q^3 + q^7 + O(q^8) sage: hecke_operator_on_qexp(f, 3, 12) q + O(q^3) sage: hecke_operator_on_qexp(delta_qexp(24), 3, 12).prec() 8 sage: hecke_operator_on_qexp(delta_qexp(25), 3, 12).prec() 9 An example of computing `T_{p,k}` in characteristic `p`:: sage: p = 199 sage: fp = delta_qexp(prec=p^2+1, K=GF(p)) sage: tfp = hecke_operator_on_qexp(fp, p, 12) sage: tfp == fp[p] * fp True sage: tf = hecke_operator_on_qexp(delta_qexp(prec=p^2+1), p, 12).change_ring(GF(p)) sage: tfp == tf True """ if eps is None: # Need to have base_ring=ZZ to work over finite fields, since # ZZ can coerce to GF(p), but QQ can't. eps = DirichletGroup(1, base_ring=ZZ)[0] if check: if not (is_PowerSeries(f) or is_ModularFormElement(f)): raise TypeError("f (=%s) must be a power series or modular form"%f) if not is_DirichletCharacter(eps): raise TypeError("eps (=%s) must be a Dirichlet character"%eps) k = Integer(k) n = Integer(n) v = [] if prec is None: if is_ModularFormElement(f): # always want at least three coefficients, but not too many, unless # requested pr = max(f.prec(), f.parent().prec(), (n+1)*3) pr = min(pr, 100*(n+1)) prec = pr // n + 1 else: prec = (f.prec() / ZZ(n)).ceil() if prec == Infinity: prec = f.parent().default_prec() // n + 1 if f.prec() < prec: f._compute_q_expansion(prec) p = Integer(f.base_ring().characteristic()) if k != 1 and p.is_prime() and n.is_power_of(p): # if computing T_{p^a} in characteristic p, use the simpler (and faster) # formula v = [f[m*n] for m in range(prec)] else: l = k-1 for m in range(prec): am = sum([eps(d) * d**l * f[m*n//(d*d)] for \ d in divisors(gcd(n, m)) if (m*n) % (d*d) == 0]) v.append(am) if _return_list: return v if is_ModularFormElement(f): R = f.parent()._q_expansion_ring() else: R = f.parent() return R(v, prec)
def hecke_operator_on_qexp(f, n, k, eps=None, prec=None, check=True, _return_list=False): r""" Given the `q`-expansion `f` of a modular form with character `\varepsilon`, this function computes the image of `f` under the Hecke operator `T_{n,k}` of weight `k`. EXAMPLES:: sage: M = ModularForms(1,12) sage: hecke_operator_on_qexp(M.basis()[0], 3, 12) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + O(q^5) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12, prec=7) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + 84480*q^8 - 113643*q^9 - 115920*q^10 + 534612*q^11 - 370944*q^12 - 577738*q^13 + O(q^14) sage: M.prec(20) 20 sage: hecke_operator_on_qexp(M.basis()[0], 3, 12) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + 1217160*q^5 - 1524096*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 1, 12) q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + 84480*q^8 - 113643*q^9 - 115920*q^10 + 534612*q^11 - 370944*q^12 - 577738*q^13 + 401856*q^14 + 1217160*q^15 + 987136*q^16 - 6905934*q^17 + 2727432*q^18 + 10661420*q^19 - 7109760*q^20 + O(q^21) sage: (hecke_operator_on_qexp(M.basis()[0], 1, 12)*252).add_bigoh(7) 252*q - 6048*q^2 + 63504*q^3 - 370944*q^4 + 1217160*q^5 - 1524096*q^6 + O(q^7) sage: hecke_operator_on_qexp(M.basis()[0], 6, 12) -6048*q + 145152*q^2 - 1524096*q^3 + O(q^4) An example on a formal power series:: sage: R.<q> = QQ[[]] sage: f = q + q^2 + q^3 + q^7 + O(q^8) sage: hecke_operator_on_qexp(f, 3, 12) q + O(q^3) sage: hecke_operator_on_qexp(delta_qexp(24), 3, 12).prec() 8 sage: hecke_operator_on_qexp(delta_qexp(25), 3, 12).prec() 9 An example of computing `T_{p,k}` in characteristic `p`:: sage: p = 199 sage: fp = delta_qexp(prec=p^2+1, K=GF(p)) sage: tfp = hecke_operator_on_qexp(fp, p, 12) sage: tfp == fp[p] * fp True sage: tf = hecke_operator_on_qexp(delta_qexp(prec=p^2+1), p, 12).change_ring(GF(p)) sage: tfp == tf True """ if eps is None: # Need to have base_ring=ZZ to work over finite fields, since # ZZ can coerce to GF(p), but QQ can't. eps = DirichletGroup(1, base_ring=ZZ).gen(0) if check: if not (is_PowerSeries(f) or is_ModularFormElement(f)): raise TypeError, "f (=%s) must be a power series or modular form" % f if not is_DirichletCharacter(eps): raise TypeError, "eps (=%s) must be a Dirichlet character" % eps k = Integer(k) n = Integer(n) v = [] if prec is None: if is_ModularFormElement(f): # always want at least three coefficients, but not too many, unless # requested pr = max(f.prec(), f.parent().prec(), (n + 1) * 3) pr = min(pr, 100 * (n + 1)) prec = pr // n + 1 else: prec = (f.prec() / ZZ(n)).ceil() if prec == Infinity: prec = f.parent().default_prec() // n + 1 if f.prec() < prec: f._compute_q_expansion(prec) p = Integer(f.base_ring().characteristic()) if k != 1 and p.is_prime() and n.is_power_of(p): # if computing T_{p^a} in characteristic p, use the simpler (and faster) # formula v = [f[m * n] for m in range(prec)] else: l = k - 1 for m in range(prec): am = sum([eps(d) * d**l * f[m*n//(d*d)] for \ d in divisors(gcd(n, m)) if (m*n) % (d*d) == 0]) v.append(am) if _return_list: return v if is_ModularFormElement(f): R = f.parent()._q_expansion_ring() else: R = f.parent() return R(v, prec)
def check_prime(K,P): r""" Function to check that `P` determines a prime of `K`, and return that ideal. INPUT: - ``K`` -- a number field (including `\QQ`). - ``P`` -- an element of ``K`` or a (fractional) ideal of ``K``. OUTPUT: - If ``K`` is `\QQ`: the prime integer equal to or which generates `P`. - If ``K`` is not `\QQ`: the prime ideal equal to or generated by `P`. .. note:: If `P` is not a prime and does not generate a prime, a TypeError is raised. EXAMPLES:: sage: from sage.schemes.elliptic_curves.ell_local_data import check_prime sage: check_prime(QQ,3) 3 sage: check_prime(QQ,QQ(3)) 3 sage: check_prime(QQ,ZZ.ideal(31)) 31 sage: K.<a>=NumberField(x^2-5) sage: check_prime(K,a) Fractional ideal (a) sage: check_prime(K,a+1) Fractional ideal (a + 1) sage: [check_prime(K,P) for P in K.primes_above(31)] [Fractional ideal (5/2*a + 1/2), Fractional ideal (5/2*a - 1/2)] sage: L.<b> = NumberField(x^2+3) sage: check_prime(K, L.ideal(5)) Traceback (most recent call last): .. TypeError: The ideal Fractional ideal (5) is not a prime ideal of Number Field in a with defining polynomial x^2 - 5 sage: check_prime(K, L.ideal(b)) Traceback (most recent call last): TypeError: No compatible natural embeddings found for Number Field in a with defining polynomial x^2 - 5 and Number Field in b with defining polynomial x^2 + 3 """ if K is QQ: if P in ZZ or isinstance(P, integer_types + (Integer,)): P = Integer(P) if P.is_prime(): return P else: raise TypeError("The element %s is not prime" % (P,) ) elif P in QQ: raise TypeError("The element %s is not prime" % (P,) ) elif is_Ideal(P) and P.base_ring() is ZZ: if P.is_prime(): return P.gen() else: raise TypeError("The ideal %s is not a prime ideal of %s" % (P, ZZ)) else: raise TypeError("%s is neither an element of QQ or an ideal of %s" % (P, ZZ)) if not is_NumberField(K): raise TypeError("%s is not a number field" % (K,) ) if is_NumberFieldFractionalIdeal(P) or P in K: # if P is an ideal, making sure it is an fractional ideal of K P = K.fractional_ideal(P) if P.is_prime(): return P else: raise TypeError("The ideal %s is not a prime ideal of %s" % (P, K)) raise TypeError("%s is not a valid prime of %s" % (P, K))