allocatemem(100*10^6)
N = 11;
W2 = msinit(N,2,-1);
W1 = msinit(N,2,1);
W = msinit(N,2);
mshecke(W2, 2)
mshecke(W1, 2)
mshecke(W, 2)
mshecke(W1, 11)

E=ellinit([1,2]);
[W,xpm]= msfromell(E);
mseval(W,xpm[1],[1/2,1/3])
E=ellinit([0,-1,1,-10,-20]);
[W,xpm]= msfromell(E,1);
mseval(W,xpm,[1/2,1/3])
E=ellinit([1,-1,1,-1,-14]);
[W,xpm]= msfromell(E,1);
mseval(W,xpm)
mseval(W,xpm,[0,1/3])

N = 227;
W = msinit(N,2,1);
mssplit(W, msnew(W))

N = 1000;
W = msinit(N,2,1);
matsize( msnew(W)[1] )
W = msinit(2, 4);
charpoly(mshecke(W, 2))

W = msinit(3, 6);
charpoly(mshecke(W, 2))

W = msinit(4, 4);
charpoly(mshecke(W, 3))

W = msinit(11, 4);
charpoly(mshecke(W, 2))

W = msinit(2, 8);
charpoly(mshecke(W, 2))
[g,R]=mspathgens(W)
mspathlog(W,g[1])
mspathlog(W,g[2])
mspathlog(W,[1/3,1/2])
mseval(W,[0,0])
s=msnew(W)[1][,1];
mseval(W,s)
mseval(W,s,[0,0])
mseval(W,s,g[1])
mseval(W,s,g[2])

W = msinit(11, 2);
T = mshecke(W, 3);
[S,E] = mscuspidal(W, 1)
E == mseisenstein(W)
S == mscuspidal(W)
msfromcusp(W,1)
msfromcusp(W,oo)
msfromcusp(W,1/2)

W = msinit(23,2, 1);
V = mssplit(W, msnew(W));
msqexpansion(W, V[1], 30)
msqexpansion(W, V[1])

M=msinit(603,2,1);L=msnew(M);V=mssplit(M,L);
Set([v|v<-vector(#V,i,msqexpansion(M,V[i])),type(v[1])=="t_INT"])

W = msinit(6,4);
m=msatkinlehner(W,1)
matdet(m)
m=msatkinlehner(W,2)
matdet(m)
m=msatkinlehner(W,3)
matdet(m)
m=msatkinlehner(W,6)
matdet(m)
msatkinlehner(W,4)
msstar(W)

N = msnew(W)[1];
s = N[,1];
msissymbol(W,s)
S = mseval(W,s);
msissymbol(W,S)
T=S; T[3]++;
msissymbol(W,T)

M = msinit(7,8, 1);
N = msnew(M)[1];
s = N[,1];
S = mseval(M,s);
msissymbol(M, S)

W=msinit(17,2);
G=mspathgens(W)[1];
vector(#G,i,mspathlog(W,G[i]))

/* slow
W=msinit(96,6,1);
matsize(msnew(W)[1])
*/

check(N,k)=
{
  M=msinit(N,k,1);
  S=mssplit(M,msnew(M));
  for(i=1, #S,
    f = msqexpansion(M,S[i],2)[1];
    mod = if(type(f)=="t_INT", x, f.mod);
    if(polsturm(mod)!=poldegree(mod), error([N,k,i],":",f,": not real"));
    print(poldegree(mod));
  );
}
check(49,4)
check(49,6)
check(64,4)
check(64,6)

M=msinit(14,2,1);
S=mscuspidal(M);
mshecke(M,2)
mshecke(M,2,S)
