The space of \(p\)-adic weights¶
A \(p\)-adic weight is a continuous character \(\ZZ_p^\times \to \CC_p^\times\). These are the \(\CC_p\)-points of a rigid space over \(\QQ_p\), which is isomorphic to a disjoint union of copies (indexed by \((\ZZ/p\ZZ)^\times\)) of the open unit \(p\)-adic disc.
Sage supports both “classical points”, which are determined by the data of a Dirichlet character modulo \(p^m\) for some \(m\) and an integer \(k\) (corresponding to the character \(z \mapsto z^k \chi(z)\)) and “non-classical points” which are determined by the data of an element of \((\ZZ/p\ZZ)^\times\) and an element \(w \in \CC_p\) with \(|w - 1| < 1\).
EXAMPLES:
sage: W = pAdicWeightSpace(17)
sage: W
Space of 17-adic weight-characters
defined over 17-adic Field with capped relative precision 20
sage: R.<x> = QQ[]
sage: L = Qp(17).extension(x^2 - 17, names='a'); L.rename('L')
sage: W.base_extend(L)
Space of 17-adic weight-characters defined over L
>>> from sage.all import *
>>> W = pAdicWeightSpace(Integer(17))
>>> W
Space of 17-adic weight-characters
defined over 17-adic Field with capped relative precision 20
>>> R = QQ['x']; (x,) = R._first_ngens(1)
>>> L = Qp(Integer(17)).extension(x**Integer(2) - Integer(17), names='a'); L.rename('L')
>>> W.base_extend(L)
Space of 17-adic weight-characters defined over L
W = pAdicWeightSpace(17) W R.<x> = QQ[] L = Qp(17).extension(x^2 - 17, names='a'); L.rename('L') W.base_extend(L)
We create a simple element of \(\mathcal{W}\): the algebraic character, \(x \mapsto x^6\):
sage: kappa = W(6)
sage: kappa(5)
15625
sage: kappa(5) == 5^6
True
>>> from sage.all import *
>>> kappa = W(Integer(6))
>>> kappa(Integer(5))
15625
>>> kappa(Integer(5)) == Integer(5)**Integer(6)
True
kappa = W(6) kappa(5) kappa(5) == 5^6
A locally algebraic character, \(x \mapsto x^6 \chi(x)\) for \(\chi\) a Dirichlet character mod \(p\):
sage: kappa2 = W(6, DirichletGroup(17, Qp(17)).0^8)
sage: kappa2(5) == -5^6
True
sage: kappa2(13) == 13^6
True
>>> from sage.all import *
>>> kappa2 = W(Integer(6), DirichletGroup(Integer(17), Qp(Integer(17))).gen(0)**Integer(8))
>>> kappa2(Integer(5)) == -Integer(5)**Integer(6)
True
>>> kappa2(Integer(13)) == Integer(13)**Integer(6)
True
kappa2 = W(6, DirichletGroup(17, Qp(17)).0^8) kappa2(5) == -5^6 kappa2(13) == 13^6
A non-locally-algebraic character, sending the generator 18 of \(1 + 17 \ZZ_{17}\) to 35 and acting as \(\mu \mapsto \mu^4\) on the group of 16th roots of unity:
sage: kappa3 = W(35 + O(17^20), 4, algebraic=False)
sage: kappa3(2)
16 + 8*17 + ... + O(17^20)
>>> from sage.all import *
>>> kappa3 = W(Integer(35) + O(Integer(17)**Integer(20)), Integer(4), algebraic=False)
>>> kappa3(Integer(2))
16 + 8*17 + ... + O(17^20)
kappa3 = W(35 + O(17^20), 4, algebraic=False) kappa3(2)
AUTHORS:
David Loeffler (2008-9)
- class sage.modular.overconvergent.weightspace.AlgebraicWeight(parent, k, chi=None)[source]¶
Bases:
WeightCharacter
A point in weight space corresponding to a locally algebraic character, of the form \(x \mapsto \chi(x) x^k\) where \(k\) is an integer and \(\chi\) is a Dirichlet character modulo \(p^n\) for some \(n\).
- Lvalue()[source]¶
Return the value of the \(p\)-adic \(L\)-function of \(\QQ\) evaluated at this weight-character.
If the character is \(x \mapsto x^k \chi(x)\) where \(k > 0\) and \(\chi\) has conductor a power of \(p\), this is an element of the number field generated by the values of \(\chi\), equal to the value of the complex \(L\)-function \(L(1-k, \chi)\). If \(\chi\) is trivial, it is equal to \((1 - p^{k-1})\zeta(1-k)\).
At present this is not implemented in any other cases, except the trivial character (for which the value is \(\infty\)).
Todo
Implement this more generally using the Amice transform machinery in sage/schemes/elliptic_curves/padic_lseries.py, which should clearly be factored out into a separate class.
EXAMPLES:
sage: pAdicWeightSpace(7)(4).Lvalue() == (1 - 7^3)*zeta__exact(-3) True sage: pAdicWeightSpace(7)(5, DirichletGroup(7, Qp(7)).0^4).Lvalue() 0 sage: pAdicWeightSpace(7)(6, DirichletGroup(7, Qp(7)).0^4).Lvalue() 1 + 2*7 + 7^2 + 3*7^3 + 3*7^5 + 4*7^6 + 2*7^7 + 5*7^8 + 2*7^9 + 3*7^10 + 6*7^11 + 2*7^12 + 3*7^13 + 5*7^14 + 6*7^15 + 5*7^16 + 3*7^17 + 6*7^18 + O(7^19)
>>> from sage.all import * >>> pAdicWeightSpace(Integer(7))(Integer(4)).Lvalue() == (Integer(1) - Integer(7)**Integer(3))*zeta__exact(-Integer(3)) True >>> pAdicWeightSpace(Integer(7))(Integer(5), DirichletGroup(Integer(7), Qp(Integer(7))).gen(0)**Integer(4)).Lvalue() 0 >>> pAdicWeightSpace(Integer(7))(Integer(6), DirichletGroup(Integer(7), Qp(Integer(7))).gen(0)**Integer(4)).Lvalue() 1 + 2*7 + 7^2 + 3*7^3 + 3*7^5 + 4*7^6 + 2*7^7 + 5*7^8 + 2*7^9 + 3*7^10 + 6*7^11 + 2*7^12 + 3*7^13 + 5*7^14 + 6*7^15 + 5*7^16 + 3*7^17 + 6*7^18 + O(7^19)
pAdicWeightSpace(7)(4).Lvalue() == (1 - 7^3)*zeta__exact(-3) pAdicWeightSpace(7)(5, DirichletGroup(7, Qp(7)).0^4).Lvalue() pAdicWeightSpace(7)(6, DirichletGroup(7, Qp(7)).0^4).Lvalue()
- chi()[source]¶
If this character is \(x \mapsto x^k \chi(x)\) for an integer \(k\) and a Dirichlet character \(\chi\), return \(\chi\).
EXAMPLES:
sage: kappa = pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0^14) sage: kappa.chi() Dirichlet character modulo 29 of conductor 29 mapping 2 |--> 28 + 28*29 + 28*29^2 + ... + O(29^20)
>>> from sage.all import * >>> kappa = pAdicWeightSpace(Integer(29))(Integer(13), DirichletGroup(Integer(29), Qp(Integer(29))).gen(0)**Integer(14)) >>> kappa.chi() Dirichlet character modulo 29 of conductor 29 mapping 2 |--> 28 + 28*29 + 28*29^2 + ... + O(29^20)
kappa = pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0^14) kappa.chi()
- k()[source]¶
If this character is \(x \mapsto x^k \chi(x)\) for an integer \(k\) and a Dirichlet character \(\chi\), return \(k\).
EXAMPLES:
sage: kappa = pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0^14) sage: kappa.k() 13
>>> from sage.all import * >>> kappa = pAdicWeightSpace(Integer(29))(Integer(13), DirichletGroup(Integer(29), Qp(Integer(29))).gen(0)**Integer(14)) >>> kappa.k() 13
kappa = pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0^14) kappa.k()
- teichmuller_type()[source]¶
Return the Teichmuller type of this weight-character \(\kappa\).
This is the unique \(t \in \ZZ/(p-1)\ZZ\) such that \(\kappa(\mu) = \mu^t\) for \(\mu\) a \((p-1)\)-st root of 1.
For \(p = 2\) this does not make sense, but we still want the Teichmuller type to correspond to the index of the component of weight space in which \(\kappa\) lies, so we return 1 if \(\kappa\) is odd and 0 otherwise.
EXAMPLES:
sage: pAdicWeightSpace(11)(2, DirichletGroup(11,QQ).0).teichmuller_type() 7 sage: pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0).teichmuller_type() 14 sage: pAdicWeightSpace(2)(3, DirichletGroup(4,QQ).0).teichmuller_type() 0
>>> from sage.all import * >>> pAdicWeightSpace(Integer(11))(Integer(2), DirichletGroup(Integer(11),QQ).gen(0)).teichmuller_type() 7 >>> pAdicWeightSpace(Integer(29))(Integer(13), DirichletGroup(Integer(29), Qp(Integer(29))).gen(0)).teichmuller_type() 14 >>> pAdicWeightSpace(Integer(2))(Integer(3), DirichletGroup(Integer(4),QQ).gen(0)).teichmuller_type() 0
pAdicWeightSpace(11)(2, DirichletGroup(11,QQ).0).teichmuller_type() pAdicWeightSpace(29)(13, DirichletGroup(29, Qp(29)).0).teichmuller_type() pAdicWeightSpace(2)(3, DirichletGroup(4,QQ).0).teichmuller_type()
- class sage.modular.overconvergent.weightspace.ArbitraryWeight(parent, w, t)[source]¶
Bases:
WeightCharacter
Create the element of \(p\)-adic weight space in the given component mapping 1 + p to w.
Here w must be an element of a \(p\)-adic field, with finite precision.
EXAMPLES:
sage: pAdicWeightSpace(17)(1 + 17^2 + O(17^3), 11, False) [1 + 17^2 + O(17^3), 11]
>>> from sage.all import * >>> pAdicWeightSpace(Integer(17))(Integer(1) + Integer(17)**Integer(2) + O(Integer(17)**Integer(3)), Integer(11), False) [1 + 17^2 + O(17^3), 11]
pAdicWeightSpace(17)(1 + 17^2 + O(17^3), 11, False)
- teichmuller_type()[source]¶
Return the Teichmuller type of this weight-character \(\kappa\).
This is the unique \(t \in \ZZ/(p-1)\ZZ\) such that \(\kappa(\mu) = \mu^t\) for mu a \((p-1)\)-st root of 1.
For \(p = 2\) this does not make sense, but we still want the Teichmuller type to correspond to the index of the component of weight space in which \(\kappa\) lies, so we return 1 if \(\kappa\) is odd and 0 otherwise.
EXAMPLES:
sage: pAdicWeightSpace(17)(1 + 3*17 + 2*17^2 + O(17^3), 8, False).teichmuller_type() 8 sage: pAdicWeightSpace(2)(1 + 2 + O(2^2), 1, False).teichmuller_type() 1
>>> from sage.all import * >>> pAdicWeightSpace(Integer(17))(Integer(1) + Integer(3)*Integer(17) + Integer(2)*Integer(17)**Integer(2) + O(Integer(17)**Integer(3)), Integer(8), False).teichmuller_type() 8 >>> pAdicWeightSpace(Integer(2))(Integer(1) + Integer(2) + O(Integer(2)**Integer(2)), Integer(1), False).teichmuller_type() 1
pAdicWeightSpace(17)(1 + 3*17 + 2*17^2 + O(17^3), 8, False).teichmuller_type() pAdicWeightSpace(2)(1 + 2 + O(2^2), 1, False).teichmuller_type()
- class sage.modular.overconvergent.weightspace.WeightCharacter(parent)[source]¶
Bases:
Element
Abstract base class representing an element of the \(p\)-adic weight space \(Hom(\ZZ_p^\times, \CC_p^\times)\).
- Lvalue()[source]¶
Return the value of the \(p\)-adic \(L\)-function of \(\QQ\), which can be regarded as a rigid-analytic function on weight space, evaluated at this character.
EXAMPLES:
sage: W = pAdicWeightSpace(11) sage: sage.modular.overconvergent.weightspace.WeightCharacter(W).Lvalue() Traceback (most recent call last): ... NotImplementedError
>>> from sage.all import * >>> W = pAdicWeightSpace(Integer(11)) >>> sage.modular.overconvergent.weightspace.WeightCharacter(W).Lvalue() Traceback (most recent call last): ... NotImplementedError
W = pAdicWeightSpace(11) sage.modular.overconvergent.weightspace.WeightCharacter(W).Lvalue()
- base_extend(R)[source]¶
Extend scalars to the base ring R.
The ring R must have a canonical map from the current base ring.
EXAMPLES:
sage: w = pAdicWeightSpace(17, QQ)(3) sage: w.base_extend(Qp(17)) 3
>>> from sage.all import * >>> w = pAdicWeightSpace(Integer(17), QQ)(Integer(3)) >>> w.base_extend(Qp(Integer(17))) 3
w = pAdicWeightSpace(17, QQ)(3) w.base_extend(Qp(17))
- is_even()[source]¶
Return
True
if this weight-character sends -1 to +1.EXAMPLES:
sage: pAdicWeightSpace(17)(0).is_even() True sage: pAdicWeightSpace(17)(11).is_even() False sage: pAdicWeightSpace(17)(1 + 17 + O(17^20), 3, False).is_even() False sage: pAdicWeightSpace(17)(1 + 17 + O(17^20), 4, False).is_even() True
>>> from sage.all import * >>> pAdicWeightSpace(Integer(17))(Integer(0)).is_even() True >>> pAdicWeightSpace(Integer(17))(Integer(11)).is_even() False >>> pAdicWeightSpace(Integer(17))(Integer(1) + Integer(17) + O(Integer(17)**Integer(20)), Integer(3), False).is_even() False >>> pAdicWeightSpace(Integer(17))(Integer(1) + Integer(17) + O(Integer(17)**Integer(20)), Integer(4), False).is_even() True
pAdicWeightSpace(17)(0).is_even() pAdicWeightSpace(17)(11).is_even() pAdicWeightSpace(17)(1 + 17 + O(17^20), 3, False).is_even() pAdicWeightSpace(17)(1 + 17 + O(17^20), 4, False).is_even()
- is_trivial()[source]¶
Return
True
if and only if this is the trivial character.EXAMPLES:
sage: pAdicWeightSpace(11)(2).is_trivial() False sage: pAdicWeightSpace(11)(2, DirichletGroup(11, QQ).0).is_trivial() False sage: pAdicWeightSpace(11)(0).is_trivial() True
>>> from sage.all import * >>> pAdicWeightSpace(Integer(11))(Integer(2)).is_trivial() False >>> pAdicWeightSpace(Integer(11))(Integer(2), DirichletGroup(Integer(11), QQ).gen(0)).is_trivial() False >>> pAdicWeightSpace(Integer(11))(Integer(0)).is_trivial() True
pAdicWeightSpace(11)(2).is_trivial() pAdicWeightSpace(11)(2, DirichletGroup(11, QQ).0).is_trivial() pAdicWeightSpace(11)(0).is_trivial()
- one_over_Lvalue()[source]¶
Return the reciprocal of the \(p\)-adic \(L\)-function evaluated at this weight-character.
If the weight-character is odd, then the \(L\)-function is zero, so an error will be raised.
EXAMPLES:
sage: pAdicWeightSpace(11)(4).one_over_Lvalue() -12/133 sage: pAdicWeightSpace(11)(3, DirichletGroup(11, QQ).0).one_over_Lvalue() -1/6 sage: pAdicWeightSpace(11)(3).one_over_Lvalue() Traceback (most recent call last): ... ZeroDivisionError: rational division by zero sage: pAdicWeightSpace(11)(0).one_over_Lvalue() 0 sage: type(_) <class 'sage.rings.integer.Integer'>
>>> from sage.all import * >>> pAdicWeightSpace(Integer(11))(Integer(4)).one_over_Lvalue() -12/133 >>> pAdicWeightSpace(Integer(11))(Integer(3), DirichletGroup(Integer(11), QQ).gen(0)).one_over_Lvalue() -1/6 >>> pAdicWeightSpace(Integer(11))(Integer(3)).one_over_Lvalue() Traceback (most recent call last): ... ZeroDivisionError: rational division by zero >>> pAdicWeightSpace(Integer(11))(Integer(0)).one_over_Lvalue() 0 >>> type(_) <class 'sage.rings.integer.Integer'>
pAdicWeightSpace(11)(4).one_over_Lvalue() pAdicWeightSpace(11)(3, DirichletGroup(11, QQ).0).one_over_Lvalue() pAdicWeightSpace(11)(3).one_over_Lvalue() pAdicWeightSpace(11)(0).one_over_Lvalue() type(_)
- pAdicEisensteinSeries(ring, prec=20)[source]¶
Calculate the \(q\)-expansion of the \(p\)-adic Eisenstein series of given weight-character, normalised so the constant term is 1.
EXAMPLES:
sage: kappa = pAdicWeightSpace(3)(3, DirichletGroup(3,QQ).0) sage: kappa.pAdicEisensteinSeries(QQ[['q']], 20) 1 - 9*q + 27*q^2 - 9*q^3 - 117*q^4 + 216*q^5 + 27*q^6 - 450*q^7 + 459*q^8 - 9*q^9 - 648*q^10 + 1080*q^11 - 117*q^12 - 1530*q^13 + 1350*q^14 + 216*q^15 - 1845*q^16 + 2592*q^17 + 27*q^18 - 3258*q^19 + O(q^20)
>>> from sage.all import * >>> kappa = pAdicWeightSpace(Integer(3))(Integer(3), DirichletGroup(Integer(3),QQ).gen(0)) >>> kappa.pAdicEisensteinSeries(QQ[['q']], Integer(20)) 1 - 9*q + 27*q^2 - 9*q^3 - 117*q^4 + 216*q^5 + 27*q^6 - 450*q^7 + 459*q^8 - 9*q^9 - 648*q^10 + 1080*q^11 - 117*q^12 - 1530*q^13 + 1350*q^14 + 216*q^15 - 1845*q^16 + 2592*q^17 + 27*q^18 - 3258*q^19 + O(q^20)
kappa = pAdicWeightSpace(3)(3, DirichletGroup(3,QQ).0) kappa.pAdicEisensteinSeries(QQ[['q']], 20)
- values_on_gens()[source]¶
If \(\kappa\) is this character, calculate the values \((\kappa(r), t)\) where \(r\) is \(1 + p\) (or 5 if \(p = 2\)) and \(t\) is the unique element of \(\ZZ/(p-1)\ZZ\) such that \(\kappa(\mu) = \mu^t\) for \(\mu\) a (p-1)st root of unity. (If \(p = 2\), we take \(t\) to be 0 or 1 according to whether \(\kappa\) is odd or even.) These two values uniquely determine the character \(\kappa\).
EXAMPLES:
sage: W = pAdicWeightSpace(11); W(2).values_on_gens() (1 + 2*11 + 11^2 + O(11^20), 2) sage: W(2, DirichletGroup(11, QQ).0).values_on_gens() (1 + 2*11 + 11^2 + O(11^20), 7) sage: W(1 + 2*11 + O(11^5), 4, algebraic = False).values_on_gens() (1 + 2*11 + O(11^5), 4)
>>> from sage.all import * >>> W = pAdicWeightSpace(Integer(11)); W(Integer(2)).values_on_gens() (1 + 2*11 + 11^2 + O(11^20), 2) >>> W(Integer(2), DirichletGroup(Integer(11), QQ).gen(0)).values_on_gens() (1 + 2*11 + 11^2 + O(11^20), 7) >>> W(Integer(1) + Integer(2)*Integer(11) + O(Integer(11)**Integer(5)), Integer(4), algebraic = False).values_on_gens() (1 + 2*11 + O(11^5), 4)
W = pAdicWeightSpace(11); W(2).values_on_gens() W(2, DirichletGroup(11, QQ).0).values_on_gens() W(1 + 2*11 + O(11^5), 4, algebraic = False).values_on_gens()
- class sage.modular.overconvergent.weightspace.WeightSpace_class(p, base_ring)[source]¶
Bases:
Parent
The space of \(p\)-adic weight-characters \(\mathcal{W} = {\rm Hom}(\ZZ_p^\times, \CC_p^\times)\).
This is isomorphic to a disjoint union of \((p-1)\) open discs of radius 1 (or 2 such discs if \(p = 2\)), with the parameter on the open disc corresponding to the image of \(1 + p\) (or 5 if \(p = 2\))
- base_extend(R)[source]¶
Extend scalars to the ring R.
There must be a canonical coercion map from the present base ring to R.
EXAMPLES:
sage: W = pAdicWeightSpace(3, QQ) sage: W.base_extend(Qp(3)) Space of 3-adic weight-characters defined over 3-adic Field with capped relative precision 20 sage: W.base_extend(IntegerModRing(12)) Traceback (most recent call last): ... TypeError: No coercion map from 'Rational Field' to 'Ring of integers modulo 12' is defined
>>> from sage.all import * >>> W = pAdicWeightSpace(Integer(3), QQ) >>> W.base_extend(Qp(Integer(3))) Space of 3-adic weight-characters defined over 3-adic Field with capped relative precision 20 >>> W.base_extend(IntegerModRing(Integer(12))) Traceback (most recent call last): ... TypeError: No coercion map from 'Rational Field' to 'Ring of integers modulo 12' is defined
W = pAdicWeightSpace(3, QQ) W.base_extend(Qp(3)) W.base_extend(IntegerModRing(12))
- sage.modular.overconvergent.weightspace.WeightSpace_constructor(p, base_ring=None)[source]¶
Construct the \(p\)-adic weight space for the given prime p.
A \(p\)-adic weight is a continuous character \(\ZZ_p^\times \to \CC_p^\times\). These are the \(\CC_p\)-points of a rigid space over \(\QQ_p\), which is isomorphic to a disjoint union of copies (indexed by \((\ZZ/p\ZZ)^\times\)) of the open unit \(p\)-adic disc.
Note that the “base ring” of a \(p\)-adic weight is the smallest ring containing the image of \(\ZZ\); in particular, although the default base ring is \(\QQ_p\), base ring \(\QQ\) will also work.
EXAMPLES:
sage: pAdicWeightSpace(3) # indirect doctest Space of 3-adic weight-characters defined over 3-adic Field with capped relative precision 20 sage: pAdicWeightSpace(3, QQ) Space of 3-adic weight-characters defined over Rational Field sage: pAdicWeightSpace(10) Traceback (most recent call last): ... ValueError: p must be prime
>>> from sage.all import * >>> pAdicWeightSpace(Integer(3)) # indirect doctest Space of 3-adic weight-characters defined over 3-adic Field with capped relative precision 20 >>> pAdicWeightSpace(Integer(3), QQ) Space of 3-adic weight-characters defined over Rational Field >>> pAdicWeightSpace(Integer(10)) Traceback (most recent call last): ... ValueError: p must be prime
pAdicWeightSpace(3) # indirect doctest pAdicWeightSpace(3, QQ) pAdicWeightSpace(10)