Manin relations for overconvergent modular symbols¶
Code to create the Manin Relations class, which solves the “Manin relations”.
That is, a description of
AUTHORS:
Robert Pollack, Jonathan Hanke (2012): initial version
- sage.modular.pollack_stevens.fund_domain.M2Z(x)[source]¶
Create an immutable
integer matrix fromx.INPUT:
x– anything that can be converted into a matrix
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import M2Z sage: M2Z([1,2,3,4]) [1 2] [3 4] sage: M2Z(1) [1 0] [0 1]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import M2Z >>> M2Z([Integer(1),Integer(2),Integer(3),Integer(4)]) [1 2] [3 4] >>> M2Z(Integer(1)) [1 0] [0 1]
from sage.modular.pollack_stevens.fund_domain import M2Z M2Z([1,2,3,4]) M2Z(1)
- class sage.modular.pollack_stevens.fund_domain.ManinRelations(N)[source]¶
Bases:
PollackStevensModularDomainThis class gives a description of
as a -module.INPUT:
N– positive integer, the level of to work with
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: ManinRelations(1) Manin Relations of level 1 sage: ManinRelations(11) Manin Relations of level 11
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> ManinRelations(Integer(1)) Manin Relations of level 1 >>> ManinRelations(Integer(11)) Manin Relations of level 11
from sage.modular.pollack_stevens.fund_domain import ManinRelations ManinRelations(1) ManinRelations(11)
Large values of
Nare not supported:sage: ManinRelations(2^20) Traceback (most recent call last): ... OverflowError: Modulus is too large (must be <= 46340)
>>> from sage.all import * >>> ManinRelations(Integer(2)**Integer(20)) Traceback (most recent call last): ... OverflowError: Modulus is too large (must be <= 46340)
ManinRelations(2^20)
- fd_boundary(C)[source]¶
Find matrices whose associated unimodular paths give the boundary of a fundamental domain.
Here the fundamental domain is for
. (In the case when has elements of order three the shape cut out by these unimodular matrices is a little smaller than a fundamental domain. See Section 2.5 of [PS2011].)INPUT:
C– list of rational numbers coming fromself.form_list_of_cusps()
OUTPUT:
A list of
integer matrices of determinant 1 whose associated unimodular paths give the boundary of a fundamental domain for (or nearly so in the case of 3-torsion).EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: C = A.form_list_of_cusps(); C [-1, -2/3, -1/2, -1/3, 0] sage: A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1] ] sage: A = ManinRelations(13) sage: C = A.form_list_of_cusps(); C [-1, -2/3, -1/2, -1/3, 0] sage: A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1] ] sage: A = ManinRelations(101) sage: C = A.form_list_of_cusps(); C [-1, -6/7, -5/6, -4/5, -7/9, -3/4, -11/15, -8/11, -5/7, -7/10, -9/13, -2/3, -5/8, -13/21, -8/13, -3/5, -7/12, -11/19, -4/7, -1/2, -4/9, -3/7, -5/12, -7/17, -2/5, -3/8, -4/11, -1/3, -2/7, -3/11, -1/4, -2/9, -1/5, -1/6, 0] sage: A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [-1 -3] [-3 -2] [0 1], [-1 0], [ 1 6], [ 6 5], [ 5 9], [ 9 4], [ 4 11], [11 7], [-2 -1] [-1 -4] [-4 -3] [-3 -2] [-2 -7] [-7 -5] [-5 -3] [-3 -4] [ 7 3], [ 3 11], [11 8], [ 8 5], [ 5 17], [17 12], [12 7], [ 7 9], [-4 -1] [-1 -4] [ -4 -11] [-11 -7] [-7 -3] [-3 -8] [ -8 -13] [ 9 2], [ 2 7], [ 7 19], [ 19 12], [12 5], [ 5 13], [ 13 21], [-13 -5] [-5 -2] [-2 -9] [-9 -7] [-7 -5] [-5 -8] [ -8 -11] [ 21 8], [ 8 3], [ 3 13], [13 10], [10 7], [ 7 11], [ 11 15], [-11 -3] [-3 -7] [-7 -4] [-4 -5] [-5 -6] [-6 -1] [ 15 4], [ 4 9], [ 9 5], [ 5 6], [ 6 7], [ 7 1] ]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> C = A.form_list_of_cusps(); C [-1, -2/3, -1/2, -1/3, 0] >>> A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1] ] >>> A = ManinRelations(Integer(13)) >>> C = A.form_list_of_cusps(); C [-1, -2/3, -1/2, -1/3, 0] >>> A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1] ] >>> A = ManinRelations(Integer(101)) >>> C = A.form_list_of_cusps(); C [-1, -6/7, -5/6, -4/5, -7/9, -3/4, -11/15, -8/11, -5/7, -7/10, -9/13, -2/3, -5/8, -13/21, -8/13, -3/5, -7/12, -11/19, -4/7, -1/2, -4/9, -3/7, -5/12, -7/17, -2/5, -3/8, -4/11, -1/3, -2/7, -3/11, -1/4, -2/9, -1/5, -1/6, 0] >>> A.fd_boundary(C) [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [-1 -3] [-3 -2] [0 1], [-1 0], [ 1 6], [ 6 5], [ 5 9], [ 9 4], [ 4 11], [11 7], <BLANKLINE> [-2 -1] [-1 -4] [-4 -3] [-3 -2] [-2 -7] [-7 -5] [-5 -3] [-3 -4] [ 7 3], [ 3 11], [11 8], [ 8 5], [ 5 17], [17 12], [12 7], [ 7 9], <BLANKLINE> [-4 -1] [-1 -4] [ -4 -11] [-11 -7] [-7 -3] [-3 -8] [ -8 -13] [ 9 2], [ 2 7], [ 7 19], [ 19 12], [12 5], [ 5 13], [ 13 21], <BLANKLINE> [-13 -5] [-5 -2] [-2 -9] [-9 -7] [-7 -5] [-5 -8] [ -8 -11] [ 21 8], [ 8 3], [ 3 13], [13 10], [10 7], [ 7 11], [ 11 15], <BLANKLINE> [-11 -3] [-3 -7] [-7 -4] [-4 -5] [-5 -6] [-6 -1] [ 15 4], [ 4 9], [ 9 5], [ 5 6], [ 6 7], [ 7 1] ]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) C = A.form_list_of_cusps(); C A.fd_boundary(C) A = ManinRelations(13) C = A.form_list_of_cusps(); C A.fd_boundary(C) A = ManinRelations(101) C = A.form_list_of_cusps(); C A.fd_boundary(C)
- form_list_of_cusps()[source]¶
Return the intersection of a fundamental domain for
with the real axis.The construction of this fundamental domain follows the arguments of [PS2011] Section 2. The boundary of this fundamental domain consists entirely of unimodular paths when
has no elements of order 3. (See [PS2011] Section 2.5 for the case when there are elements of order 3.)OUTPUT:
A sorted list of rational numbers marking the intersection of a fundamental domain for
with the real axis.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.form_list_of_cusps() [-1, -2/3, -1/2, -1/3, 0] sage: A = ManinRelations(13) sage: A.form_list_of_cusps() [-1, -2/3, -1/2, -1/3, 0] sage: A = ManinRelations(101) sage: A.form_list_of_cusps() [-1, -6/7, -5/6, -4/5, -7/9, -3/4, -11/15, -8/11, -5/7, -7/10, -9/13, -2/3, -5/8, -13/21, -8/13, -3/5, -7/12, -11/19, -4/7, -1/2, -4/9, -3/7, -5/12, -7/17, -2/5, -3/8, -4/11, -1/3, -2/7, -3/11, -1/4, -2/9, -1/5, -1/6, 0]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.form_list_of_cusps() [-1, -2/3, -1/2, -1/3, 0] >>> A = ManinRelations(Integer(13)) >>> A.form_list_of_cusps() [-1, -2/3, -1/2, -1/3, 0] >>> A = ManinRelations(Integer(101)) >>> A.form_list_of_cusps() [-1, -6/7, -5/6, -4/5, -7/9, -3/4, -11/15, -8/11, -5/7, -7/10, -9/13, -2/3, -5/8, -13/21, -8/13, -3/5, -7/12, -11/19, -4/7, -1/2, -4/9, -3/7, -5/12, -7/17, -2/5, -3/8, -4/11, -1/3, -2/7, -3/11, -1/4, -2/9, -1/5, -1/6, 0]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.form_list_of_cusps() A = ManinRelations(13) A.form_list_of_cusps() A = ManinRelations(101) A.form_list_of_cusps()
- indices_with_three_torsion()[source]¶
A list of indices of coset representatives whose associated unimodular path contains a point fixed by a
element of order 3 in the ideal triangle directly below that path (the order is computed in ).EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(11) sage: MR.indices_with_three_torsion() [] sage: MR = ManinRelations(13) sage: MR.indices_with_three_torsion() [2, 5] sage: B = MR.reps(2); B [ 0 -1] [ 1 3]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(11)) >>> MR.indices_with_three_torsion() [] >>> MR = ManinRelations(Integer(13)) >>> MR.indices_with_three_torsion() [2, 5] >>> B = MR.reps(Integer(2)); B [ 0 -1] [ 1 3]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(11) MR.indices_with_three_torsion() MR = ManinRelations(13) MR.indices_with_three_torsion() B = MR.reps(2); B
The corresponding matrix of order three:
sage: A = MR.three_torsion_matrix(B); A [-4 -1] [13 3] sage: A^3 [1 0] [0 1]
>>> from sage.all import * >>> A = MR.three_torsion_matrix(B); A [-4 -1] [13 3] >>> A**Integer(3) [1 0] [0 1]
A = MR.three_torsion_matrix(B); A A^3
The columns of
Band the columns ofA*BandA^2*Bgive the same rational cusps:sage: B [ 0 -1] [ 1 3] sage: A*B, A^2*B ( [-1 1] [ 1 0] [ 3 -4], [-4 1] )
>>> from sage.all import * >>> B [ 0 -1] [ 1 3] >>> A*B, A**Integer(2)*B ( [-1 1] [ 1 0] [ 3 -4], [-4 1] )
B A*B, A^2*B
- indices_with_two_torsion()[source]¶
Return the indices of coset representatives whose associated unimodular path contains a point fixed by a
element of order 2 (where the order is computed in ).OUTPUT: list of integers
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(11) sage: MR.indices_with_two_torsion() [] sage: MR = ManinRelations(13) sage: MR.indices_with_two_torsion() [3, 4] sage: MR.reps(3), MR.reps(4) ( [-1 -1] [-1 -2] [ 3 2], [ 2 3] )
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(11)) >>> MR.indices_with_two_torsion() [] >>> MR = ManinRelations(Integer(13)) >>> MR.indices_with_two_torsion() [3, 4] >>> MR.reps(Integer(3)), MR.reps(Integer(4)) ( [-1 -1] [-1 -2] [ 3 2], [ 2 3] )
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(11) MR.indices_with_two_torsion() MR = ManinRelations(13) MR.indices_with_two_torsion() MR.reps(3), MR.reps(4)
The corresponding matrix of order 2:
sage: A = MR.two_torsion_matrix(MR.reps(3)); A [ 5 2] [-13 -5] sage: A^2 [-1 0] [ 0 -1]
>>> from sage.all import * >>> A = MR.two_torsion_matrix(MR.reps(Integer(3))); A [ 5 2] [-13 -5] >>> A**Integer(2) [-1 0] [ 0 -1]
A = MR.two_torsion_matrix(MR.reps(3)); A A^2
You can see that multiplication by
Ajust interchanges the rational cusps determined by the columns of the matrixMR.reps(3):sage: MR.reps(3), A*MR.reps(3) ( [-1 -1] [ 1 -1] [ 3 2], [-2 3] )
>>> from sage.all import * >>> MR.reps(Integer(3)), A*MR.reps(Integer(3)) ( [-1 -1] [ 1 -1] [ 3 2], [-2 3] )
MR.reps(3), A*MR.reps(3)
- is_unimodular_path(r1, r2)[source]¶
Determine whether two (non-infinite) cusps are connected by a unimodular path.
INPUT:
r1,r2– rational numbers
OUTPUT:
A boolean expressing whether or not a unimodular path connects
r1tor2.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.is_unimodular_path(0,1/3) True sage: A.is_unimodular_path(1/3,0) True sage: A.is_unimodular_path(0,2/3) False sage: A.is_unimodular_path(2/3,0) False
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.is_unimodular_path(Integer(0),Integer(1)/Integer(3)) True >>> A.is_unimodular_path(Integer(1)/Integer(3),Integer(0)) True >>> A.is_unimodular_path(Integer(0),Integer(2)/Integer(3)) False >>> A.is_unimodular_path(Integer(2)/Integer(3),Integer(0)) False
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.is_unimodular_path(0,1/3) A.is_unimodular_path(1/3,0) A.is_unimodular_path(0,2/3) A.is_unimodular_path(2/3,0)
- prep_hecke_on_gen(l, gen, modulus=None)[source]¶
This function does some precomputations needed to compute
.In particular, if
is a modular symbol and is the divisor associated to the generatorgen, to compute one needs to compute where runs through the matrices defining . One then takes and writes it as a sum of unimodular divisors. For each such unimodular divisor, say where is a matrix, we then write where is in and is one of our chosen coset representatives. Then . Thus, one hasas
runs over all coset representatives and simply runs over however many times appears in the above computation.Finally, the output of this function is a dictionary
Dwhose keys are the coset representatives inself.reps()where each value is a list of matrices, and the entries ofDsatisfy:INPUT:
l– a primegen– a generator
OUTPUT:
A list of lists (see above).
EXAMPLES:
sage: E = EllipticCurve('11a') sage: phi = E.pollack_stevens_modular_symbol() sage: phi.values() [-1/5, 1, 0] sage: M = phi.parent().source() sage: w = M.prep_hecke_on_gen(2, M.gens()[0]) sage: one = Matrix(ZZ,2,2,1) sage: one.set_immutable() sage: w[one] [[1 0] [0 2], [1 1] [0 2], [2 0] [0 1]]
>>> from sage.all import * >>> E = EllipticCurve('11a') >>> phi = E.pollack_stevens_modular_symbol() >>> phi.values() [-1/5, 1, 0] >>> M = phi.parent().source() >>> w = M.prep_hecke_on_gen(Integer(2), M.gens()[Integer(0)]) >>> one = Matrix(ZZ,Integer(2),Integer(2),Integer(1)) >>> one.set_immutable() >>> w[one] [[1 0] [0 2], [1 1] [0 2], [2 0] [0 1]]
E = EllipticCurve('11a') phi = E.pollack_stevens_modular_symbol() phi.values() M = phi.parent().source() w = M.prep_hecke_on_gen(2, M.gens()[0]) one = Matrix(ZZ,2,2,1) one.set_immutable() w[one]
- prep_hecke_on_gen_list(l, gen, modulus=None)[source]¶
Return the precomputation to compute
in a way that speeds up the Hecke calculation.Namely, returns a list of the form [h,A].
INPUT:
l– a primegen– a generator
OUTPUT:
A list of lists (see above).
EXAMPLES:
sage: E = EllipticCurve('11a') sage: phi = E.pollack_stevens_modular_symbol() sage: phi.values() [-1/5, 1, 0] sage: M = phi.parent().source() sage: len(M.prep_hecke_on_gen_list(2, M.gens()[0])) 4
>>> from sage.all import * >>> E = EllipticCurve('11a') >>> phi = E.pollack_stevens_modular_symbol() >>> phi.values() [-1/5, 1, 0] >>> M = phi.parent().source() >>> len(M.prep_hecke_on_gen_list(Integer(2), M.gens()[Integer(0)])) 4
E = EllipticCurve('11a') phi = E.pollack_stevens_modular_symbol() phi.values() M = phi.parent().source() len(M.prep_hecke_on_gen_list(2, M.gens()[0]))
- reps_with_three_torsion()[source]¶
A list of coset representatives whose associated unimodular path contains a point fixed by a
element of order 3 in the ideal triangle directly below that path (the order is computed in ).EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(13) sage: B = MR.reps_with_three_torsion()[0]; B [ 0 -1] [ 1 3]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(13)) >>> B = MR.reps_with_three_torsion()[Integer(0)]; B [ 0 -1] [ 1 3]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(13) B = MR.reps_with_three_torsion()[0]; B
The corresponding matrix of order three:
sage: A = MR.three_torsion_matrix(B); A [-4 -1] [13 3] sage: A^3 [1 0] [0 1]
>>> from sage.all import * >>> A = MR.three_torsion_matrix(B); A [-4 -1] [13 3] >>> A**Integer(3) [1 0] [0 1]
A = MR.three_torsion_matrix(B); A A^3
The columns of
Band the columns ofA*BandA^2*Bgive the same rational cusps:sage: B [ 0 -1] [ 1 3] sage: A*B, A^2*B ( [-1 1] [ 1 0] [ 3 -4], [-4 1] )
>>> from sage.all import * >>> B [ 0 -1] [ 1 3] >>> A*B, A**Integer(2)*B ( [-1 1] [ 1 0] [ 3 -4], [-4 1] )
B A*B, A^2*B
- reps_with_two_torsion()[source]¶
The coset representatives whose associated unimodular path contains a point fixed by a
element of order 2 (where the order is computed in ).OUTPUT: list of matrices
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(11) sage: MR.reps_with_two_torsion() [] sage: MR = ManinRelations(13) sage: MR.reps_with_two_torsion() [ [-1 -1] [-1 -2] [ 3 2], [ 2 3] ] sage: B = MR.reps_with_two_torsion()[0]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(11)) >>> MR.reps_with_two_torsion() [] >>> MR = ManinRelations(Integer(13)) >>> MR.reps_with_two_torsion() [ [-1 -1] [-1 -2] [ 3 2], [ 2 3] ] >>> B = MR.reps_with_two_torsion()[Integer(0)]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(11) MR.reps_with_two_torsion() MR = ManinRelations(13) MR.reps_with_two_torsion() B = MR.reps_with_two_torsion()[0]
The corresponding matrix of order 2:
sage: A = MR.two_torsion_matrix(B); A [ 5 2] [-13 -5] sage: A^2 [-1 0] [ 0 -1]
>>> from sage.all import * >>> A = MR.two_torsion_matrix(B); A [ 5 2] [-13 -5] >>> A**Integer(2) [-1 0] [ 0 -1]
A = MR.two_torsion_matrix(B); A A^2
You can see that multiplication by
Ajust interchanges the rational cusps determined by the columns of the matrixMR.reps(3):sage: B, A*B ( [-1 -1] [ 1 -1] [ 3 2], [-2 3] )
>>> from sage.all import * >>> B, A*B ( [-1 -1] [ 1 -1] [ 3 2], [-2 3] )
B, A*B
- three_torsion_matrix(A)[source]¶
Return the matrix of order two in
which corresponds to anAinself.reps_with_two_torsion().INPUT:
A– a matrix inself.reps_with_two_torsion()
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(37) sage: B = MR.reps_with_three_torsion()[0]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(37)) >>> B = MR.reps_with_three_torsion()[Integer(0)]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(37) B = MR.reps_with_three_torsion()[0]
The corresponding matrix of order 3:
sage: A = MR.three_torsion_matrix(B); A [-11 -3] [ 37 10] sage: A^3 [1 0] [0 1]
>>> from sage.all import * >>> A = MR.three_torsion_matrix(B); A [-11 -3] [ 37 10] >>> A**Integer(3) [1 0] [0 1]
A = MR.three_torsion_matrix(B); A A^3
- two_torsion_matrix(A)[source]¶
Return the matrix of order two in
which corresponds to anAinself.reps_with_two_torsion().INPUT:
A– a matrix inself.reps_with_two_torsion()
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(25) sage: B = MR.reps_with_two_torsion()[0]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(25)) >>> B = MR.reps_with_two_torsion()[Integer(0)]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(25) B = MR.reps_with_two_torsion()[0]
The corresponding matrix of order 2:
sage: A = MR.two_torsion_matrix(B); A [ 7 2] [-25 -7] sage: A^2 [-1 0] [ 0 -1]
>>> from sage.all import * >>> A = MR.two_torsion_matrix(B); A [ 7 2] [-25 -7] >>> A**Integer(2) [-1 0] [ 0 -1]
A = MR.two_torsion_matrix(B); A A^2
- unimod_to_matrices(r1, r2)[source]¶
Return the two matrices whose associated unimodular paths connect
r1andr2andr2andr1, respectively.INPUT:
r1,r2– rational numbers (that are assumed to be connected by a unimodular path)
OUTPUT: a pair of
matrices of determinant 1EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.unimod_to_matrices(0,1/3) ( [ 0 1] [1 0] [-1 3], [3 1] )
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.unimod_to_matrices(Integer(0),Integer(1)/Integer(3)) ( [ 0 1] [1 0] [-1 3], [3 1] )
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.unimod_to_matrices(0,1/3)
- class sage.modular.pollack_stevens.fund_domain.PollackStevensModularDomain(N, reps, indices, rels, equiv_ind)[source]¶
Bases:
SageObjectThe domain of a modular symbol.
INPUT:
N– positive integer, the level of the congruence subgroupreps– list of matrices, the coset representatives ofindices– list of integers; indices of elements inrepswhich are generatorsrels– list of list of triples(d, A, i), one for each coset representative ofrepswhich describes how to express the elements ofrepsin terms of generators specified byindices. Seerelations()for a detailed explanations of these triples.equiv_ind– dictionary which maps normalized coordinates on to an integer such that a matrix whose bottom row is equivalent to in is in the coset ofreps[equiv_ind[(a,b)]]
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import PollackStevensModularDomain, M2Z sage: PollackStevensModularDomain(2 , [M2Z([1,0,0,1]), M2Z([1,1,-1,0]), M2Z([0,-1,1,1])], [0,2], [[(1, M2Z([1,0,0,1]), 0)], [(-1,M2Z([-1,-1,0,-1]),0)], [(1, M2Z([1,0,0,1]), 2)]], {(0,1): 0, (1,0): 1, (1,1): 2}) Modular Symbol domain of level 2
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import PollackStevensModularDomain, M2Z >>> PollackStevensModularDomain(Integer(2) , [M2Z([Integer(1),Integer(0),Integer(0),Integer(1)]), M2Z([Integer(1),Integer(1),-Integer(1),Integer(0)]), M2Z([Integer(0),-Integer(1),Integer(1),Integer(1)])], [Integer(0),Integer(2)], [[(Integer(1), M2Z([Integer(1),Integer(0),Integer(0),Integer(1)]), Integer(0))], [(-Integer(1),M2Z([-Integer(1),-Integer(1),Integer(0),-Integer(1)]),Integer(0))], [(Integer(1), M2Z([Integer(1),Integer(0),Integer(0),Integer(1)]), Integer(2))]], {(Integer(0),Integer(1)): Integer(0), (Integer(1),Integer(0)): Integer(1), (Integer(1),Integer(1)): Integer(2)}) Modular Symbol domain of level 2
from sage.modular.pollack_stevens.fund_domain import PollackStevensModularDomain, M2Z PollackStevensModularDomain(2 , [M2Z([1,0,0,1]), M2Z([1,1,-1,0]), M2Z([0,-1,1,1])], [0,2], [[(1, M2Z([1,0,0,1]), 0)], [(-1,M2Z([-1,-1,0,-1]),0)], [(1, M2Z([1,0,0,1]), 2)]], {(0,1): 0, (1,0): 1, (1,1): 2})- P1()[source]¶
Return the Sage representation of
.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.P1() The projective line over the integers modulo 11
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.P1() The projective line over the integers modulo 11
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.P1()
- equivalent_index(A)[source]¶
Return the index of the coset representative equivalent to
A.Here by equivalent we mean the unique coset representative whose bottom row is equivalent to the bottom row of
Ain .INPUT:
A– an element of
OUTPUT:
The unique integer
jsatisfying that the bottom row ofself.reps(j)is equivalent to the bottom row ofA.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(11) sage: A = matrix(ZZ,2,2,[1,5,3,16]) sage: j = MR.equivalent_index(A); j 11 sage: MR.reps(11) [ 1 -1] [-1 2] sage: MR.equivalent_rep(A) [ 1 -1] [-1 2] sage: MR.P1().normalize(3,16) (1, 9)
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(11)) >>> A = matrix(ZZ,Integer(2),Integer(2),[Integer(1),Integer(5),Integer(3),Integer(16)]) >>> j = MR.equivalent_index(A); j 11 >>> MR.reps(Integer(11)) [ 1 -1] [-1 2] >>> MR.equivalent_rep(A) [ 1 -1] [-1 2] >>> MR.P1().normalize(Integer(3),Integer(16)) (1, 9)
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(11) A = matrix(ZZ,2,2,[1,5,3,16]) j = MR.equivalent_index(A); j MR.reps(11) MR.equivalent_rep(A) MR.P1().normalize(3,16)
- equivalent_rep(A)[source]¶
Return a coset representative that is equivalent to
Amodulo .INPUT:
A– a matrix in
OUTPUT:
The unique generator congruent to
Amodulo .EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = matrix([[5,3],[38,23]]) sage: ManinRelations(60).equivalent_rep(A) [-7 -3] [26 11]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = matrix([[Integer(5),Integer(3)],[Integer(38),Integer(23)]]) >>> ManinRelations(Integer(60)).equivalent_rep(A) [-7 -3] [26 11]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = matrix([[5,3],[38,23]]) ManinRelations(60).equivalent_rep(A)
- gen(n=0)[source]¶
Return the
-th generator.INPUT:
n– integer (default: 0); which generator is desired
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(137) sage: A.gen(17) [-4 -1] [ 9 2]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(137)) >>> A.gen(Integer(17)) [-4 -1] [ 9 2]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(137) A.gen(17)
- gens()[source]¶
Return the tuple of coset representatives chosen as generators.
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.gens() ( [1 0] [ 0 -1] [-1 -1] [0 1], [ 1 3], [ 3 2] )
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.gens() ( [1 0] [ 0 -1] [-1 -1] [0 1], [ 1 3], [ 3 2] )
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.gens()
- indices(n=None)[source]¶
Return the
-th index of the coset representatives which were chosen as our generators.In particular, the divisors associated to these coset representatives generate all divisors over
, and thus a modular symbol is uniquely determined by its values on these divisors.INPUT:
n– integer (default:None)
OUTPUT:
The
n-th index of the generating set inself.reps()or all indices ifnisNone.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.indices() [0, 2, 3] sage: A.indices(2) 3 sage: A = ManinRelations(13) sage: A.indices() [0, 2, 3, 4, 5] sage: A = ManinRelations(101) sage: A.indices() [0, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 23, 24, 26, 28]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.indices() [0, 2, 3] >>> A.indices(Integer(2)) 3 >>> A = ManinRelations(Integer(13)) >>> A.indices() [0, 2, 3, 4, 5] >>> A = ManinRelations(Integer(101)) >>> A.indices() [0, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 23, 24, 26, 28]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.indices() A.indices(2) A = ManinRelations(13) A.indices() A = ManinRelations(101) A.indices()
- level()[source]¶
Return the level
of that we work with.OUTPUT:
The integer
of the group for which the Manin Relations are being computed.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.level() 11
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.level() 11
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.level()
- ngens()[source]¶
Return the number of generators.
OUTPUT:
The number of coset representatives from which a modular symbol’s value on any coset can be derived.
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(1137) sage: A.ngens() 255
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(1137)) >>> A.ngens() 255
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(1137) A.ngens()
- relations(A=None)[source]¶
Express the divisor attached to the coset representative of
Ain terms of our chosen generators.INPUT:
A–None, an integer, or a coset representative (default:None)
OUTPUT:
A
-relation expressing the divisor attached toAin terms of the generating set. The relation is given as a list of triples(d, B, i)such that the divisor attached toAis the sum ofdtimes the divisor attached toB^{-1} * self.reps(i).If
Ais an integer, then return this data for theA-th coset representative.If
AisNone, then return this data in a list for all coset representatives.Note
These relations allow us to recover the value of a modular symbol on any coset representative in terms of its values on our generating set.
EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: MR = ManinRelations(11) sage: MR.indices() [0, 2, 3] sage: MR.relations(0) [(1, [1 0] [0 1], 0)] sage: MR.relations(2) [(1, [1 0] [0 1], 2)] sage: MR.relations(3) [(1, [1 0] [0 1], 3)]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> MR = ManinRelations(Integer(11)) >>> MR.indices() [0, 2, 3] >>> MR.relations(Integer(0)) [(1, [1 0] [0 1], 0)] >>> MR.relations(Integer(2)) [(1, [1 0] [0 1], 2)] >>> MR.relations(Integer(3)) [(1, [1 0] [0 1], 3)]
from sage.modular.pollack_stevens.fund_domain import ManinRelations MR = ManinRelations(11) MR.indices() MR.relations(0) MR.relations(2) MR.relations(3)
The fourth coset representative can be expressed through the second coset representative:
sage: MR.reps(4) [-1 -2] [ 2 3] sage: d, B, i = MR.relations(4)[0] sage: P = B.inverse()*MR.reps(i); P [ 2 -1] [-3 2] sage: d # the above corresponds to minus the divisor of A.reps(4) since d is -1 -1
>>> from sage.all import * >>> MR.reps(Integer(4)) [-1 -2] [ 2 3] >>> d, B, i = MR.relations(Integer(4))[Integer(0)] >>> P = B.inverse()*MR.reps(i); P [ 2 -1] [-3 2] >>> d # the above corresponds to minus the divisor of A.reps(4) since d is -1 -1
MR.reps(4) d, B, i = MR.relations(4)[0] P = B.inverse()*MR.reps(i); P d # the above corresponds to minus the divisor of A.reps(4) since d is -1
The sixth coset representative can be expressed as the sum of the second and the third:
sage: MR.reps(6) [ 0 -1] [ 1 2] sage: MR.relations(6) [(1, [1 0] [0 1], 2), (1, [1 0] [0 1], 3)] sage: MR.reps(2), MR.reps(3) # MR.reps(6) is the sum of these divisors ( [ 0 -1] [-1 -1] [ 1 3], [ 3 2] )
>>> from sage.all import * >>> MR.reps(Integer(6)) [ 0 -1] [ 1 2] >>> MR.relations(Integer(6)) [(1, [1 0] [0 1], 2), (1, [1 0] [0 1], 3)] >>> MR.reps(Integer(2)), MR.reps(Integer(3)) # MR.reps(6) is the sum of these divisors ( [ 0 -1] [-1 -1] [ 1 3], [ 3 2] )
MR.reps(6) MR.relations(6) MR.reps(2), MR.reps(3) # MR.reps(6) is the sum of these divisors
- reps(n=None)[source]¶
Return the
n-th coset representative associated with our fundamental domain.INPUT:
n– integer (default:None)
OUTPUT:
The
n-th coset representative or all coset representatives ifnisNone.EXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: A = ManinRelations(11) sage: A.reps(0) [1 0] [0 1] sage: A.reps(1) [ 1 1] [-1 0] sage: A.reps(2) [ 0 -1] [ 1 3] sage: A.reps() [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [ 0 -1] [ 1 0] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1], [ 1 2], [-2 1], [ 0 -1] [ 1 0] [-1 -1] [ 1 -1] [ 1 1], [-1 1], [ 2 1], [-1 2] ]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import ManinRelations >>> A = ManinRelations(Integer(11)) >>> A.reps(Integer(0)) [1 0] [0 1] >>> A.reps(Integer(1)) [ 1 1] [-1 0] >>> A.reps(Integer(2)) [ 0 -1] [ 1 3] >>> A.reps() [ [1 0] [ 1 1] [ 0 -1] [-1 -1] [-1 -2] [-2 -1] [ 0 -1] [ 1 0] [0 1], [-1 0], [ 1 3], [ 3 2], [ 2 3], [ 3 1], [ 1 2], [-2 1], <BLANKLINE> [ 0 -1] [ 1 0] [-1 -1] [ 1 -1] [ 1 1], [-1 1], [ 2 1], [-1 2] ]
from sage.modular.pollack_stevens.fund_domain import ManinRelations A = ManinRelations(11) A.reps(0) A.reps(1) A.reps(2) A.reps()
- sage.modular.pollack_stevens.fund_domain.basic_hecke_matrix(a, l)[source]¶
Return the
matrix with entries[1, a, 0, l]ifa<land[l, 0, 0, 1]ifa>=l.INPUT:
a– integer or Infinityl– a prime
OUTPUT: a
matrix of determinant lEXAMPLES:
sage: from sage.modular.pollack_stevens.fund_domain import basic_hecke_matrix sage: basic_hecke_matrix(0, 7) [1 0] [0 7] sage: basic_hecke_matrix(5, 7) [1 5] [0 7] sage: basic_hecke_matrix(7, 7) [7 0] [0 1] sage: basic_hecke_matrix(19, 7) [7 0] [0 1] sage: basic_hecke_matrix(infinity, 7) [7 0] [0 1]
>>> from sage.all import * >>> from sage.modular.pollack_stevens.fund_domain import basic_hecke_matrix >>> basic_hecke_matrix(Integer(0), Integer(7)) [1 0] [0 7] >>> basic_hecke_matrix(Integer(5), Integer(7)) [1 5] [0 7] >>> basic_hecke_matrix(Integer(7), Integer(7)) [7 0] [0 1] >>> basic_hecke_matrix(Integer(19), Integer(7)) [7 0] [0 1] >>> basic_hecke_matrix(infinity, Integer(7)) [7 0] [0 1]
from sage.modular.pollack_stevens.fund_domain import basic_hecke_matrix basic_hecke_matrix(0, 7) basic_hecke_matrix(5, 7) basic_hecke_matrix(7, 7) basic_hecke_matrix(19, 7) basic_hecke_matrix(infinity, 7)