Skip to content

Performance testing #33

@AndrewVSutherland

Description

@AndrewVSutherland

This isn't really an issue per se, but I thought it might be helpful to post a simple performance test that I think does a good job of measuring the difficulty of decomposing Jacobians of modular curves X_H into isotypic subspaces. If you can improve the performance of ModFrmGL2 on this test, I think lots of other things will improve, which makes it a good test.

Consider the subgroup H:= sub<GL(2,Z/NZ)|[*,0,0,1]> corresponding to the modular curve X_arith(N). While it's not true that every X_H of level N admits a map to this curve, many of the families we care about do, and every modular abelian varity that is an isogeny factor of some J_H of level N appears as an isogeny factor of J_arith(N). So if you can decompose J_arith(N), I'm confident you can decompose J_H for any H of level N.

Here is a simple code snippet that attempts to decompose J_arith(N) into isotypic subspaces for 6 <= N <= 100 using ModFrmGL2 (we start at 6 because g(J_arith(N))=0 for N < 6). For N <= 70 against the LMFDB if you click the "decomposition" option in the columns to display. The numbers won't match exactly because Decomposition stops at isotypic subspaces, so the decompostion in the LMFDB will be a refinement of that returned by Decomposition (there is already a difference at N=8 because 32.2.a.a occurs twice).

AttachSpec("ModFrmGL2/ModFrmGL2.spec");
GL2Arith := func<N|sub<GL(2,R)|[[g[1][1],0,0,1]:g in Generators(GL(1,R))]> where R:=Integers(N)>;
for N in [6..100] do
    time H:=RealTypeConjugate(PSL2Subgroup(GL2Arith(N)));
    time S:=CuspidalSubspace(ModularSymbols(H,2,Rationals(),0));
    time D:=Decomposition(S,HeckeBound(S));
    print N,[Dimension(V)/2:V in D];
end for;

Here are the results I was able to get within 4 hours:

Time: 0.030
Time: 0.050
Time: 1.790
6 [ 1 ]
Time: 0.030
Time: 0.150
Time: 0.010
7 [ 1, 2 ]
Time: 0.030
Time: 0.180
Time: 18.650
8 [ 1, 2, 2 ]
Time: 0.040
Time: 0.410
Time: 0.140
9 [ 2, 2, 2, 4 ]
Time: 0.060
Time: 0.490
Time: 245.870
10 [ 1, 2, 2, 2, 2, 4 ]
Time: 0.100
Time: 1.580
Time: 0.700
11 [ 1, 1, 1, 1, 2, 4, 4, 4, 4, 4 ]
Time: 0.090
Time: 1.030
Time: 1515.430
12 [ 1, 1, 2, 2, 2, 3, 4, 4, 6 ]
Time: 0.190
Time: 4.500
Time: 4.390
13 [ 2, 2, 2, 3, 3, 4, 4, 6, 6, 6, 12 ]
Time: 0.180
Time: 3.460
Time: 7249.930
14 [ 1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 4, 6, 8 ]

Here are some results for higher prime levels (which seem to be easier despite having larger genus relative to N)

Time: 0.510
Time: 20.940
Time: 107.570
17 [ 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 6, 8, 8, 8, 8, 12, 16, 24 ]
Time: 0.800
Time: 50.820
Time: 434.720
19 [ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 12, 12, 12, 12, 12, 24 ]
Time: 1.910
Time: 146.280
Time: 4953.130
23 [ 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 30, 40, 40 ]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions