# Eigenvalues of hecke operators

For a project I am trying to build a program that computes a basis for cusp forms of weight 2 over $\Gamma_0(N)$. At one point, I want to represent eigenvalues of multiple Hecke operators. For example, (for $N=23$) I have found the following matrices for the Hecke operators: $T_2=\begin{pmatrix} -2 & -1/2 ; 2 & 1 \end{pmatrix}, T_3=\begin{pmatrix} 3 & 1 ; -4 & -3 \end{pmatrix} \quad T_5=\begin{pmatrix} -2 & -1/2 ; 2 & 1 \end{pmatrix} \quad$ so we have the following characteristic polynomials $f_2=x^2+x-1$, $f_3=x^2-5$, $f_5=x^2 +2x-4$. Suppose we denote the solution of $f_2$ (eigenvalues of $T_2$) by $a$ and it's conjugate. Then we can denote the solution of $f_3$ by $2a+1$ and of $f_5$ by $2a$. I am trying to figure out how I can 'make' Sage represent these eigenvalues in this way. Say I have found these matrices above, I can create k.< a >=NumberField(x^2+x-1), then $a$ represents the root of the polynomial. So the question for me is, how can I make Sage give me the eigenvalues of $T_3$ and $T_5$ in terms of $a$?

Furthermore, I am wondering how to get the jordan normal form of $T_2$, or eigenmatrix in terms of $a$. If I ask for jordan_form, I get an error, and if I ask for eigenmatrix_right, I only get a numerical expression.

Remark: A little context, the goal for this project is to represent newforms in a similar way as Sage does, when you ask for example Newforms(23,2,names='a'). We need the eigenvalues of the hecke operators since they correspond with the coefficients of the Fourier series.

edit retag close merge delete

1

The Jordan form for $T_2$ is computed if the matrix is defined over a field where the characteristic polynomial of $T_2$ splits in linear factors. The following worked for me:

sage: T2 = matrix( QQ, 2, 2, [ -2,-1/2, 2, 1 ] )
sage: T2.charpoly()
x^2 + x - 1
sage: R.<x> = QQ[]
sage: S.<a> = NumberField( x^2 + x - 1 )
sage: T2 = T2.change_ring( S )    # or T2 = matrix( S, 2, 2, [ -2,-1/2, 2, 1 ] )
sage: T2.jordan_form( transformation=True )
(
[     a|     0]
[------+------]  [       1        1]
[     0|-a - 1], [-2*a - 4  2*a - 2]
)
sage:


In the given case it is better - i think - to have full control over the number field used, adjoining a is everything we need. QQbar always works instead of the above S.

( 2018-01-15 12:54:20 +0200 )edit

Sort by » oldest newest most voted

I think the following code block - which comes with more prints than computations - gives the answer to the question. I will use the a from above, by asking sage to construct cusp forms over $K$, where $K$ corresponds to the posted K.<a> = NumberField( x^2 + x - 1 ) . (My choice would have been else to work over K.<a> = QuadraticField(5), so that the Galois conjugation is transparent.)

The many prints in the sequel should make the code self-explanatory. This is rather a long answer, but it may be that the short answer, an all it is needed is the "short answer":

Use CF = CuspForms( 23, base_ring=K ) and work in this space of cusp forms.

R.<x> = QQ[]
K.<a> = NumberField( x^2 + x - 1 )
print "a has the charpoly:", a.charpoly()
print "a has the galois conjugate:", a.galois_conjugate()

CF = CuspForms( 23, base_ring=K, prec=12 )

print "CF is\n%s\n" % CF
print "A basis of CF is:\n%s\n" % CF.basis()
print "The following Hecke operators Tp have the eigenvalues..."
for p in primes( 20 ):
Tp = CF.hecke_matrix(p)
print "T(%s) -> %s" % ( p, Tp.eigenvalues() )

print "The Jordan decomposition for T(2) is T(2) = S J S.inverse() with..."
J, S = T2.jordan_form( transformation=True )
print "J is the matrix:\n%s\n" % J
print "S is the matrix:\n%s\n" % S
print "Test for the equality T(2) = S J S.inverse()..."
print "Is T2 = S J S.inverse()? %s" % bool( T2 == S * J * S.inverse() )
print "The columns of S are giving the base change..."

print "\nLet e1, e2 be the base of CF, where:"
e1, e2 = CF.basis()
print "e1 = %s" % e1
print "e2 = %s" % e2

print "\nLet f1, f2 be the corresponding eigenforms:"
f1, f2 = e1 + a*e2, e1 + a.galois_conjugate()*e2
print "f1 = %s" % f1
print "f2 = %s" % f2

print "\n\nThen we have:"
for p in primes( 20 ):
for ev in list( set( CF.hecke_matrix(p).eigenvalues() ) ):
for f in ( f1, f2 ):
Tp_f = CF.hecke_operator(p)(f)
if Tp_f == ev*f:
print ( "%s is an eigenform for T(%s) w.r.t. eigenvalue %s"
% ( 'f1' if f==f1 else 'f2', p, ev ) )
print


This gives:

a has the charpoly: x^2 + x - 1
a has the galois conjugate: -a - 1
CF is
Cuspidal subspace of dimension 2 of Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(23) of weight 2 over Number Field in a with defining polynomial x^2 + x - 1

A basis of CF is:
[
q - q^3 - q^4 - 2*q^6 + 2*q^7 - q^8 + 2*q^9 + 2*q^10 - 4*q^11 + O(q^12),
q^2 - 2*q^3 - q^4 + 2*q^5 + q^6 + 2*q^7 - 2*q^8 - 2*q^10 - 2*q^11 + O(q^12)
]

