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))
prime()[source]

Return the prime \(p\) such that this is a \(p\)-adic weight space.

EXAMPLES:

sage: pAdicWeightSpace(17).prime()
17
>>> from sage.all import *
>>> pAdicWeightSpace(Integer(17)).prime()
17
pAdicWeightSpace(17).prime()
zero()[source]

Return the zero of this weight space.

EXAMPLES:

sage: W = pAdicWeightSpace(17)
sage: W.zero()
0
>>> from sage.all import *
>>> W = pAdicWeightSpace(Integer(17))
>>> W.zero()
0
W = pAdicWeightSpace(17)
W.zero()
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)