..nodoctest

Igusa invariants

x.__init__(...) initializes x; see help(type(x)) for signature

recip.igusa_invariants.h6_thesis()

Reconstructs h6 from the formula in the author’s thesis. For verification of the thesis and testing of the code only.

EXAMPLE:

sage: from recip import *
sage: h6_thesis() == igusa_modular_forms()[1]
True
recip.igusa_invariants.igusa_absolute_to_homogeneous(i, prime=True)

Given a list [h4*h6/h10, h12*h4^2/h10^2, h4^5/h10^2] = [I4*I6’/I10, I2*I4^2/I10, I4^5/I10^2], returns a list [I2, I4, I6’, I10] or [I2, I4, I6, I10] (depending on whether prime is True, and uniquely determined only up to weighted scaling).

recip.igusa_invariants.igusa_homogeneous_to_absolute(i, prime=True)

Given a list a list [I2, I4, I6’, I10] or [I2, I4, I6, I10] (depending on whether prime is True), returns the list [h4*h6/h10, h12*h4^2/h10^2, h4^5/h10^2] = [I4*I6’/I10, I2*I4^2/I10, I4^5/I10^2]

EXAMPLES:

sage: from recip import *
sage: k = [1,2,3]
sage: j = igusa_absolute_to_homogeneous(k); j
[2, 3, 3, 9]
sage: igusa_homogeneous_to_absolute(j)
[1, 2, 3]
sage: j = igusa_absolute_to_homogeneous(k, False); j
[2, 3, 0, 9]
sage: igusa_homogeneous_to_absolute(j, False)
[1, 2, 3]

sage: l = [0,1,2]
sage: igusa_homogeneous_to_absolute(igusa_absolute_to_homogeneous(l))
[0, 1, 2]
sage: l = [1,0,2]
sage: igusa_homogeneous_to_absolute(igusa_absolute_to_homogeneous(l))
[1, 0, 2]
sage: l = [1,2,0]
sage: igusa_homogeneous_to_absolute(igusa_absolute_to_homogeneous(l))
Traceback (most recent call last):
...
ValueError: Invalid input: no homogeneous invariants exist for this triple of absolute invariants
sage: l = [0,0,1]
sage: igusa_homogeneous_to_absolute(igusa_absolute_to_homogeneous(l))
[0, 0, 1]
recip.igusa_invariants.igusa_invariants_absolute()

Returns the absolute Igusa invariants according to the choices made in the author’s thesis.

This is slow, because a they are completely written out as a rational function in theta constants.

When evaluating modular forms, it may be faster to evaluate igusa_modular_forms first, and then apply igusa_modular_forms_to_absolute to the output.

EXAMPLES:

sage: from recip import *
sage: invs = igusa_invariants_absolute() # long time
sage: len(invs) # long time
3
recip.igusa_invariants.igusa_modular_forms()

Returns the homogeneous Igusa invariants h4=I4, h6=I6’, h10=I10, h12=I10*I2.

EXAMPLES:

Check that the Igusa invariants are indeed sums over orbits of a product of theta series:

sage: from recip import *
sage: gens = symplectic_generators(2)
sage: th = theta_ring(2,2)[0].gens()
sage: h4 = my_sum(ThetaModForm(th[0]**8).orbit(gens)) # long time
sage: h6 = my_sum(ThetaModForm((th[0]*th[1]*th[2])**4).orbit(gens)) # long time
sage: h10 = my_sum(ThetaModForm((th[0]*th[1]*th[2]*th[3]*th[4]*th[6]*th[8]*th[9]*th[12]*th[15])**2).orbit(gens))
sage: h12 = my_sum(ThetaModForm((th[4]*th[6]*th[8]*th[9]*th[12]*th[15])**4).orbit(gens)) # long time
sage: igusa_modular_forms() == [h4, h6, h10, h12] # long time
True
recip.igusa_invariants.igusa_modular_forms_to_absolute(i)

Converts igusa modular forms to absolute Igusa invariants.

INPUT:

a list [h4,h6,h10,h12]

OUTPUT:

a list [h4*h6/h10, h12*h4^2/h10^2, h4^5/h10^2]

See igusa_modular_forms().

EXAMPLES:

sage: from recip import *
sage: igusa_modular_forms_to_absolute([1,2,3,4])
[2/3, 4/9, 1/9]
recip.igusa_invariants.rosenhain_invariants(g)

Returns a (2g-1)-tuple of Rosenhain invariants e_1,...,e_{2g-1}.

For g<=2, if the e_i(tau) are distinct from each other and from 0,1,inty, then CC^g / tau*ZZ^g+ZZ^g is the Jacobian of y^2 = x(x-1)*prod_i (x-e_i(tau)).

EXAMPLES:

sage: from recip import *
sage: rosenhain_invariants(2)
[t0^2*t1^2/(t2^2*t3^2), t1^2*t12^2/(t2^2*t15^2), t0^2*t12^2/(t3^2*t15^2)]
sage: rosenhain_invariants(1)
Traceback (most recent call last):
...
NotImplementedError: Sorry, Rosenhain invariants currently only implemented for g=2