The following Hecke operators Tp have the eigenvalues...
T(2) -> [a, -a - 1]
T(3) -> [2*a + 1, -2*a - 1]
T(5) -> [2*a, -2*a - 2]
T(7) -> [2*a + 2, -2*a]
T(11) -> [2*a - 2, -2*a - 4]
T(13) -> [3, 3]
T(17) -> [2*a + 4, -2*a + 2]
T(19) -> [-2, -2]
The Jordan decomposition for T(2) is T(2) = S J S.inverse() with...
J is the matrix:
[     a|     0]
[------+------]
[     0|-a - 1]

S is the matrix:
[     1      1]
[     a -a - 1]

Test for the equality T(2) = S J S.inverse()...
Is T2 = S J S.inverse()? True
The columns of S are giving the base change...

Let e1, e2 be the base of CF, where:
e1 = q - q^3 - q^4 - 2*q^6 + 2*q^7 - q^8 + 2*q^9 + 2*q^10 - 4*q^11 + O(q^12)
e2 = q^2 - 2*q^3 - q^4 + 2*q^5 + q^6 + 2*q^7 - 2*q^8 - 2*q^10 - 2*q^11 + O(q^12)

Let f1, f2 be the corresponding eigenforms:
f1 = q + a*q^2 + (-2*a - 1)*q^3 + (-a - 1)*q^4 + 2*a*q^5 + (a - 2)*q^6 + (2*a + 2)*q^7 + (-2*a - 1)*q^8 + 2*q^9 + (-2*a + 2)*q^10 + (-2*a - 4)*q^11 + O(q^12)
f2 = q + (-a - 1)*q^2 + (2*a + 1)*q^3 + a*q^4 + (-2*a - 2)*q^5 + (-a - 3)*q^6 - 2*a*q^7 + (2*a + 1)*q^8 + 2*q^9 + (2*a + 4)*q^10 + (2*a - 2)*q^11 + O(q^12)

Then we have:
f1 is an eigenform for T(2) w.r.t. eigenvalue a
f2 is an eigenform for T(2) w.r.t. eigenvalue -a - 1

f1 is an eigenform for T(3) w.r.t. eigenvalue -2*a - 1
f2 is an eigenform for T(3) w.r.t. eigenvalue 2*a + 1

f2 is an eigenform for T(5) w.r.t. eigenvalue -2*a - 2
f1 is an eigenform for T(5) w.r.t. eigenvalue 2*a

f1 is an eigenform for T(7) w.r.t. eigenvalue 2*a + 2
f2 is an eigenform for T(7) w.r.t. eigenvalue -2*a

f2 is an eigenform for T(11) w.r.t. eigenvalue 2*a - 2
f1 is an eigenform for T(11) w.r.t. eigenvalue -2*a - 4

f1 is an eigenform for T(13) w.r.t. eigenvalue 3
f2 is an eigenform for T(13) w.r.t. eigenvalue 3

f2 is an eigenform for T(17) w.r.t. eigenvalue 2*a + 4
f1 is an eigenform for T(17) w.r.t. eigenvalue -2*a + 2

f1 is an eigenform for T(19) w.r.t. eigenvalue -2
f2 is an eigenform for T(19) w.r.t. eigenvalue -2


(The matrices for the Hecke operators differ from the posted ones, since the sage basis differ.)

I hope, this helps to proceed. (It is hard to specifically translate the core of the question "I have been trying k.< a > = NumberField( x^2 + x - 1 ), but then I don't know how to proceed with this a.")

A final note: If there is a need for a "ring" to do the computations inside, to test for equalities, to work with matrices over it, et caetera, here is the ring:

sage: f1.q_expansion().parent()
Power Series Ring in q over Number Field in a with defining polynomial x^2 + x - 1


P.S. The question got an 1up, since it gives all needed details in a given interesting number theoretical / modular structure, in a field, which is one of the strengths of sage. Such examples are needed, and the provide the best way to understand sage by math's and/or math's by sage...

more

Thank you for the long answer! I am afraid it does not completely solve my problem, but it is still interesting. The thing is that my matrices don't come from Sage, but from my own code that computes a basis of the homology and it's hecke operators (which is the purpose of my project), which corresponds to a basis of the cusp forms. So I am trying to make something independent of the command CuspForms. The slightly cryptical sentence I have edited now, hopefully it makes more sense.

( 2018-01-15 11:21:23 +0200 )edit

And what I am also wondering, if I have any matrix, (for instance T2) could I make the Jordan Form in terms of 'a'. You did this here, but it only works because you are working with CuspForms. But could we do this more generally?

( 2018-01-15 11:35:04 +0200 )edit
1

I also inserted a comment directly under the question. I think, such kind of problems (coming from the coefficient ring) are solved by using the right ring, for instance:

K.<b> = QuadraticField(5)
T2 = matrix( K,2,2, (-2,-1/2,2,1) )
T3 = matrix( K,2,2, (3,1,-4,-3) )
J2, S = T2.jordan_form( transformation=1 )

print S^-1 * T2 * S
print S^-1 * T3 * S


This gives:

[ 1/2*b - 1/2            0]
[           0 -1/2*b - 1/2]


and

[-b  0]
[ 0  b]


Good luck and good ideas in the research!

(If there is still something open, please do not hesitate to post it!)

( 2018-01-15 13:07:02 +0200 )edit

Yes this is what I need. Only thing is that my matrices come out of some algorithm, so I would like to transform them into matrices over $K$, instead of construct them as above. So given some matrix, how do I change the ring. change_ring doesn't seem to do the trick. I could just put the entries into matrix() one by one again, but is there a more direct way?

( 2018-01-15 13:48:45 +0200 )edit

Ok, I guess I solved it by just saying matrix(K,2,2,[T2[i] for i in srange(2)])

( 2018-01-15 14:00:44 +0200 )edit