|
4 | 4 | The data on devmirror is provisional and only partially loaded, so tests |
5 | 5 | that depend on database content use runtime skip guards rather than |
6 | 6 | 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. |
7 | 61 | """ |
8 | 62 |
|
9 | 63 | import re |
@@ -278,3 +332,186 @@ def test_sidebar(self): |
278 | 332 | self.check("Source", "Source of Siegel modular form data") |
279 | 333 | self.check("Reliability", "Reliability of Siegel modular form data") |
280 | 334 | 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°ree=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°ree=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°ree=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