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