{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Command below to toggle pretty LateX-style display of results. This worksheet may take some time to start, and I have experienced issues with pretty_print so if results do not display, use print to force them. Before some heavy lines of pretty printing (for example the expressions of $h_6$ and $h_{12}$, I have commented the instruction to display (generally given by the function **affiche**) to shorten the startup. Do NOT run all cells on startup, as there are heavy computations, especially in the end of the worksheet."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%display typeset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this worksheet, we will work in the algebra $A(\\Gamma_2(2))$ of Siegel modular forms of degree $2$, even weight and level $2$. We mainly use the results and notations of Jun-Ichi Igusa in his article \\` \\`Siegel modular forms of genus two $(II)$ '', later referred to as [Ig]. For the definitions of Igusa invariants, we will follow a second article of Igusa, namely \\` \\`Modular forms and projective invariants'', later referred to as [Ig2].\n",
"\n",
"With the classical notations, there are ten even theta constants of even characteristic, namely $$\n",
"\\vartheta_{(0,0,0,0)}, \\vartheta_{(0,0,0,1/2)}, \\vartheta_{(0,0,1/2,0)}, \\vartheta_{(0,0,1/2,1/2)}, \\vartheta_{(0,1/2,0,0)}, \\vartheta_{(0,1/2,1/2,0)}, \\vartheta_{(1/2,0,0,0)}, \\vartheta_{(1/2,0,0,1/2)}, \\vartheta_{(1/2,1/2,0,0)}, \\vartheta_{(1/2,1/2,1/2,1/2)} .$$\n",
"\n",
"They are holomorphic functions on the Siegel half-plane $\\mathcal{H}_2$ of degree 2 and from the theory we know that they are integral over the $\\mathbb{Q}$-algebra of Siegel modular forms of degree 2, level 1 and even weight, which is itself generated by the four Igusa invariants. \n",
"\n",
"**Goal of this worksheet** : make explicit this integral dependence. \n",
"\n",
"We number the ten theta constants as written above from 0 to 9, and denote for any $i \\in \\{0,\\cdots,9\\}$ by $x_i$ the fourth power of the $i$-th theta constant, so that e.g.\n",
"$$ x_6 = \\vartheta_{(0,1/2,1/2,0)}^4 .$$\n",
"Furthermore, there is a classical transformation formula of theta constants by the symplectic group $\\operatorname{Sp}_4(\\mathbb{Z})$ such that in particular, every $x_i$ belongs to $A(\\Gamma_2(2))_2$, and the whole group $\\operatorname{Sp}_4(\\mathbb{Z})$ only permutes them with sign $\\pm 1$.\n",
"The fundamental result for the following is the exact description in Lemma 1 and Theorem 1 of [Ig] the ideal of relations between squares of the ten theta constants (implying in particular some linear ones between the $x_i$).\n",
"\n",
"Following this, [Ig] proves (p.397) that there are explicit linear combinations $y_0, y_1,y_2,y_3,y_4$ of the ten $x_i$ generating over $\\mathbb{C}$ the algebra $A(\\Gamma_2(2))$, and whose ideal of relations is generated by the quartic equation $$ (y_0 y_1 + y_0 y_2 + y_1 y_2 -y_3 y_4)^2 = 4 y_0 y_1 y_2 (y_0+y_1+y_2+y_3+y_4)$$\n",
"Given there is no details of how Igusa obtained this equation and how it is the only one, we computed in another worksheet the implicitation of the equations to reprove this claim. We thus begin by defining the algebra over $\\mathbb{Q}$ generated by formal variables $y_0,y_1,y_2,y_3,y_4$ and the quartic relation. The function **affiche** is for nice displaying of a lot of further results."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"R= \\Bold{Q}[y_{0}, y_{1}, y_{2}, y_{3}, y_{4}]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"RQuart= y_{0}^{2} y_{1}^{2} - 2 y_{0}^{2} y_{1} y_{2} + y_{0}^{2} y_{2}^{2} - 2 y_{0} y_{1}^{2} y_{2} - 2 y_{0} y_{1} y_{2}^{2} - 4 y_{0} y_{1} y_{2} y_{3} - 4 y_{0} y_{1} y_{2} y_{4} - 2 y_{0} y_{1} y_{3} y_{4} - 2 y_{0} y_{2} y_{3} y_{4} + y_{1}^{2} y_{2}^{2} - 2 y_{1} y_{2} y_{3} y_{4} + y_{3}^{2} y_{4}^{2}"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def affiche(S,c):\n",
" pretty_print(c+'='+latex(S))\n",
"\n",
"R = PolynomialRing(QQ,'y0,y1,y2,y3,y4', order='lex');\n",
"y0,y1,y2,y3,y4=R.gens(); \n",
"affiche(R,'R');\n",
"\n",
"RQuart = (y0*y1 + y0*y2 + y1*y2 -y3*y4)^2 - 4*y0*y1*y2*(y0+y1+y2+y3+y4); J = R.ideal(RQuart); affiche(RQuart,'RQuart')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Let $J$ be the ideal generated by the quartic relation $RQuart$ (so that $R/J$ is naturally isomorphic to $A(\\Gamma_2(2))$). We fix as monomial order on $R$ the lexicographic order. Hence, according to the theory of division by generators of an ideal (here, a principal one), the normal form of a polynomial $f \\in R$ modulo $J$ is the unique $r \\in R$ congruent to $f$ modulo $J$ whose expression does not contain any monomial being a multiple of the maximal monomial of $RQuart$, namely here a multiple of $$y_0^2 y_1^2.$$ The Sage reduction operator **.mod(J)** does not exactly do this (although it still gives 0 if and only if the polynomial belongs to the ideal) so we recoded it quickly below for our special case.\n",
"\n",
"The function **first_divisible_term**, given a polynomial $P$ and a monomial $M$, looks for a term of $P$ which is a multiple of $M$ (beginning by the maximal term of $P$ and then decreasing in the total monomial order). If there is not, it returns False and the initial $P$. If there is, it returns True and the quotient of such a term by $M$."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"[True, 2*y0]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def first_divisible_term(P,M):\n",
" Q=P;\n",
" ctr=False\n",
" while ((Q != 0) and not(ctr)) :\n",
" S=Q.lt()\n",
" aux=S/M\n",
" if (aux in R):\n",
" ctr=True\n",
" aux=S//M\n",
" else: \n",
" Q = Q-S\n",
" if ctr:\n",
" return [ctr,aux]\n",
" else:\n",
" return [ctr,P]\n",
"first_divisible_term(y0^5+y0^4*y1 + 2*y0^3*y1^2,y0^2*y1^2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function **red_Groebner_iteree** below, given a polynomial $G$ generating an ideal (we could generalise it to a family of polynomials if necessary) and $P$ any polynomial, reduces $P$ modulo $G$ so that the result does not contain any term which is a multiple of the leading term of $G$. In particular, this reduction is 0 if and only if $P$ is a multiple of $G$, but more, two elements of $R$ are equal in $R/J$ if and only if their reduction is the same."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def red_Groebner_iteree(P,G):\n",
" Aux = 0\n",
" Q=P\n",
" E= G.lt()\n",
" ctr=True\n",
" while ctr:\n",
" L=first_divisible_term(Q,E);\n",
" if L[0]:\n",
" Q = Q - L[1]*G\n",
" else:\n",
" ctr=False\n",
" return Q"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"y0^2*y1 - y2^2 - 2*y2 - y3^2 + y3 + y4^3 - 1"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"red_Groebner_iteree(y0^2*y1 + y2^2*y3 + y2*y3^3 + y4^3,y2*y3+y2+1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will now define the theta functions and Igusa invariants. To begin with, we denote by $E$ the list of even characteristics (multiplied by 2) as a list of ten lists of four elements, sorted in lexicographical order. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"E= \\left[\\left[0, 0, 0, 0\\right], \\left[0, 0, 0, 1\\right], \\left[0, 0, 1, 0\\right], \\left[0, 0, 1, 1\\right], \\left[0, 1, 0, 0\\right], \\left[0, 1, 1, 0\\right], \\left[1, 0, 0, 0\\right], \\left[1, 0, 0, 1\\right], \\left[1, 1, 0, 0\\right], \\left[1, 1, 1, 1\\right]\\right]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"L = [[x,y,z,t] for x in [0..1] for y in [0..1] for z in [0..1] for t in [0..1]];\n",
"def even_char (L):\n",
" return (L[0]*L[2] + L[1]*L[3]) % 2 == 0\n",
"E = filter (even_char, L); affiche(E,'E')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, using the definitions of $y_0,y_1,y_2,y_3,y_4$ p. 397 of [Ig], we revert the linear system and figure out the following expressions of $x_0, \\cdots, x_9$ in terms of these five functions."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"x0= y_{2}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x1= y_{2} + y_{4}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x2= y_{0} + y_{1} + y_{2} + y_{3} + y_{4}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x3= y_{2} + y_{3}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x4= y_{1}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x5= y_{0}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x6= - y_{0} - y_{3}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x7= - y_{1} - y_{3}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x8= - y_{0} - y_{4}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x9= - y_{1} - y_{4}"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"x= \\left[y_{2}, y_{2} + y_{4}, y_{0} + y_{1} + y_{2} + y_{3} + y_{4}, y_{2} + y_{3}, y_{1}, y_{0}, - y_{0} - y_{3}, - y_{1} - y_{3}, - y_{0} - y_{4}, - y_{1} - y_{4}\\right]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x0 =y2; affiche(x0,'x0'); x1= y2 + y4; affiche(x1,'x1'); x2 = y0 + y1 + y2 + y3 +y4; affiche(x2,'x2'); \n",
"x3 = y2+y3; affiche(x3,'x3');x4 = y1; affiche(x4,'x4'); x5 = y0; affiche(x5,'x5'); \n",
"x6 = - y0-y3; affiche(x6,'x6'); x7 = - y1 - y3; affiche(x7,'x7'); x8 = -y0 - y4; affiche(x8,'x8'); \n",
"x9 = -y1 - y4; affiche(x9,'x9'); x = [x0,x1,x2,x3,x4,x5,x6,x7,x8,x9]; affiche(x,'x')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now follow the usual instructions to write the four Igusa invariants. The standard ones are denoted by $\\psi_4,\\psi_6,\\chi_{10},\\chi_{12}$ in p. 848 of [Ig2] (made to have integral Fourier coefficients with pgcd 1), but we will normalise them slightly differently to have four invariants denoted by $h_4,h_6,h_{10},h_{12}$) whose normal form above has integer coefficients with pgcd 1. More precisely, with the notations of p.848 and our choices of normalisations, we have \n",
"\\begin{eqnarray*}\n",
"h_4 & = & 2 \\cdot \\psi_4 \\\\\n",
"h_6 & = & 2^2 \\cdot \\psi_6 \\\\\n",
"h_{10} & = & 2^{15} \\cdot \\chi_{10} \\\\\n",
"h_{12} & = & 2^{16} \\cdot 3 \\cdot \\chi_{12}\n",
"\\end{eqnarray*}\n",
"\n",
"Notice that usually, the invariant $h_{10}$ is only written as a product of the ten squares of theta constants, not in terms of their fourth powers, but p.397 of [Ig] gives it. Uncomment and rerun the cell below to obtain the expansion of $h_{10}$."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"h4= 2 y_{0}^{2} + y_{0} y_{1} + y_{0} y_{2} + 2 y_{0} y_{3} + 2 y_{0} y_{4} + 2 y_{1}^{2} + y_{1} y_{2} + 2 y_{1} y_{3} + 2 y_{1} y_{4} + 2 y_{2}^{2} + 2 y_{2} y_{3} + 2 y_{2} y_{4} + 2 y_{3}^{2} + y_{3} y_{4} + 2 y_{4}^{2}"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"h4p= sum(x[i]^2 for i in [0..9]); h4 = red_Groebner_iteree(h4p/2,RQuart); affiche(h4,'h4');\n",
"h10p= (y0*y1 + y0*y2 + y1*y2-y3*y4)*(2*y0*y1*y2 + y0*y1*y3+y0*y1*y4 + y0*y2*y3 + y0*y2*y4 + 2*y0*y3*y4 + y1*y2*y3+y1*y2*y4 + 2*y1*y3*y4 + 2*y2*y3*y4 + y3^2*y4 + y3*y4^2);\n",
"h10 = red_Groebner_iteree(h10p/2,RQuart); \n",
"#affiche(h10,'h10');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"For the definitions of $h_6$ and $h_{12}$, we need the notion of syzygous set of even characteristics, defined following readily below and listed here. As we have $E$ to go from the even characteristics to the $x_i$, for compactness we will only refer to the triples of syzygies as the triples of their indices in $E$."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def somme_listes (L):\n",
" s = len(L)\n",
" l = len(L[0])\n",
" M = [0 for n in [1..l]]\n",
" for i in [0..l-1]:\n",
" for j in [0..s-1]:\n",
" M[i] = M[i] + L[j][i]\n",
" return M\n",
"#sum of a list of lists of same size term by term\n",
"\n",
"def is_syzygous (L1,L2,L3): \n",
" M = somme_listes([L1,L2,L3])\n",
" return even_char(M)\n",
"# definition of a syzygous triple\n",
"def syzygy_sign (L1,L2,L3):\n",
" a = L1[0] + L1[1] + L2[0] + L2[1] + L3[0] + L3[1] + L1[0]*L2[0] + L1[1]*L2[1]+ L1[3]*L2[1] + L1[0]*L2[2] - L1[1]*L2[3] + L1[0]*L3[0] - L1[2]*L3[0] + L2[0]*L3[0]+ L1[1]*L3[1] + L2[1]*L3[1] + L2[3]*L3[1] + L2[0]*L3[2] - L1[1]*L1[2]*L2[0] - L1[1]*L1[3]* L2[1] - L1[0]*L1[1]*L2[2] - L1[1]*L1[2]*L3[0] - L1[2]*L2[0]*L3[0] - L1[0]*L2[2]*L3[0] - L1[1]*L1[3]*L3[1] - L1[3]*L2[1]*L3[1] - L1[0]*L1[1]*L3[2] - L1[0]*L2[0]*L3[2] - L1[1]* L2[0]*L3[2]\n",
" return (-1)^a"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the above definitions, the formula for the sign of the syzygous triple in $h_6$ is given p. 68 of Marco Streng's thesis. We can now make the list of syzygous triples of even characteristics, denoted by $S$ and of length 60. Uncomment and rerun the cell below to see this list $S$."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Card(S)= 60"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def syzygies(L):\n",
" M=[]\n",
" for i in [0..9]:\n",
" for j in [0..9]:\n",
" for k in [0..9]:\n",
" if i