Skip to content

Commit ea1ad6c

Browse files
roed314claude
andcommitted
Recover mathematical assertions from the pre-rewrite SMF tests
Port every recoverable assertion from the old sample-based test_siegel_modular_forms.py onto the new smf_* pages, with all values re-verified against devmirror and against classical formulas: - Igusa cusp forms chi_10/chi_12 (2.S.1.10.0.a.b, 2.S.1.12.0.a.c): Saito-Kurokawa spin coefficients 240/21960/1317900 and 2784/107352/80234700, lifts of 1.18.a.a and 1.22.a.a - Siegel Eisenstein series of weight 12 (2.S.1.12.0.a.a): eigenvalues 2100225 = 1+2^10+2^11+2^21 etc., porting the old Sp4Z.24_E test (weight 24 no longer in the data) - Klingen-Eisenstein series in M_{10,2} and M_{10,10} (from Delta and 1.20.a.a), recovering the old Sp4Z_2/Sp4Z_j browse checks - the old Sp4Z.18_Maass sample: defining polynomial x^2 - x - 589050 and the 1.34.a.a lift on 2.S.1.18.0.a.c - paramodular level 277: dim S_3(K(277)) = 56 = 33 (P) + 23 (G), Atkin-Lehner split 1/55, and the rational eigenform's Dirichlet series - numeric dimension tables: Igusa's dim M_k(Sp(4,Z)) sequence on both dimension-search routes (values match the retired dimensions.py formulas exactly), weight-3 paramodular dims at levels 270-280, and dim S_{14,2}(Gamma_0(2)) = 16 from the old Gamma0_2 table - header comment cataloguing what is NOT recoverable (smf_samples pages, weight-24/56 samples, weight-2 Poor-Yuen paramodular forms, degree 3/4 data, Gamma1_2/Gamma0_4*/psi/half-integral tables) and two data discrepancies found while verifying: the stored lambda_p of 2.S.1.18.0.a.c adds the Eisenstein summand 196608 to both coordinates, and new Gamma_0(3) totals are 3 short of the classical dimensions at even weights (Eisenstein types beyond F/Q not counted) The deleted test_smf.py needed no recovery: it was a byte-identical stray copy of classical_modular_forms/test_cmf.py (GL2 content only). 25 tests pass (was 17), pyflakes clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 71b249e commit ea1ad6c

1 file changed

Lines changed: 237 additions & 0 deletions

File tree

