..nodoctest

Theta transformation formulas

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

recip.theta_trans.Theta

alias of ThetaProduct

class recip.theta_trans.ThetaGroup

Bases: sage.groups.group.Group, sage.structure.unique_representation.UniqueRepresentation

Element

alias of ThetaProduct

is_abelian()
is_finite()
order()
recip.theta_trans.ThetaModForm(x, g=None, den=None)

Constructs a modular form given as a polynomial in theta series.

EXAMPLES:

sage: from recip import * sage: P = theta_ring(3, 2)[0] sage: x = sum(P.gens()[2:7]) sage: t = ThetaModForm(x, g = 3); t t2 + t3 + t4 + t5 + t6 sage: t.long_name() ‘th[0,0,0;0,1/2,0] + th[0,0,0;1/2,1/2,0] + th[0,0,0;0,0,1/2] + th[0,0,0;1/2,0,1/2] + th[0,0,0;0,1/2,1/2]’
class recip.theta_trans.ThetaProduct(sequence, unity=0)

Bases: sage.structure.element.MultiplicativeGroupElement, recip.theta_trans.Theta_element

g()
level()

Returns a multiple of the level of this function

weight()
class recip.theta_trans.ThetaRing

Bases: sage.rings.ring.CommutativeRing, sage.structure.unique_representation.UniqueRepresentation

Element

alias of ThetaSum

class recip.theta_trans.ThetaSum(sequence)

Bases: sage.structure.element.CommutativeRingElement, recip.theta_trans.Theta_element

class recip.theta_trans.Theta_element

Bases: sage.structure.element.Element

orbit(M, group_elements=False)

Returns the orbit of self under M. Note: see __eq__()

INPUT:

  • group_elements can be either False, True, or “list”. If False, return only the orbit If “list”, also return a list of lists \(l\) of elements of M such that the elements of the orbit are given by l*self If True, then give an element of the group generated by M instead of a list of elements of M.

EXAMPLES:

sage: from recip import *
sage: gens = symplectic_generators(2)
sage: th0 = ThetaModForm(theta_ring(2,2)[0].gens()[0])
sage: h4 = my_sum((th0^8).orbit(gens)); h4 # long time
t0^8 + t1^8 + t2^8 + t3^8 + t4^8 + t6^8 + t8^8 + t9^8 + t12^8 + t15^8
class recip.theta_trans.Theta_element_polynomial_ring(num_pol, den_pol, g, den)

Bases: recip.theta_trans.Theta_element

change_den(den)

Returns a representation of self with denominator den

den_weight()
is_fixed_by(M)

Returns the orbit of self under M. Note: see __eq__

is_power_of_theta(data=False)

Returns true if and only if self is a constant times a positive power of a non-zero theta constant.

If data is True, then also output a triple (a, n, e) such that self = a*theta_n^e.

long_name()
multiplication_formula(n)

Gives Z |-> self(nZ)

EXAMPLES:

sage: from recip import *
sage: M = Matrix([[I, 1/2+I/7], [1/2+I/7, 3/2*I-1/5]], ring=CC)
sage: M.set_immutable()
sage: P = theta_ring(2,2)[0]
sage: N = 1/2 * M
sage: N.set_immutable()
sage: u = ThetaModForm(P.gens()[0]^2/P.gens()[1]^2)
sage: u(M)
1.39698675882520 + 0.0121273780920932*I
sage: u.multiplication_formula(2)(N)
1.39698675882520 + 0.0121273780920933*I

Here is a Delta-quotient, but it will need to be simplified before it is useful:

sage: i = igusa_modular_forms()[2]; i
t0^2*t1^2*t2^2*t3^2*t4^2*t6^2*t8^2*t9^2*t12^2*t15^2
sage: q = i.multiplication_formula(2)/i
num_weight()
rational_function()
weight()
recip.theta_trans.c_to_num(c, den)

Returns an integer from 0 to den^2g (exclusive), one unique number for each c in [0,1)^2g with den*c integral.

For g = 2 and den = 2, this is Dupont’s notation.

EXAMPLE:

sage: from recip import *
sage: c_to_num(num_to_c(1234, g = 5, den = 7), den = 7)
1234
recip.theta_trans.cycl_galois_action(alpha, amodb)

For alpha in CyclotomicField(b), return alpha with zeta_b raised to the power a

EXAMPLES:

