Function: mfsplit
Section: modular_forms
C-Name: mfsplit
Prototype: GD0,L,D0,L,
Help: mfsplit(mf,{dimlim=0},{flag=0}): mf containing the new space
 split the new space into Galois
 orbits of eigenforms of the newspace and return [vF,vK], where vF gives
 the (Galois orbit of) eigenforms in terms of mfbasis(mf) and vK is a list of
 polynomials defining each Galois orbit. If dimlim is set only the Galois
 orbits of dimension <= dimlim are computed (i.e. the rational eigenforms if
 dimlim = 1 and the character is real). Flag speeds up computations when the
 dimension is large: if flag = d > 0, when the dimension of the eigenspace
 is > d, only the Galois polynomial is computed.
Doc: \kbd{mf} from \kbd{mfinit} with integral weight containing the new space
 (either the new space itself or the cuspidal space or the full space), and
 preferably the newspace itself for efficiency, split the space into Galois
 orbits of eigenforms of the newspace, satisfying various restrictions.

 The functions returns $[vF, vK]$, where $vF$ gives (Galois orbit of)
 eigenforms and $vK$ is a list of polynomials defining each Galois orbit.
 The eigenforms are given in \kbd{mftobasis} format, i.e. as a matrix
 whose columns give the forms with respect to \kbd{mfbasis(mf)}.

 If \kbd{dimlim} is set, only the Galois orbits of dimension $\leq \kbd{dimlim}$
 are computed (i.e. the rational eigenforms if $\kbd{dimlim} = 1$ and the
 character is real). This can considerably speed up the function when a Galois
 orbit is defined over a large field.

 \kbd{flag} speeds up computations when the dimension is large: if $flag=d>0$,
 when the dimension of the eigenspace is $>d$, only the Galois polynomial is
 computed.

 Note that the function \kbd{mfeigenbasis} returns all eigenforms in an
 easier to use format (as modular forms which can be input as is in other
 functions); \kbd{mfsplit} is only useful when you can restrict
 to orbits of small dimensions, e.g. rational eigenforms.

 \bprog
 ? mf=mfinit([11,2],0); f=mfeigenbasis(mf)[1]; mfcoefs(f,16)
 %1 = [0, 1, -2, -1, ...]
 ? mf=mfinit([23,2],0); f=mfeigenbasis(mf)[1]; mfcoefs(f,16)
 %2 = [Mod(0, z^2 - z - 1), Mod(1, z^2 - z - 1), Mod(-z, z^2 - z - 1), ...]
 ? mf=mfinit([179,2],0); apply(poldegree, mffields(mf))
 %3 = [1, 3, 11]
 ? mf=mfinit([719,2],0);
 ? [vF,vK] = mfsplit(mf, 5); \\ fast when restricting to small orbits
 time = 192 ms.
 ? #vF  \\ a single orbit
 %5 = 1
 ? poldegree(vK[1]) \\ of dimension 5
 %6 = 5
 ? [vF,vK] = mfsplit(mf); \\ general case is slow
 time = 2,104 ms.
 ? apply(poldegree,vK)
 %8 = [5, 10, 45] \\ because degree 45 is large...
 @eprog
