Skip to content

Select the correct newform via traces in CMF GP and Magma code snippets - #7164

Open
roed-math wants to merge 5 commits into
LMFDB:mainfrom
roed-math:ai/t32-cmf-snippet-select
Open

Select the correct newform via traces in CMF GP and Magma code snippets#7164
roed-math wants to merge 5 commits into
LMFDB:mainfrom
roed-math:ai/t32-cmf-snippet-select

Conversation

@roed-math

Copy link
Copy Markdown
Contributor

Closes #5403.
Closes #6060.

The Pari/GP snippet on newform pages took f = lf[1] ("index may be different") and Magma had no selection at all, even though the eigenbasis order of GP/Magma often differs from the LMFDB order (e.g. PARI reverses 37.2.a and 34.2.c; Magma reverses 80.5.h, from #6059).

Following the Sage snippet from #6515, the GP and Magma snippets now select the newform whose absolute Hecke eigenvalue traces up to the newspace's trace bound match the stored traces.

The GP version computes traces from mfeigenbasis with a small abstrace helper (rescaling by degrees, since PARI represents coefficients in subtowers). The Magma version selects from NewformDecomposition(NewSubspace(CuspidalSubspace(ModularSymbols(chi,k,-1)))), because Newforms(CuspForms(chi,k)) in current Magma (V2.29-4) silently returns wrong eigenvalues in many character spaces (e.g. 32.2.g, 110.2.f, 102.2.h; verified against LMFDB data, PARI and Magma's own modular symbols).

Selection adds 0-1 ms in GP and at most ~0.2 s in Magma on all 19 tested labels, verified by running the generated snippets in both systems and comparing traces beyond the selection window; a snippet_test section now lets the snippet CI cover newform pages. For weight 1 the Magma snippet is omitted, since Magma has no weight-1 newforms (its init already errors there).


Ported from roed-math#28, where the full write-up and comment history live.

🤖 Generated with Claude Code

roed314 and others added 4 commits July 19, 2026 11:54
LMFDB#6060)

The GP snippet took f = lf[1] and Magma had no selection, although the
GP/Magma eigenbasis order often differs from the LMFDB order (PARI
reverses 37.2.a and 34.2.c; Magma reverses 80.5.h from LMFDB#6059).
Following the Sage snippet, select the orbit whose absolute eigenvalue
traces up to the newspace trace bound match the stored traces: in GP via
mfeigenbasis with an abstrace helper (rescaling by field degrees since
PARI represents coefficients in subtowers), in Magma via the modular
symbols NewformDecomposition, because Newforms(CuspForms(chi,k)) in
Magma V2.29-4 silently returns wrong eigenvalues in many character
spaces (32.2.g, 110.2.f, 102.2.h). Weight 1 keeps no Magma snippet
(Magma has no weight 1 newforms). Adds a snippet_test section so the
snippet CI covers newform pages.

Verified by running the rendered snippets and full code downloads in gp
and Magma for 19 newforms (incl. order-mismatch, nested-coefficient-
field, trace_bound 0 and weight 1 cases), comparing traces beyond the
selection window with the database; selection costs 0-1 ms in GP and
at most ~0.2 s in Magma.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The initialize-newspace-common anchor still ran

    S := CuspForms(chi, k);
    N := Newforms(S);

before the modular symbols selector, so every downloaded Magma script
executed the computation that this branch identifies as unreliable, left
N unused, and labelled it "Compute space of new eigenforms". Move the
Magma character construction and the NewformDecomposition into
initialize-newspace-weight-not-1, and let the newform block only select
the matching component of the already computed decomposition.

Weight 1 previously dropped Magma from just the newform and qexp
sections, so the inherited init block, the "Show commands" selector, the
Magma commands download and download_code all still offered a Magma
script that cannot work. Drop Magma from every section and from both
language lists instead, expose the result as WebNewform.code_langs so
that the downloads list cannot drift from the snippets, and let
download_code return 404 rather than a header-only script.

Add a Magma snippet log for 80.5.h.b, the regression case of LMFDB#6059:
Magma lists that orbit before 80.5.h.a, and the selected component
matches the stored traces well past the selection window. Since the
scheduled snippet workflow ignores Magma, also assert at the text level
that the download uses NewformDecomposition and the trace comprehension,
and never CuspForms or Newforms(S).

Move wrap_traces to module level and unit test it on 675.1.g.a, whose
trace bound of 46 makes the trace list wrap: each language gets a valid
multiline assignment, gp keeps its trailing backslash, and all three
round-trip to the stored traces.

Along the way, two fixes to generate_snippet_tests.py: -o gp selected
nothing, because pari was renamed to gp only after --only and --ignore
were applied; and Magma seeds its random number generator from the
clock, so a randomised NewformDecomposition printed a or -a from run to
run and no Magma log was reproducible. Reset the seed per snippet file,
and raise parisizemax, which the 8MB default makes too small for mfinit
of a weight 1 newspace of moderate level.
Magma seeds its RNG from the clock and several of its algorithms are
randomised, so a Magma snippet log is not reproducible: 80.5.h.b prints
its q-expansion in terms of a or -a depending on the run, and the
committed elliptic curve log is equally unstable (four runs of the
37.a1 snippet gave (0 : -1 : 1) three times and (0 : 0 : 1) once).

SetSeed does fix this, but it fixes it to a different generator than the
one that happens to be in the committed logs, so turning it on requires
regenerating every Magma log in the repository. That is a repository
wide change and does not belong in a PR about the CMF snippets, so leave
the behaviour alone and just record the finding where the rest of the
Magma handling is explained.
LMFDB uses American spelling, so "randomised" becomes "randomized" and
"Normalise" becomes "Normalize".  The latter comment describes the
normalize() defined on the next line, which was already American.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add/modify code snippets to select the correct newform to CMF pages CMF code snippets don't choose the correct form

2 participants