sage: from recip import *
sage: C = CyclotomicField(10)
sage: amodb = Zmod(15)(7)
sage: z = C.gen()
sage: cycl_galois_action(z^5+z+1, amodb)
-zeta15^3

The modulus must match up:

sage: f = Zmod(6)(5)
sage: cycl_galois_action(z, f)
Traceback (most recent call last):
...
TypeError: Cannot coerce zeta10 into Cyclotomic Field of order 6 and degree 2
recip.theta_trans.cycl_galois_action_on_polynomials(x, amodb)

On input a polynomial x and an element amodb of Zmod(b), return x where cycl_galois_action is aplied to each coefficient.

EXAMPLES:

sage: from recip import *
sage: P = theta_ring(2,6)[0]
sage: z = P.base_ring().gen()
sage: x = P.gens()[1]*(z+z^2+z^3)+P.gens()[3]*z^-1; x
(zeta72^3 + zeta72^2 + zeta72)*t1d6 + (-zeta72^23 + zeta72^11)*t3d6
sage: cycl_galois_action_on_polynomials(x, Zmod(72)(73)) == x
True
sage: cycl_galois_action_on_polynomials(x, Zmod(72)(3))
(zeta72^9 + zeta72^6 + zeta72^3)*t1d6 + (2*zeta72^21 - 2*zeta72^9)*t3d6
recip.theta_trans.determine_kappa(M, prec=200)

Returns the element kappa(M) of QQ(zeta_{1/8}) such that for all c and Z:

theta[M[c]](0, M(Z)) = kappa(M) det(CZ+D)^(1/2) e(k(M,c)/2) theta[c](0,Z).

where the square root is chosen such that det(C*I+D)^(1/2) has argument in [0, 2*pi).

recip.theta_trans.dup_data(g)

Writes out the duplication formula on pages 129 and 130 of Dupont’s thesis.

EXAMPLES:

sage: from recip import *
sage: M = Matrix([[I, 1/2+I/7], [1/2+I/7, 3/2*I-1/5]], ring=CC)
sage: M.set_immutable()
sage: P = theta_ring(2,2)[0]
sage: N = 1/2 * M
sage: N.set_immutable()
sage: ThetaModForm(dup_data(2)[1])(N)
0.864595401455589 - 0.0220695738100844*I
sage: ThetaModForm(P.gens()[1])(M)^2
0.864595401455589 - 0.0220695738100845*I
sage: [abs(1-ThetaModForm(dup_data(2)[i])(N) / ThetaModForm(P.gens()[i])(M)^2)<10^-10 for i in [0,1,2,3,4,6,8,9,12,15]] # long time
[True, True, True, True, True, True, True, True, True, True]
recip.theta_trans.dup_formula(pol, g)

Applies the duplication formula on pages 129 and 130 of Dupont’s thesis.

EXAMPLES:

sage: from recip import *
sage: M = Matrix([[I, 1/2+I/7], [1/2+I/7, 3/2*I-1/5]], ring=CC)
sage: M.set_immutable()
sage: P = theta_ring(2,2)[0]
sage: N = 1/2 * M
sage: N.set_immutable()
sage: t = P.gens()[1]^2*P.gens()[2]^4
sage: ThetaModForm(dup_formula(t, 2))(N)
1.14954909189867 + 0.0102975011948174*I
sage: ThetaModForm(t)(M)
1.14954909189867 + 0.0102975011948173*I
recip.theta_trans.even_theta_characteristics(dupont=False)

Returns the even theta characteristics. If dupont is True returns numbers in Dupont’s notation instead of theta characteristics.

EXAMPLE:

sage: from recip import *
sage: even_theta_characteristics()
[[0, 0, 0, 0], [0, 0, 1/2, 0], [0, 0, 0, 1/2], [0, 0, 1/2, 1/2], [1/2, 0, 0, 0], [1/2, 0, 0, 1/2], [0, 1/2, 0, 0], [0, 1/2, 1/2, 0], [1/2, 1/2, 0, 0], [1/2, 1/2, 1/2, 1/2]]
recip.theta_trans.is_den_even(den)

All code assumes den to be even. This function raises an error if den is odd, and returns nothing otherwise.

EXAMPLES:

sage: from recip import *
sage: is_den_even(5)
Traceback (most recent call last):
...
ValueError: The integer den (=5) must be even.
sage: is_den_even(8)
sage: is_den_even(4)
recip.theta_trans.kappa(M, k=1)

