Opened 3 weeks ago

Last modified 3 weeks ago

#28275 needs_review enhancement

Implement isomorphism testing for modular abelian varieties

Reported by: klui Owned by:
Priority: major Milestone: sage-8.9
Component: modular forms Keywords: modular abelian variety isomorphism testing
Cc: was Merged in:
Authors: Kevin Lui Reviewers:
Report Upstream: N/A Work issues:
Branch: u/klui/better_is_isomorphism (Commits) Commit: be26efc2b894db924917423e9fab96df437adaef
Dependencies: Stopgaps:

Description (last modified by klui)

This ticket implements isomorphism testing for modular abelian varieties. This code was used for parts of my thesis.

Algorithm

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.

Bonus Tests

Isomorphic to Dual?

This code determines which simple subvarieties of the new subvariety of J0(N) is isomorphic to its dual.

# about 2 minutes on i5-8350U
from sage.all import J0

not_isomorphic_to_dual = []
for N in range(1, 100):
    Jnew = J0(N).new_subvariety()
    for A in Jnew:
        Ad = A.dual()[0]
        buul, f, _ = A.is_isomorphic(Ad, both_maps=True)
        if not buul:
            not_isomorphic_to_dual.append((A.label(), A.dimension(),
                                          A.hecke_operator(2).matrix().minpoly()))
        else:
            assert(f.matrix().determinant().abs() == 1)
print(not_isomorphic_to_dual)

which yields these 4 abelian varieties:

[('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)]

The corresponding Magma should be:

for N in [1..99] do
    D := Decomposition(NewSubvariety(JZero(N)));
    for A in D do
        Ad := Dual(A);
        try
            buul := IsIsomorphic(A, Ad);
            if not buul then
                A, Dimension(A), MinimalPolynomial(HeckeOperator(A, 2));
            end if;
        catch e
            print "The following yields an error!!!";
            A, Dimension(A), MinimalPolynomial(HeckeOperator(A, 2));
        end try;
    end for;
end for;

which yields the same 4 abelian varieties:

Modular abelian variety image(69B) of dimension 2, level 3*23 and conductor 3^2*23^2 over Q
2 x^2 - 5
Modular abelian variety image(77D) of dimension 2, level 7*11 and conductor 7^2*11^2 over Q
2 x^2 - 5
The following yields an error!!!
Modular abelian variety image(81A) of dimension 2, level 3^4 and conductor 3^8 over Q
2 x^2 - 3
The following yields an error!!!
Modular abelian variety image(85C) of dimension 2, level 5*17 and conductor 5^2*17^2 over Q
2 x^2 - 3

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

IsIsomorphic(
A: Modular abelian variety image(81A) of dimension 2, level 3^4...,
B: Modular abelian variety of dimension 2 and level 3^4 over Q
)
CanDetermineIsomorphism(
A: Modular abelian variety image(81A) of dimension 2, level 3^4...,
B: Modular abelian variety of dimension 2 and level 3^4 over Q
)
In file "/home/user/magma-2.18/package/Geometry/ModAbVar/modabvar.m", line 1072, column 23:
>>                 Append(~X, K!y);
                         ^
Runtime error in 'Append': Bad argument types
Argument types given: *nothing ~, FldNumElt[FldRat]

A is isomorphic to (A/A.torsion_subgroup(3))[0]

Here we check that A is isomorphic to (A/A.torsion_subgroup(3))[0].

# about 18 seconds on i5-8350U
from sage.all import J0

for N in range(1, 50):
    Jnew = J0(N).new_subvariety()
    for A in Jnew:
        B = (A / A.torsion_subgroup(3))[0]
        buul, f, _ = A.is_isomorphic(B, both_maps=True)
        assert(f.matrix().determinant().abs() == 1)

Change History (9)

comment:1 Changed 3 weeks ago by klui

  • Branch set to u/klui/better_is_isomorphism

comment:2 Changed 3 weeks ago by klui

  • Authors set to Kevin Lui
  • Cc was added
  • Commit set to 00d4814530222a39adca218247c22070601b650c
  • Description modified (diff)
  • Status changed from new to needs_review

Last 10 new commits:

9bdbb74Add doctest showing ValueError
7150526Explain why we assume GRH
299406fFix bug in in_Hf
78bed9bAdd a nonisomorphic example
2dc0f79Add doctest showing non-maximal order
f36566bAdd a return_false function
ed1dfdcChange a comment to better explain __contains__
11589bfRemove isogeny option
4dbeb30Explain why we assume GRH better
00d4814Add doctest to _im_gens

comment:3 follow-up: Changed 3 weeks ago by chapoton

doc does not build, because hecke_eigenvalue_field is not formatted properly.

EDIT: same problem in random_element

Last edited 3 weeks ago by chapoton (previous) (diff)

comment:4 Changed 3 weeks ago by git

  • Commit changed from 00d4814530222a39adca218247c22070601b650c to 6195fc4c12dc002e8c7d3e0528b544355757dbd8

Branch pushed to git repo; I updated commit sha1. New commits:

6195fc4Fix doc formatting

comment:5 in reply to: ↑ 3 Changed 3 weeks ago by klui

Replying to chapoton:

doc does not build, because hecke_eigenvalue_field is not formatted properly.

EDIT: same problem in random_element

Thanks! Hopefully this fixes it.

comment:6 Changed 3 weeks ago by git

  • Commit changed from 6195fc4c12dc002e8c7d3e0528b544355757dbd8 to 19bad569deb3a406b1f16d971d9690aa133acf15

Branch pushed to git repo; I updated commit sha1. New commits:

19bad56Remove unused matrix import

comment:7 follow-up: Changed 3 weeks ago by chapoton

  • please avoid using $ signs, use backticks ` instead
  • missing :: in the doc of isomorphic_order
  • in random_element doc, wrong position and formatting for OUTPUT:, that should be before the examples.

comment:8 Changed 3 weeks ago by git

  • Commit changed from 19bad569deb3a406b1f16d971d9690aa133acf15 to be26efc2b894db924917423e9fab96df437adaef

Branch pushed to git repo; I updated commit sha1. New commits:

a65ff66Change $ to `
be26efcFix docstring errors

comment:9 in reply to: ↑ 7 Changed 3 weeks ago by klui

Replying to chapoton:

  • please avoid using $ signs, use backticks ` instead
  • missing :: in the doc of isomorphic_order
  • in random_element doc, wrong position and formatting for OUTPUT:, that should be before the examples.

Opps. Thanks!

Note: See TracTickets for help on using tickets.