This package provides a class for representing eta-products, which are meromorphic functions on modular curves of the form
where is Dirichlet’s eta function . These are useful for obtaining explicit models of modular curves.
See trac ticket #3934 for background.
AUTHOR:
Return a list of CuspFamily objects corresponding to the cusps of .
INPUT:
EXAMPLES:
sage: AllCusps(18)
[(Inf), (c_{2}), (c_{3,1}), (c_{3,2}), (c_{6,1}), (c_{6,2}), (c_{9}), (0)]
Bases: sage.structure.sage_object.SageObject
A family of elliptic curves parametrising a region of .
The level of this cusp.
EXAMPLES:
sage: e = CuspFamily(10, 1)
sage: e.level()
10
Return the corresponding element of .
EXAMPLE:
sage: CuspFamily(10, 1).sage_cusp() # not implemented
Infinity
The width of this cusp.
EXAMPLES:
sage: e = CuspFamily(10, 1)
sage: e.width()
1
Create the group of eta products of the given level.
EXAMPLES:
sage: EtaGroup(12)
Group of eta products on X_0(12)
sage: EtaGroup(1/2)
...
TypeError: Level (=1/2) must be a positive integer
sage: EtaGroup(0)
...
ValueError: Level (=0) must be a positive integer
Bases: sage.structure.element.MultiplicativeGroupElement
Return the degree of self as a map , which is equal to the sum of all the positive coefficients in the divisor of self.
EXAMPLES:
sage: e = EtaProduct(12, {1:-336, 2:576, 3:696, 4:-216, 6:-576, 12:-144})
sage: e.degree()
230
Return the divisor of self, as a formal sum of CuspFamily objects.
EXAMPLES:
sage: e = EtaProduct(12, {1:-336, 2:576, 3:696, 4:-216, 6:-576, 12:-144})
sage: e.divisor() # FormalSum seems to print things in a random order?
-131*(Inf) - 50*(c_{2}) + 11*(0) + 50*(c_{6}) + 169*(c_{4}) - 49*(c_{3})
sage: e = EtaProduct(2^8, {8:1,32:-1})
sage: e.divisor() # random
-(c_{2}) - (Inf) - (c_{8,2}) - (c_{8,3}) - (c_{8,4}) - (c_{4,2}) - (c_{8,1}) - (c_{4,1}) + (c_{32,4}) + (c_{32,3}) + (c_{64,1}) + (0) + (c_{32,2}) + (c_{64,2}) + (c_{128}) + (c_{32,1})
Return the level of this eta product.
EXAMPLES:
sage: e = EtaProduct(3, {3:12, 1:-12})
sage: e.level()
3
sage: EtaProduct(12, {6:6, 2:-6}).level() # not the lcm of the d's
12
sage: EtaProduct(36, {6:6, 2:-6}).level() # not minimal
36
Return the order of vanishing of self at the given cusp.
INPUT:
OUTPUT:
EXAMPLES:
sage: e = EtaProduct(2, {2:24, 1:-24})
sage: e.order_at_cusp(CuspFamily(2, 1)) # cusp at infinity
1
sage: e.order_at_cusp(CuspFamily(2, 2)) # cusp 0
-1
The q-expansion of self at the cusp at infinity.
INPUT:
OUTPUT:
ALGORITHM: Calculates eta to (n/m) terms, where m is the smallest integer dividing self.level() such that self.r(m) != 0. Then multiplies.
EXAMPLES:
sage: EtaProduct(36, {6:6, 2:-6}).q_expansion(10)
q + 6*q^3 + 27*q^5 + 92*q^7 + 279*q^9 + O(q^11)
sage: R.<q> = ZZ[[]]
sage: EtaProduct(2,{2:24,1:-24}).q_expansion(100) == delta_qexp(101)(q^2)/delta_qexp(101)(q)
True
Alias for self.q_expansion().
EXAMPLES:
sage: e = EtaProduct(36, {6:8, 3:-8})
sage: e.qexp(10)
q + 8*q^4 + 36*q^7 + O(q^10)
sage: e.qexp(30) == e.q_expansion(30)
True
Return the exponent of in self.
EXAMPLES:
sage: e = EtaProduct(12, {2:24, 3:-24})
sage: e.r(3)
-24
sage: e.r(4)
0
Bases: sage.groups.group.AbelianGroup
The group of eta products of a given level under multiplication.
Produce a basis for the free abelian group of eta-products of level N (under multiplication), attempting to find basis vectors of the smallest possible degree.
INPUT:
EXAMPLE:
sage: EtaGroup(5).basis()
[Eta product of level 5 : (eta_1)^6 (eta_5)^-6]
sage: EtaGroup(12).basis()
[Eta product of level 12 : (eta_1)^2 (eta_2)^1 (eta_3)^2 (eta_4)^-1 (eta_6)^-7 (eta_12)^3,
Eta product of level 12 : (eta_1)^-2 (eta_2)^3 (eta_3)^6 (eta_4)^-1 (eta_6)^-9 (eta_12)^3,
Eta product of level 12 : (eta_1)^-3 (eta_2)^2 (eta_3)^1 (eta_4)^-1 (eta_6)^-2 (eta_12)^3,
Eta product of level 12 : (eta_1)^1 (eta_2)^-1 (eta_3)^-3 (eta_4)^-2 (eta_6)^7 (eta_12)^-2,
Eta product of level 12 : (eta_1)^-6 (eta_2)^9 (eta_3)^2 (eta_4)^-3 (eta_6)^-3 (eta_12)^1]
sage: EtaGroup(12).basis(reduce=False) # much bigger coefficients
[Eta product of level 12 : (eta_2)^24 (eta_12)^-24,
Eta product of level 12 : (eta_1)^-336 (eta_2)^576 (eta_3)^696 (eta_4)^-216 (eta_6)^-576 (eta_12)^-144,
Eta product of level 12 : (eta_1)^-8 (eta_2)^-2 (eta_6)^2 (eta_12)^8,
Eta product of level 12 : (eta_1)^1 (eta_2)^9 (eta_3)^13 (eta_4)^-4 (eta_6)^-15 (eta_12)^-4,
Eta product of level 12 : (eta_1)^15 (eta_2)^-24 (eta_3)^-29 (eta_4)^9 (eta_6)^24 (eta_12)^5]
ALGORITHM: An eta product of level is uniquely determined by the integers for with , since . The valid are those that satisfy two congruences modulo 24, and one congruence modulo 2 for every prime divisor of N. We beef up the congruences modulo 2 to congruences modulo 24 by multiplying by 12. To calculate the kernel of the ensuing map we lift it arbitrarily to an integer matrix and calculate its Smith normal form. This gives a basis for the lattice.
This lattice typically contains “large” elements, so by default we pass it to the reduce_basis() function which performs LLL-reduction to give a more manageable basis.
Return the level of self. EXAMPLES:
sage: EtaGroup(10).level()
10
Produce a more manageable basis via LLL-reduction.
INPUT:
OUTPUT:
ALGORITHM: We define the norm of an eta-product to be the norm of its divisor (as an element of the free -module with the cusps as basis and the standard inner product). Applying LLL-reduction to this gives a basis of hopefully more tractable elements. Of course we’d like to use the norm as this is just twice the degree, which is a much more natural invariant, but norm is easier to work with!
EXAMPLES:
sage: EtaGroup(4).reduce_basis([ EtaProduct(4, {1:8,2:24,4:-32}), EtaProduct(4, {1:8, 4:-8})])
[Eta product of level 4 : (eta_1)^8 (eta_4)^-8,
Eta product of level 4 : (eta_1)^-8 (eta_2)^24 (eta_4)^-16]
Create an EtaGroupElement object representing the function . Checks the criteria of Ligozat to ensure that this product really is the q-expansion of a meromorphic function on X_0(N).
INPUT:
OUTPUT:
Note
The dictionary dict does not uniquely specify N. It is possible for two EtaGroupElements with different ‘s to be created with the same dictionary, and these represent different objects (although they will have the same -expansion at the cusp ).
EXAMPLES:
sage: EtaProduct(3, {3:12, 1:-12})
Eta product of level 3 : (eta_1)^-12 (eta_3)^12
sage: EtaProduct(3, {3:6, 1:-6})
...
ValueError: sum d r_d (=12) is not 0 mod 24
sage: EtaProduct(3, {4:6, 1:-6})
...
ValueError: 4 does not divide 3
Find polynomial relations between eta products.
INPUTS:
OUTPUTS: a list of polynomials which is a Groebner basis for the part of the ideal of relations between eta_elements which is generated by elements up to the given degree; or None, if no relations were found.
ALGORITHM: An expression of the form is zero if and only if it vanishes at the cusp infinity to degree at least . For all terms up to in the -expansion of this expression to be zero is a system of linear equations in coefficients, where is the number of nonzero negative coefficients that can appear.
Solving these equations and calculating a basis for the solution space gives us a set of polynomial relations, but this is generally far from a minimal generating set for the ideal, so we calculate a Groebner basis.
As a test, we calculate five extra terms of -expansion and check that this doesn’t change the answer.
EXAMPLES:
sage: t = EtaProduct(26, {2:2,13:2,26:-2,1:-2})
sage: u = EtaProduct(26, {2:4,13:2,26:-4,1:-2})
sage: eta_poly_relations([t, u], 3)
sage: eta_poly_relations([t, u], 4)
[x1^3*x2 - 13*x1^3 - 4*x1^2*x2 - 4*x1*x2 - x2^2 + x2]
Use verbose=True to see the details of the computation:
sage: eta_poly_relations([t, u], 3, verbose=True)
Trying to find a relation of degree 3
Lowest order of a term at infinity = -12
Highest possible degree of a term = 15
Trying all coefficients from q^-12 to q^15 inclusive
No polynomial relation of order 3 valid for 28 terms
Check: Trying all coefficients from q^-12 to q^20 inclusive
No polynomial relation of order 3 valid for 33 terms
sage: eta_poly_relations([t, u], 4, verbose=True)
Trying to find a relation of degree 4
Lowest order of a term at infinity = -16
Highest possible degree of a term = 20
Trying all coefficients from q^-16 to q^20 inclusive
Check: Trying all coefficients from q^-16 to q^25 inclusive
[x1^3*x2 - 13*x1^3 - 4*x1^2*x2 - 4*x1*x2 - x2^2 + x2]
Return the number of cusps on of width d.
INPUT:
EXAMPLES:
sage: [num_cusps_of_width(18,d) for d in divisors(18)]
[1, 1, 2, 2, 1, 1]
Return the q-expansion of , where is Dedekind’s function
as an element of ps_ring, to precision n. Completely naive algorithm.
INPUT:
OUTPUT: An element of ps_ring which is the q-expansion of truncated to n terms.
ALGORITHM: Multiply out the product . Could perhaps be sped-up by using the identity
but I’m lazy.
EXAMPLES:
sage: qexp_eta(ZZ[['q']], 100)
1 - q - q^2 + q^5 + q^7 - q^12 - q^15 + q^22 + q^26 - q^35 - q^40 + q^51 + q^57 - q^70 - q^77 + q^92 + O(q^100)