1 | | This ticket implements isomorphism testing for modular abelian varieties. |
| 1 | This ticket implements isomorphism testing for modular abelian varieties. This code was used for parts of my thesis. |
| 2 | |
| 3 | = Algorithm = |
| 4 | |
| 5 | The algorithm used here is described in Algorithm 2.11 here: https://wstein.org/papers/current/modabvar/modabvar.pdf . This is the same algorithm that William Stein implemented in Magma. |
| 6 | |
| 7 | = Bonus Tests = |
| 8 | |
| 9 | == Isomorphic to Dual? == |
| 10 | |
| 11 | This code determines which simple subvarieties of the new subvariety of `J0(N)` is isomorphic to its dual. |
| 12 | {{{ |
| 13 | # about 2 minutes on i5-8350U |
| 14 | from sage.all import J0 |
| 15 | |
| 16 | not_isomorphic_to_dual = [] |
| 17 | for N in range(1, 100): |
| 18 | Jnew = J0(N).new_subvariety() |
| 19 | for A in Jnew: |
| 20 | Ad = A.dual()[0] |
| 21 | buul, f, _ = A.is_isomorphic(Ad, both_maps=True) |
| 22 | if not buul: |
| 23 | not_isomorphic_to_dual.append((A.label(), A.dimension(), |
| 24 | A.hecke_operator(2).matrix().minpoly())) |
| 25 | else: |
| 26 | assert(f.matrix().determinant().abs() == 1) |
| 27 | print(not_isomorphic_to_dual) |
| 28 | }}} |
| 29 | which yields these 4 abelian varieties: |
| 30 | {{{ |
| 31 | [('69b(1,69)', 2, x^2 - 5), ('77d(1,77)', 2, x^2 - 5), ('81a(1,81)', 2, x^2 - 3), ('85c(1,85)', 2, x^2 - 3)] |
| 32 | }}} |
| 33 | |
| 34 | The corresponding Magma should be: |
| 35 | {{{ |
| 36 | for N in [1..99] do |
| 37 | D := Decomposition(NewSubvariety(JZero(N))); |
| 38 | for A in D do |
| 39 | Ad := Dual(A); |
| 40 | try |
| 41 | buul := IsIsomorphic(A, Ad); |
| 42 | if not buul then |
| 43 | A, Dimension(A), MinimalPolynomial(HeckeOperator(A, 2)); |
| 44 | end if; |
| 45 | catch e |
| 46 | print "The following yields an error!!!"; |
| 47 | A, Dimension(A), MinimalPolynomial(HeckeOperator(A, 2)); |
| 48 | end try; |
| 49 | end for; |
| 50 | end for; |
| 51 | }}} |
| 52 | which yields the same 4 abelian varieties: |
| 53 | {{{ |
| 54 | Modular abelian variety image(69B) of dimension 2, level 3*23 and conductor 3^2*23^2 over Q |
| 55 | 2 x^2 - 5 |
| 56 | Modular abelian variety image(77D) of dimension 2, level 7*11 and conductor 7^2*11^2 over Q |
| 57 | 2 x^2 - 5 |
| 58 | The following yields an error!!! |
| 59 | Modular abelian variety image(81A) of dimension 2, level 3^4 and conductor 3^8 over Q |
| 60 | 2 x^2 - 3 |
| 61 | The following yields an error!!! |
| 62 | Modular abelian variety image(85C) of dimension 2, level 5*17 and conductor 5^2*17^2 over Q |
| 63 | 2 x^2 - 3 |
| 64 | }}} |
| 65 | |
| 66 | When this code claims `A` is not isomorphic to `A.dual()[0]`, Magma either agrees or gives a error with a traceback that looks like |
| 67 | {{{ |
| 68 | IsIsomorphic( |
| 69 | A: Modular abelian variety image(81A) of dimension 2, level 3^4..., |
| 70 | B: Modular abelian variety of dimension 2 and level 3^4 over Q |
| 71 | ) |
| 72 | CanDetermineIsomorphism( |
| 73 | A: Modular abelian variety image(81A) of dimension 2, level 3^4..., |
| 74 | B: Modular abelian variety of dimension 2 and level 3^4 over Q |
| 75 | ) |
| 76 | In file "/home/user/magma-2.18/package/Geometry/ModAbVar/modabvar.m", line 1072, column 23: |
| 77 | >> Append(~X, K!y); |
| 78 | ^ |
| 79 | Runtime error in 'Append': Bad argument types |
| 80 | Argument types given: *nothing ~, FldNumElt[FldRat] |
| 81 | }}} |
| 82 | |
| 83 | == `A` is isomorphic to `(A/A.torsion_subgroup(3))[0]` |
| 84 | |
| 85 | Here we check that `A` is isomorphic to `(A/A.torsion_subgroup(3))[0]`. |
| 86 | {{{ |
| 87 | # about 18 seconds on i5-8350U |
| 88 | from sage.all import J0 |
| 89 | |
| 90 | for N in range(1, 50): |
| 91 | Jnew = J0(N).new_subvariety() |
| 92 | for A in Jnew: |
| 93 | B = (A / A.torsion_subgroup(3))[0] |
| 94 | buul, f, _ = A.is_isomorphic(B, both_maps=True) |
| 95 | assert(f.matrix().determinant().abs() == 1) |
| 96 | }}} |