Given M in Sp_2g(Z) and k in ZZ, returns kappa(M)^k in <zeta_8^{gk}>. Note that the output is defined only up to sign if k is odd.

The output is defined by
M –> kappa(M)^2 is a group homomorphism kappa((0 -1) (1 0))^2 = (-i)^g kappa((1 B) (0 1))^2 = 1 kappa((A 0) (0 D))^2 = det(A) in {-1,1}

EXAMPLE:

sage: from recip import *
sage: kappa(Matrix([[0,5,0,1],[-1,0,-2,0],[1,4,2,1],[1,-5,1,-1]]))
Traceback (most recent call last):
...
NotImplementedError: sorry, kappa(M, k) only implemented in trivial cases
recip.theta_trans.make_theta_ring(g, den)

See theta_ring.

EXAMPLE:

sage: from recip import *
sage: make_theta_ring(1,6)[0]
Multivariate Polynomial Ring in t0d6, t1d6, t2d6, t3d6, t4d6, t5d6, t6d6, t7d6, t8d6, t9d6, t10d6, t11d6, t12d6, t13d6, t14d6, t15d6, t16d6, t17d6, t18d6, t19d6, t20d6, t21d6, t22d6, t23d6, t24d6, t25d6, t26d6, t27d6, t28d6, t29d6, t30d6, t31d6, t32d6, t33d6, t34d6, t35d6 over Cyclotomic Field of order 72 and degree 24
recip.theta_trans.my_sum(s)
recip.theta_trans.name_to_den(name)

Given a string ending in “d?????”, returns the integer with decimal expansion ”?????”.

EXAMPLE:

sage: from recip import *
sage: name_to_den('t12d034')
34
recip.theta_trans.name_to_den_c(name, g)

