# Function level, X = SL_2/T over F = F_q((t)), K = SL_2(O). Tree model as in Prop J(1):
# f_d = indicator of (type-0) vertices at distance d from the apartment A_T.
# A = adjacency operator (label (1,0) of GL_2): A f_0 = 2 f_0 + f_1, A f_1 = (q-1) f_0 + f_2, A f_d = q f_{d-1} + f_{d+1}, d>=2.
# SL_2 Hecke operator for alpha^vee: (T f)(v) = sum over vertices at tree distance 2 = A^2 - (q+1).
# Polynomials in q as dict {power: coeff}.
from fractions import Fraction
def padd(a,b):
    c=dict(a)
    for k,v in b.items(): c[k]=c.get(k,0)+v
    return {k:v for k,v in c.items() if v!=0}
def pmul(a,b):
    c={}
    for i,u in a.items():
        for j,v in b.items(): c[i+j]=c.get(i+j,0)+u*v
    return {k:v for k,v in c.items() if v!=0}
def psc(a,s): return {k:v*s for k,v in a.items() if v*s!=0}
Q={1:1}; ONE={0:1}
N=16
def A(vec):
    out=[{} for _ in range(N+2)]
    for d,c in enumerate(vec):
        if not c: continue
        if d==0: out[0]=padd(out[0],psc(c,2)); out[1]=padd(out[1],c)
        elif d==1: out[0]=padd(out[0],pmul(c,padd(Q,psc(ONE,-1)))); out[2]=padd(out[2],c)
        else: out[d-1]=padd(out[d-1],pmul(c,Q)); out[d+1]=padd(out[d+1],c)
    return out[:N+1]
def T(vec):
    a=A(A(vec)); return [padd(a[i],psc(pmul(vec[i],padd(Q,ONE)),-1)) for i in range(N+1)]
def show(p):
    return ' + '.join(f'{v}q^{k}' if k else f'{v}' for k,v in sorted(p.items())) or '0'
f0=[{} for _ in range(N+1)]; f0[0]=ONE
cur=f0; vecs=[]
for n in range(5):
    vecs.append(cur); print(f'T^{n} f0 =', {d:show(c) for d,c in enumerate(cur) if c}); cur=T(cur)
# individual T f_d for d=0..4
for d in range(5):
    e=[{} for _ in range(N+1)]; e[d]=ONE
    print(f'T f_{d} =', {m:show(c) for m,c in enumerate(T(e)) if c})
# numeric rank check for q=3,5,7: span{T^n f0 : n<=5} inside span(f_0..f_10)
def ev(p,qv): return sum(v*qv**k for k,v in p.items())
def rank(M):
    M=[[Fraction(x) for x in row] for row in M]; r=0; rows=len(M); cols=len(M[0])
    for c in range(cols):
        piv=next((i for i in range(r,rows) if M[i][c]!=0),None)
        if piv is None: continue
        M[r],M[piv]=M[piv],M[r]
        for i in range(rows):
            if i!=r and M[i][c]!=0:
                f=M[i][c]/M[r][c]; M[i]=[a-f*b for a,b in zip(M[i],M[r])]
        r+=1
    return r
cur=f0; vs=[]
for n in range(6): vs.append(cur); cur=T(cur)
for qv in (3,5,7,9):
    M=[[ev(c,qv) for c in v[:11]] for v in vs]
    print(f'q={qv}: rank of {{T^n f0, n<=5}} within f_0..f_10 = {rank(M)}, ambient dim 11; top index of T^n f0 =', [max(d for d,c in enumerate(v) if c) for v in vs])
