..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
-
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