Theta Divisor of a Rational Nodal Curve

This page contains the code computing the theta divisor of an irreducible rational nodal curve. The computation of the elimination ideal terminates fast for \(g\leq 6\). If you want to run the code yourself, you may download the following file theta_divisor.m2.

 restart
 C = ZZ/32999
 --choose a value for the genus g
g = 5
R = C[x_1..x_(g-1),k_1..k_(2*g),q_1..q_g]


--first addend in the definition of the image
imAbel1 = mutableMatrix(R,1,g);

for i from 0 to 0 do {
   for j from 0 to g-1 do {
        imAbel1_(i,j)=1
    }
}

for i from 0 to 0 do {
    for j from 0 to g-1 do {
            for l from 1 to g-1 do {
                imAbel1_(i,j)=imAbel1_(i,j)*(1-k_(2*j+2)*x_(l))
            }
    }
}
imAbel1 = matrix(imAbel1);
--second addend in the definition of the image
imAbel2 = mutableMatrix(R,1,g);

for i from 0 to 0 do {
    for j from 0 to g-1 do {
        imAbel2_(i,j)=1
    }
}

for i from 0 to 0 do {
    for j from 0 to g-1 do {
            for l from 1 to g-1 do {
                imAbel2_(i,j)=imAbel2_(i,j)*(1-k_(2*j+1)*x_(l))
            }
    }
}
imAbel2 = matrix(imAbel2);

imAbel = {};

for i from 0 to 0 do {
    for j from 0 to g-1 do
    imAbel = append(imAbel, q_(j+1)*imAbel1_(i,j)-imAbel2_(i,j))
}
--Define the ideal
I = ideal(imAbel);

--List of x variables
X = {};
for i from 0 to g-2 do
    X = append(X,x_(i+1))
gbTrace = 3
I = eliminate(I,X);
mingens I;

--List of q variables
Q = {};
for i from 0 to g-1 do
    Q = append(Q,q_(i+1))
f = (mingens I)_(0,0);
c = flatten entries((coefficients(f,Variables=>Q))_1);

-- now we compute the coefficients of the theta divisor and notice
-- that they coincide with the parametrization given by the map \phi
-- described in section 2
(coefficients(f,Variables=>Q))_0
aParam = apply(c,i->factor i)