# Precision error when finding eigenvalues of Hecke Operator

I am having some trouble when calculating the p-adic valuations of the eigenvalues of the Hecke operator. I am using the following code to calculate them:

p = 5
F=Qp(p, prec=10000)
R.<X> = PolynomialRing(F)
S.<T> = PolynomialRing(QQ)
SHOW_FACTORS = False

for m in [52..53]:
hs = hecke_series(p, 2, 2, m)
print(f'\nm = {m}\nhecke series = {hs}')
for root, mul in S(hs).roots(ring=F):
print(f'root {v(root)}')
if not SHOW_FACTORS:
continue
try:
print('Factors:')
for f, mul in R(hs).factor():
print(f)
except:
print('*** factorization failed ***\n')


But I have found that for different precisions m, I do not get the same results. For example, for m=52 and m=53, I get different sets of valuations.

m = 52
hecke series = 248689957516035065054893493652343750*x^13 + 1674403001743485219776630401611328125*x^12 + 1158477226609946228563785552978515625*x^11 + 1681565410974239751696586608886718750*x^10 + 740816027146591471840858459472656250*x^9 + 984876153765252102828224029541015625*x^8 + 2199502199510497526175470605761718750*x^7 + 2047190245401796728083458292414140625*x^6 + 227766241144299957275576934742803125*x^5 + 1626265950251135133773358227520486875*x^4 + 2173838516487905357643185902479851120*x^3 + 966441077617202989620226898790437136*x^2 + 2033736385834117114445851281601109243*x + 1
root 9
root 7
root 4
root 2
root 1

m = 53
hecke series = 4689582056016661226749420166015625000*x^13 + 3894849050993798300623893737792968750*x^12 + 1158477226609946228563785552978515625*x^11 + 1681565410974239751696586608886718750*x^10 + 740816027146591471840858459472656250*x^9 + 7646214301516191345370014038085937500*x^8 + 6640394298011123687869997278125000000*x^7 + 10928974442403049051472511637140703125*x^6 + 4668658339644926118970103607106084375*x^5 + 3846711999501448214620621563702127500*x^4 + 4394284565738218438490449238661491745*x^3 + 3186887126867516070467490234972077761*x^2 + 2033736385834117114445851281601109243*x + 1
root 9
root 7
root 5
root 5
root 4
root 2
root 1
root 0
root 0


I know for a fact that they should be giving the same valuations, however. Indeed, the valutation of the roots should be the same because of the properties of Newton polygon https://en.wikipedia.org/wiki/Newton_... as long as the polynomial for m=53 reduces modulo p^52 to the polynomial for m=52. I tested this, using the following code:

hecke_series(5, 2, 2, 52)

R.<q> = PowerSeriesRing(ZZ,default_prec=(p*100))
Poly.<x>=PolynomialRing(ZZ)

def ordred2(a,p):
b=Poly(a)
b+= x^(14) #this is just to make absolutely sure we have enough coefficients to avoid issues with list index
ordred2_b=b.coefficients(sparse=False)
ordred2_coeff=list('ordred2_coeff_%d' % d for d in range(0,14))
for i in range(0,14):
ordred2_coeff[i]=Mod(ordred2_b[i],p^52)
return R(ordred2_coeff)

ordred2(hecke_series(5, 2, 2, 53),5)


And found that it does indeed reduce. However, I did notice that if I use R.<q> = PowerSeriesRing(ZZ,default_prec=(p*10)) instead, then it does not reduce properly. This seems to indicate to me that there is some sort of precision error that I am running into in this problem, but no matter what I change in my code, I seem to get the same result when calculating the valuations. Indeed, for Qp(p, prec=100) and Qp(p, prec=10000), I get the same result. Am I missing something? Is there some other place I have to increase the precision, which I am not seeing?

edit retag close merge delete

Sort by ยป oldest newest most voted

First of all, your have a mismatch between the code and the output as the printed valuations have wrong signs (e.g., it should be root -9 rather than root 9).

Your statement that "the valuation of the roots should be the same" is not quite correct. The correct statement is that the valuations of the roots for $m=52$ form a subset of those for $m=53$, but not necessarily vice versa! And you do see this in your example.

One can verify explicitly that it does not work in the other direction here by taking a root with $\nu=-5$ for $m=53$ and plugging it in the polynomial for $m=52$:

p = 5

F=Qp(p, prec=200)        # prec=200 is quite enough here

h52 = hecke_series(p, 2, 2, 52).change_ring(QQ)         # a polynomial over QQ for m=52
h53 = hecke_series(p, 2, 2, 53).change_ring(QQ)         # a polynomial over QQ for m=53

r = next(root for root,_ in h53.roots(ring=F) if v(root)==-5)
print('root with v=-5:', r)
print('h53(r) over F:', h53.change_ring(F)(r))
print('h52(r) over F:', h52.change_ring(F)(r))


A shortened output here looks like

root with v=-5: 2*5^-5 + 3*5^-4 + 5^-3 + [...skipped...] + O(5^190)
h53(r) over F: O(5^171)
h52(r) over F: 5^-13 + 4*5^-11 + 2*5^-10 + [...skipped...] + O(5^171)

more