Geometry of the Main Component (improved)

This page contains the improved code we used to prove that for \(g\leq 9\) the main component of the Hirota variety \(\mathcal{H}_{\mathcal{C}}^M\) is an irreducible component of dimension \(3g\). This was achieved by computing the ideal defining the main component \(\mathcal{H}_{\mathcal{C}}^M\) using the explicit equations described in Section 3. Lemma 7 and Theorem 10 avoid the computation of redundant generators. In particular, here we show the code for \(g=6\). If you want to run the code yourself, you may download the following file main_component_fast.m2.

To generate the entries of the cube \(\mathcal{C}=\{0,1\}^g\) that index the variables \({\bf a}=(a_1,a_2,\dots,a_{2^g})\) we used the function in \(\texttt{Mathematica}\):

g = 6;
{Array[List, ConstantArray[2, g], 0, ## &]}

This is the only part of the code depending on the genus, the rest of is generalised to any genus \(g\). This is implemented in \(\texttt{Macaulay2}\).

restart
C = ZZ/32999

g = 6
r = 2^g+3*g --number parameters in product space
t = 2*g+g+1 --number of kappas and lambdas
p = 2^g-1     --number of a's
cube = {{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 1, 0}, {0, 0, 0,
   0, 1, 1}, {0, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1}, {0, 0, 0, 1, 1,
  0}, {0, 0, 0, 1, 1, 1}, {0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1}, {0,
  0, 1, 0, 1, 0}, {0, 0, 1, 0, 1, 1}, {0, 0, 1, 1, 0, 0}, {0, 0, 1, 1,
   0, 1}, {0, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1}, {0, 1, 0, 0, 0,
  0}, {0, 1, 0, 0, 0, 1}, {0, 1, 0, 0, 1, 0}, {0, 1, 0, 0, 1, 1}, {0,
  1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1}, {0, 1, 0, 1, 1, 0}, {0, 1, 0, 1,
   1, 1}, {0, 1, 1, 0, 0, 0}, {0, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 1,
  0}, {0, 1, 1, 0, 1, 1}, {0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 0, 1}, {0,
  1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0}, {1, 0, 0, 0,
   0, 1}, {1, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 1, 1}, {1, 0, 0, 1, 0,
  0}, {1, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 1, 0}, {1, 0, 0, 1, 1, 1}, {1,
  0, 1, 0, 0, 0}, {1, 0, 1, 0, 0, 1}, {1, 0, 1, 0, 1, 0}, {1, 0, 1, 0,
   1, 1}, {1, 0, 1, 1, 0, 0}, {1, 0, 1, 1, 0, 1}, {1, 0, 1, 1, 1,
 0}, {1, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 1}, {1,
 1, 0, 0, 1, 0}, {1, 1, 0, 0, 1, 1}, {1, 1, 0, 1, 0, 0}, {1, 1, 0, 1,
  0, 1}, {1, 1, 0, 1, 1, 0}, {1, 1, 0, 1, 1, 1}, {1, 1, 1, 0, 0,
 0}, {1, 1, 1, 0, 0, 1}, {1, 1, 1, 0, 1, 0}, {1, 1, 1, 0, 1, 1}, {1,
 1, 1, 1, 0, 0}, {1, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 0}, {1, 1, 1, 1,
   1, 1}};


--create the a_i generators
agens = {};
for i from 0 to p do
    agens=append(agens,a_(cube_i))
#agens == 2^g

--create the vectors of the degrees
deg = {};
for i from 1 to g do
    deg = append(deg,1)
for i from 1 to g do
    deg = append(deg,2)
for i from 1 to g do
    deg = append(deg,3)
for i from 1 to p+1 do
    deg = append(deg,0)
--
R = C[u_1..u_g,v_1..v_g,w_1..w_g,agens,Degrees=>deg];
#(generators R)==r
kappas=2*g, lambdas=g
T = C[k_1..k_kappas,l_1..l_lambdas];
t == #(generators T)
S = R[q_1..q_g];
--extract a_i generators
Agens = {};
for i from 3*g to r-1 do
Agens = append(Agens,(generators R)_i)
#Agens==2^g

Now we generate the ideal defining the Hirota variety using the correspondence between the points in the set \(\mathcal{C}^{[2]}\) (described in Section 3) and the equations cutting \(\mathcal{H}_{\mathcal{C}}^M\).

hirotaGen = {};
--first we define the polynomials corresponding to point attained uniquely in C^{[2]}
for i from 1 to g do
hirotaGen = append(hirotaGen, u_i^4-4*u_i*w_i+3*v_i^2)
hirotaGen

--we compute the set C^[2]
--elements in C2mult are {{c_i+c_j}, (),(),()}
--in the () there are all possible pairs giving c_i+c_j
C2mult = new MutableList from {};

for i from 0 to 2^g-2 do {
    for j from i+1 to 2^g-1 do {
        c2 = cube_i+cube_j;
        if i==0 then {
           if j==1 then {
              C2mult#0 = {c2}}},
              f = 0,
              for k from 0 to #C2mult-1 do {
              if c2 == (C2mult#k)#0 then {
                 f = 1,
                 temp = flatten{C2mult#k,(i,j)},
                 C2mult#k = temp
           }};
       if f == 0 then {
          l = #C2mult,
          C2mult#l = {c2,(i,j)}}
        }
}
#C2mult


--C2more contains all elements which are attained at least twice
C2more = {};

for i from 0 to #C2mult-1 do {
    if #(C2mult#i)>2 then
       C2more = append(C2more,(C2mult#i))
}
#C2more


--C2dir contains element attained at least twice and one per "direction"-class
--this corresponds to remove all elements containing a zero entry
C2dir = {};

for i from 0 to #C2more-1 do {
m = 1,
for j from 0 to g-1 do {
    m = m * (((C2more#i)#0)#j)
},
if m != 0 then
   C2dir = append(C2dir,C2more#i)
}
#C2dir


--Now we compute the polynomials corresponding to the points in C2dir
--in this way we will compute directly the ideal defining the main component of the Hirota variety
--define the vectors u,v,w
uVec = mutableMatrix(R,1,g),vVec = mutableMatrix(R,1,g),wVec = mutableMatrix(R,1,g);
for i from 0 to 0 do{
    for j from 0 to g-1 do {
        uVec_(i,j) = u_(j+1),
        vVec_(i,j) = v_(j+1),
        wVec_(i,j) = w_(j+1)
    }
 }
uVec = matrix uVec, vVec = matrix vVec, wVec = matrix wVec;

P = (x,y,t) -> x^4-4*x*t+3*y^2

--now we compute the remaining generators of main component of the Hirota variety
for i from 0 to #C2dir-1 do {
    temp = 0,
    for j from 1 to #(C2dir#i)-1 do {
        k = ((C2dir#i)#j)#0,
        l = ((C2dir#i)#j)#1,
        temp = temp + a_(cube_k)*a_(cube_l)*P(uVec*transpose(matrix{cube_k}-matrix{cube_l}),vVec*transpose(matrix{cube_k}-matrix{cube_l}),wVec*transpose(matrix{cube_k}-                        matrix{cube_l}))
},
hirotaGen = append(hirotaGen,temp)
}
#hirotaGen == g + #C2dir

MainComp = ideal(hirotaGen);
use R

J = jacobian(MainComp);
--In what follows we define the parametrisation and then we plug it in the Jacobian of the Hirota variety.
--To do this we assume the parameters and the parameters to be random values in the field ,
-- otherwise a completely symbolic computation would be computationally too hard.

--we create the list of indices appearing in the kappas in the parametrization for each vertex of the cube
I = mutableMatrix(ZZ,g,2^g);
for k from 0 to p do {
    for i from 0 to g-1 do{
        if i == 0 then {
           if (cube_k)_i == 0 then
           I_(i,k) = 2
     else
           I_(i,k) = 1}
     else
           if (cube_k)_i == 0 then
           I_(i,k) = 2*i+2
     else
           I_(i,k) = 2*i+1
  }
 }


--we create a matrix whose entries are the parametrization for the a_i's
param = mutableMatrix(C,1,p+1);
--initialize the matrix param to have all 1's as entries
for i from 0 to 0 do {
    for j from 0 to p do
    param_(i,j) = 1
 }
-- vector of random entries for the kappa parameters
kk={};
for i from 0 to kappas-1 do
kk = append(kk,random(C));
#kk == kappas
--parametrization for the a's
for i from 0 to 0 do {
    for j from 0 to p do {
        for t from 0 to g-2 do {
            for s from t+1 to g-1 do
                param_(i,j)=param_(i,j)*(kk_(I_(t,j)-1) - kk_(I_(s,j)-1))
        }
     }
 }

--parametrization for u,v,w
Puvw = {};
for i from 1 to kappas-1 do {
      if i%2==1 then
      Puvw = append(Puvw,kk_(i-1)-kk_(i));
}
for i from 1 to kappas-1 do {
      if i%2==1 then
      Puvw = append(Puvw,kk_(i-1)^2-kk_(i)^2);
}
for i from 1 to kappas-1 do {
     if i%2==1 then
      Puvw = append(Puvw,kk_(i-1)^3-kk_(i)^3);
}

G = mutableMatrix(C,1,r);
for i from 0 to 0 do {
   for j from 0 to 3*g-1 do
        G_(i,j) = Puvw_j;
    for j from 3*g to r-1 do
        G_(i,j) = param_(0,j-3*g)
        }
G = matrix G;


f = map(C,R,G);


expectedRank = (r-1)-3*g
tang = f(J);
rank tang
rank tang == expectedRank