lmfdb/siegel_modular_forms/test_siegel_modular_forms.py

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,60 @@
44
The data on devmirror is provisional and only partially loaded, so tests
55
that depend on database content use runtime skip guards rather than
66
failing when a table or label has not been loaded yet.
7+
8+
Recovered content from the pre-rewrite tests
9+
--------------------------------------------
10+
The old test_siegel_modular_forms.py exercised the smf_samples-based pages
11+
(families Sp4Z, Sp4Z_2, Sp4Z_j, Gamma0_N, Kp, Sp6Z, Sp8Z). Wherever the
12+
same mathematical object exists in the new smf_* tables, its assertions
13+
have been ported below with values re-verified against the database and
14+
against the classical formulas (see test_igusa_cusp_forms,
15+
test_eisenstein_series, test_klingen_eisenstein, test_maass_spezialschar,
16+
test_paramodular_277, test_sp4z_dimension_tables, test_gamma0_2_dimensions).
17+
The old Sp4Z scalar dimension table (Igusa's numbers) and the old
18+
M_{k,2}(Gamma_0(2)) table agree exactly with the new smf_newspaces data.
19+
20+
Content of the old tests that is NOT recoverable on the new pages
21+
(re-add if/when the data or features return):
22+
* Sample pages driven by db.smf_samples (129 samples: Sp4Z 97, Sp4Z_2 12,
23+
Sp8Z 10, Sp6Z 2, Kp 8). The rewrite has no sample routes; smf_samples,
24+
smf_ev and smf_fc still exist on devmirror but are unused by the code.
25+
* Sp4Z.24_E (weight 24 Siegel Eisenstein): eigenvalue 35184384671745
26+
(= 1 + 2^22 + 2^23 + 2^45), the ev_index=19/fc_det UI, Fourier
27+
coefficients such as (0, 0, 25), and mod-p reduction (1000000007 ->
28+
384425457). Scalar level-1 data now stops at weight 20; the same
29+
eigenvalue formula is asserted at weight 12 in test_eisenstein_series.
30+
* Sp4Z.18_Maass eigenvalue "-144a + 135840" (= 135768 - b with
31+
b = 72*sqrt(2356201)): the newform 2.S.1.18.0.a.c exists (its defining
32+
polynomial x^2 - x - 589050 is asserted below), but smf_hecke_nf stores
33+
its lambda_2 as 135768 + 196607*b, i.e. the Eisenstein summand
34+
2^16 + 2^17 = 196608 was added to BOTH coordinates instead of only the
35+
rational one, so the displayed eigenvalue disagrees with the classical
36+
value and is not asserted. Its Fourier coefficients ("10a - 8340",
37+
dets (1,1,1), (2,2,2)) and the modulus-reduction UI are also gone.
38+
* Sp4Z.56_Ups ("interesting cusp form", "6085 bytes", "7912968 bytes"):
39+
no weight-56 data.
40+
* Kp weight-2 Poor--Yuen samples 2_PY2_{277,349,353,389,461,523,587+-}:
41+
the new paramodular (K) data starts at weight (3, 0).
42+
* Sp6Z (Miyawaki lifts, "Miyawaki (1)") and Sp8Z (Ikeda/Miyawaki lifts,
43+
"Other_II (2)"): no degree > 2 data in smf_newforms/smf_newspaces.
44+
* Old dimension-table families with no new counterpart: Gamma1_2 (no
45+
Gamma_1(N) family), Gamma0_4 (dim M_20 = 192), Gamma0_4_psi_4
46+
(dim M_40 = 495) and Gamma0_4_half (non-cusp 129 at k = 20): level 4,
47+
characters and half-integral weight are absent; Gamma0_3_psi_3
48+
(dim M_19 = 68): no nontrivial character orbits at level 3.
49+
* Gamma0_3 totals (e.g. dim M_20(Gamma_0(3)) = 74): the new
50+
2.S.3.20.0.a space has total_dim 71; the new tables are smaller by
51+
exactly 3 at every even weight (Eisenstein series beyond the F/Q types
52+
are not counted), so the old numbers are not asserted.
53+
* Gamma_2 tables decomposed by Sp(4,F_2) = S_6 irreps (columns 111111,
54+
3111, ...): the new principal-family (P) level-2 dimensions come from a
55+
different construction (total_dim in the tens of thousands) and do not
56+
match dim M_{k,j}(Gamma(2)); nothing asserted.
57+
Additionally, the deleted lmfdb/siegel_modular_forms/test_smf.py was a
58+
byte-identical stray copy (commit c0fdb6f551, Aug 2022) of
59+
classical_modular_forms/test_cmf.py; all of its GL(2) assertions live on
60+
in lmfdb/classical_modular_forms/, so nothing Siegel was lost with it.
761
"""
862

963
import re
@@ -278,3 +332,186 @@ def test_sidebar(self):
278332
self.check("Source", "Source of Siegel modular form data")
279333
self.check("Reliability", "Reliability of Siegel modular form data")
280334
self.check("Labels", "Labels for Siegel modular forms")
335+
336+
# ------------------------------------------------------------------
337+
# Mathematical content recovered from the pre-rewrite sample pages
338+
# (see the module docstring for the items that could not be ported).
339+
# All eigenvalues below were re-verified against classical formulas:
340+
# for a Saito-Kurokawa lift of f in S_{2k-2}(1) the spin coefficient
341+
# is a_p(f) + p^{k-2} + p^{k-1}, for the Klingen-Eisenstein series of
342+
# f in S_{k+j}(1) it is a_p(f)(1 + p^{k-2}), and for the weight-k
343+
# Siegel Eisenstein series it is 1 + p^{k-2} + p^{k-1} + p^{2k-3}.
344+
# ------------------------------------------------------------------
345+
346+
def test_igusa_cusp_forms(self):
347+
"""
348+
The Igusa cusp forms chi_10 and chi_12 (the weight-10 and weight-12
349+
cusp forms for Sp(4,Z)), which are Saito-Kurokawa lifts of the
350+
elliptic newforms 1.18.a.a and 1.22.a.a
351+
"""
352+
self.need_forms("2.S.1.10.0.a.b")
353+
self.check("2/S/1/10.0/a/b/", [
354+
"Newform orbit 2.S.1.10.0.a.b",
355+
"Saito-Kurokawa Lift (P)",
356+
# lambda_2 = -528 + 2^8 + 2^9, lambda_3 = -4284 + 3^8 + 3^9,
357+
# lambda_5 = -1025850 + 5^8 + 5^9
358+
"1 + 240 * 2^{-s} + 21960 * 3^{-s}",
359+
"1317900 * 5^{-s}",
360+
"Modular form 1.18.a.a",
361+
])
362+
self.need_forms("2.S.1.12.0.a.c")
363+
self.check("2/S/1/12.0/a/c/", [
364+
"Newform orbit 2.S.1.12.0.a.c",
365+
"Saito-Kurokawa Lift (P)",
366+
# lambda_2 = -288 + 2^10 + 2^11, lambda_3 = -128844 + 3^10 + 3^11,
367+
# lambda_5 = 21640950 + 5^10 + 5^11
368+
"1 + 2784 * 2^{-s} + 107352 * 3^{-s}",
369+
"80234700 * 5^{-s}",
370+
"Modular form 1.22.a.a",
371+
])
372+
self.check("download_traces/2.S.1.12.0.a.c",
373+
"[0, 1, 2784, 107352, -1778648202240, 80234700")
374+
375+
def test_eisenstein_series(self):
376+
"""
377+
The Siegel Eisenstein series of weight 12 for Sp(4,Z). This ports
378+
the old Sp4Z.24_E eigenvalue test (weight 24 is not in the new
379+
data): the eigenvalue formula 1 + p^{k-2} + p^{k-1} + p^{2k-3} gave
380+
35184384671745 for k=24, p=2 and gives 2100225 for k=12, p=2.
381+
"""
382+
self.need_forms("2.S.1.12.0.a.a")
383+
self.check("2/S/1/12.0/a/a/", [
384+
"Newform orbit 2.S.1.12.0.a.a",
385+
"Siegel-Eisenstein (F)",
386+
# 1 + 2^10 + 2^11 + 2^21 and 1 + 3^10 + 3^11 + 3^21
387+
"1 + 2100225 * 2^{-s} + 10460589400 * 3^{-s}",
388+
"476837216796876 * 5^{-s}",
389+
])
390+
391+
def test_klingen_eisenstein(self):
392+
"""
393+
Klingen-Eisenstein series in the vector-valued spaces M_{10,2} and
394+
M_{10,10} for Sp(4,Z), attached to the elliptic newforms 1.12.a.a
395+
(Delta) and 1.20.a.a; this recovers the old Sp4Z_2/Sp4Z_j browse
396+
pages with sharper content
397+
"""
398+
self.need_forms("2.S.1.10.2.a.a")
399+
self.check("2/S/1/10.2/a/a/", [
400+
"Newform orbit 2.S.1.10.2.a.a",
401+
"Klingen-Eisenstein (Q)",
402+
# tau(2)(1 + 2^8) = -6168, tau(3)(1 + 3^8) = 1653624
403+
"1 - 6168 * 2^{-s} + 1653624 * 3^{-s}",
404+
"Modular form 1.12.a.a",
405+
])
406+
self.need_forms("2.S.1.10.10.a.a")
407+
self.check("2/S/1/10.10/a/a/", [
408+
"Newform orbit 2.S.1.10.10.a.a",
409+
"Klingen-Eisenstein (Q)",
410+
# a_2(1.20.a.a)(1 + 2^8) = 456*257, a_3(1.20.a.a)(1 + 3^8) = 50652*6562
411+
"1 + 117192 * 2^{-s} + 332378424 * 3^{-s}",
412+
"Modular form 1.20.a.a",
413+
])
414+
415+
def test_maass_spezialschar(self):
416+
"""
417+
The old Sp4Z.18_Maass sample: the weight-18 Maass spezialschar
418+
(Saito-Kurokawa) eigenform with coefficient field
419+
Q[x]/(x^2 - x - 589050), the lift of the elliptic newform 1.34.a.a.
420+
(Its stored Hecke eigenvalues are not asserted; see the module
421+
docstring.)
422+
"""
423+
self.need_forms("2.S.1.18.0.a.c")
424+
self.check("2/S/1/18.0/a/c/", [
425+
"Newform orbit 2.S.1.18.0.a.c",
426+
"(18, 0)",
427+
"Saito-Kurokawa Lift (P)",
428+
"x^{2} - x - 589050",
429+
"Modular form 1.34.a.a",
430+
])
431+
432+
def test_paramodular_277(self):
433+
"""
434+
Weight-3 paramodular forms of level 277 (the level emphasized on
435+
the old Kp browse page): dim S_3(K(277)) = 56 = 33 (Saito-Kurokawa)
436+
+ 23 (general type), with Atkin-Lehner/Fricke split 1/55, and the
437+
rational general-type eigenform 2.K.277.3.0.a.a
438+
"""
439+
self.need_spaces("2.K.277.3.0.a")
440+
self.check("2/K/277/3.0/a/", [
441+
"S_{3,0}(K(277))",
442+
"Cusp forms 56 0 56",
443+
"Saito-Kurokawa lifts (P) 33 0 33",
444+
"General type (G) 23 0 23",
445+
r"\(+\) \(1\) \(1\) \(-\) \(55\) \(22\)",
446+
"2.K.277.3.0.a.a",
447+
])
448+
self.need_forms("2.K.277.3.0.a.a")
449+
self.check("2/K/277/3.0/a/a/", [
450+
"Newform orbit 2.K.277.3.0.a.a",
451+
"General type (G)",
452+
"1 - 5 * 2^{-s} - 10 * 3^{-s} + 7 * 4^{-s}",
453+
])
454+
455+
def test_sp4z_dimension_tables(self):
456+
"""
457+
Numeric dimension tables for scalar-valued Siegel modular forms of
458+
level 1 (Igusa's classical dimensions, as served by the old Sp4Z
459+
dimension table): dim M_k(Sp(4,Z)) for k = 4..20 is
460+
1,0,1,0,1,0,2,0,3,0,2,0,4,0,4,0,5 and the newform dimensions
461+
include dim S_10 = dim S_12 = 1
462+
"""
463+
self.need_spaces("2.S.1.12.0.a")
464+
self.need_forms("2.S.1.12.0.a.a")
465+
# space dimensions (full spaces M_{k,0}(Sp(4,Z)))
466+
self.check("?search_type=SpaceDimensions&degree=2&family=S&level=1&weight=1-20", [
467+
"The dimensions shown are for spaces of modular forms",
468+
"(4, 0) 1 (5, 0) 0 (6, 0) 1 (7, 0) 0 (8, 0) 1 (9, 0) 0 (10, 0) 2 (11, 0) 0 (12, 0) 3",
469+
"(14, 0) 2 (15, 0) 0 (16, 0) 4 (17, 0) 0 (18, 0) 4 (19, 0) 0 (20, 0) 5",
470+
])
471+
# newform dimensions (including the odd-weight Saito-Kurokawa forms)
472+
self.check("?search_type=Dimensions&degree=2&family=S&level=1&weight=6-20", [
473+
"The dimensions shown below are for the space of newforms",
474+
"(10, 0) 2 (11, 0) 1 (12, 0) 3",
475+
"(16, 0) 4 (17, 0) 2 (18, 0) 4 (19, 0) 3 (20, 0) 5",
476+
])
477+
# the weight-12 space page: 3 = Eisenstein (F) + Klingen (Q) + Maass (P),
478+
# with the eigenvalue columns of the decomposition table
479+
self.check("2/S/1/12.0/a/", [
480+
"M_{12,0}",
481+
"2.S.1.12.0.a.a", "2.S.1.12.0.a.b", "2.S.1.12.0.a.c",
482+
"2100225", # Siegel Eisenstein lambda_2
483+
"-24600", # Klingen-Eisenstein lambda_2 = tau(2)(1 + 2^10)
484+
"2784", # chi_12 lambda_2
485+
])
486+
self.check("2/S/1/10.0/a/", [
487+
"M_{10,0}",
488+
"131841", # Siegel Eisenstein lambda_2 = 1 + 2^8 + 2^9 + 2^17
489+
"240", # chi_10 lambda_2
490+
])
491+
# old browse pages Sp4Z_2/10/ and Sp4Z_j/10/10/
492+
self.need_spaces("2.S.1.10.2.a")
493+
self.check("2/S/1/10.2/a/", "M_{10,2}")
494+
self.need_spaces("2.S.1.10.10.a")
495+
self.check("2/S/1/10.10/a/", "M_{10,10}")
496+
497+
def test_paramodular_dimension_table(self):
498+
"""
499+
Weight-3 paramodular newform dimensions around level 277
500+
"""
501+
self.need_spaces("2.K.277.3.0.a")
502+
self.check("?search_type=Dimensions&degree=2&family=K&weight=3&level=270-280", [
503+
"Level 270 271 272 273 274 275 276 277 278 279 280",
504+
"(3, 0) 16 48 19 31 33 30 14 56 25 29 19",
505+
])
506+
507+
def test_gamma0_2_dimensions(self):
508+
"""
509+
The old Gamma0_2 dimension table M_{k,2}(Gamma_0(2)): the new
510+
smf_newspaces dimensions agree with the classical generating
511+
function exactly (e.g. dim S_{14,2}(Gamma_0(2)) = 16)
512+
"""
513+
self.need_spaces("2.S.2.14.2.a")
514+
self.check("2/S/2/14.2/a/", [
515+
"S_{14,2}(\\Gamma_0(2))",
516+
"Cusp forms 16 0 16",
517+
])

0 commit comments

Comments
 (0)