Given a string name = “t.....d?????”, returns (den, num_to_c(.....), g, den)) for den = ????? (both interpreted as decimal expansions.

EXAMPLE:

sage: from recip import *
sage: name_to_den_c('t0123d45', 2)
(45, [0, 0, 11/15, 2/45])
recip.theta_trans.num_to_c(n, g, den)

Inverse of c_to_num.

For g = 2 and den = 2, this is Dupont’s notation.

EXAMPLE:

sage: from recip import *
sage: num_to_c(c_to_num([0,1/2,2/3,3/4,4/5,5/6],den=60), g=3, den=60)
[0, 1/2, 2/3, 3/4, 4/5, 5/6]
recip.theta_trans.sq_brackets_inverse(M, nu_inv, c)

Given M in GSp_2g(Z/NZ) and c in (1/den)ZZ^{2g}, returns d as in my Shimura reciprocity article. If M is in Sp_2g, then M[d^1,d^2]^i == c^i in the notation of Birkenhake-Lange.

INPUT:

  • M – matrix in GSp_2g(Z/NZ), lifted to ZZ
  • nu_inv – inverse of nu(M), lifted to ZZ
  • c – vector in (1/den)Z^{2g}

..NOTE:

The input is not checked, make sure that the congruences are satisfied when using this function.

EXAMPLES:

sage: from recip import *
sage: M = Matrix([[1,0,2,0],[0,1,0,0],[-2,0,-3,0],[0,0,0,1]])
sage: c = vector([1/2, 1/2, 0, 0])
sage: sq_brackets_inverse(M, 1, c)
(-1/2, 1/2, -2, 0)
recip.theta_trans.subscript_zero(A)

Given A in Mat_g(Z), returns A_0 in Z^g as defined in [BL], which is the diagonal of A.

EXAMPLES:

sage: from recip import *
sage: A = Matrix([[1,2],[3,4]])
sage: subscript_zero(A)
(1, 4)
recip.theta_trans.theta_action_without_kappa(M, nu_inv, d)

Given d in RR^2g and M in Sp_2g(ZZ), returns c in [0,1)^2g and s in RR such that

theta[d](0, M(Z)) = kappa(M)*det(C*Z+D)^(1/2)*e(s)*theta[c](0, Z)
This uses the theta transformation formula
theta[M[c]](0, M(Z)) = kappa(M) det(CZ+D)^(1/2) e(k(M,c)/2) theta[c](0,Z).

In fact, this is useful for slightly more, and also accepts elements M of GSp_2g(ZZ/NZZ) when given with the inverse of nu(M).

Note: depends only on M modulo LCM(2*den^2, 8): s1/2 mod ZZ depends only on M mod 2*den^2 cpre mod 2*den depends only on M mod 2*den^2, hence s2 and c depend only on M mod 2*den^2.

EXAMPLES:

sage: from recip import *
sage: M = Matrix([[0, 1], [-1, 0]])
sage: theta_action_without_kappa(M, 1, [1/6, 1/2])
([1/2, 1/6], 1/12)
sage: M = Matrix([[1, 1], [0, 1]])
sage: theta_action_without_kappa(M, 1, [1/6, 1/6])
([1/6, 5/6], -7/72)
sage: M = matrix_from_blocks(zero_matrix(2), identity_matrix(2), -identity_matrix(2), zero_matrix(2))
sage: theta_action_without_kappa(M, 1, [1/2, 1/2, 1/2, 1/2])
([1/2, 1/2, 1/2, 1/2], 1/2)
sage: theta_action_without_kappa(M, 1, [0, 1/2, 1/2, 0])
([1/2, 0, 0, 1/2], 0)
recip.theta_trans.theta_c_mod_Z(c)

Given c in RR^2g, returns d in [0,1)^2g and s in RR such that theta[c](0,Z) = e(s)*theta[d](0,Z).

Note: depends only on c modulo den*ZZ.

EXAMPLES:

sage: from recip import *
sage: theta_c_mod_Z([7/2, 7/3, 7/4, 7/5, 7/6, 7/7, 7/8, 7/9])
([1/2, 1/3, 3/4, 2/5, 1/6, 0, 7/8, 7/9], 35/6)
recip.theta_trans.theta_lc_complex(c, C=Complex Field with 53 bits of precision)

Returns the number a from theta_leading_term_complex().

recip.theta_trans.theta_lc_cyclotomic(c, n=None)

Returns the number a from theta_leading_term_cyclotomic().

recip.theta_trans.theta_leading_term_complex(c, C=Complex Field with 53 bits of precision)

Returns a pair (a, o), where o is rational and a is an element of C such that theta[c] = a*q^o + h.o.t. The output a is in C.

Here c=(c1,c2) is a pair of numbers, and this only works in the classical genus-one case.

recip.theta_trans.theta_leading_term_cyclotomic(c, n=None)

Returns a pair (a, o), where o is rational and a is an element of C such that theta[c] = a*q^o + h.o.t. The output a is in CyclotomicField(n) or ZZ. If n is None, then n is 2 times the product of the denominators of c1 and c2.

Here c=(c1,c2) is a pair of numbers, and this only works in the classical genus-one case.

recip.theta_trans.theta_ring(g, den)

Returns a triple (P, eval, R), where P is a polynomial ring representing polynomials in theta[c](0,Z) with c in (1/den)*ZZ^2g and coefficients in CyclotomicField(LCM(8, 2*den^2)), R is a quotient of P by an ideal of zero modular forms, and eval is such that R(x(eval)) = R(x) for all x in P.

EXAMPLES:

sage: from recip import *
sage: tr = theta_ring(3, 2); len(tr)
3
sage: tr[0]
Multivariate Polynomial Ring in t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31, t32, t33, t34, t35, t36, t37, t38, t39, t40, t41, t42, t43, t44, t45, t46, t47, t48, t49, t50, t51, t52, t53, t54, t55, t56, t57, t58, t59, t60, t61, t62, t63 over Cyclotomic Field of order 8 and degree 4
recip.theta_trans.theta_ring_inclusion(g, den1, den2)

Returns the natural map from theta_ring(g, den1) to theta_ring(g, den2) as a sequence to evaluate elements of theta_ring(g, den1) in.

EXAMPLE:

sage: from recip import *
sage: theta_ring_inclusion(2,2,4)
[t0d4, t2d4, t8d4, t10d4, t32d4, t34d4, t40d4, t42d4, t128d4, t130d4, t136d4, t138d4, t160d4, t162d4, t168d4, t170d4]
recip.theta_trans.theta_trans_k(M, nu_inv, c)

Returns k(M,c) in R as in Formula 8.6.1 of BL on page 227. Note: if c is in (1/n)ZZ, then k(M,c) is in (1/n^2)ZZ.

Note: if M is 1 modulo 2*den^2, then the output is an even integer.

EXAMPLE:

sage: from recip import *
sage: M = Matrix([[1, 0, 2, 0], [0, 1, 0, 0], [-2, 0, -3, 0], [0, 0, 0, 1]])
sage: d = vector([1/2, 1/2, 0, 0])
sage: theta_trans_k(M, 1, d)
-3/2