none_equal(G0,G1,G2,G3,G4,G5) = 
{
shit = vector(6,j,0);
shit[1] = G0;
shit[2] = G1;
shit[3] = G2;
shit[4] = G3;
shit[5] = G4;
shit[6] = G5;
for(a = 1,6,
  for(b = 1,6,
    if(a != b && shit[a] == shit[b], return(0));
));
return(1);
}

find_some_curves() = 
{
v = vector(5,j,S^(j-1)*T^(4-j+1));
vec = vector(31,j,0);
n = 1;
for(b1 =0,1,
  for(b2 =0,1,
    for(b3 =0,1,
      for(b4 =0,1,
        for(b5 =0,1,
	     if(b1==0 && b2==0 && b3==0 && b4==0 && b5==0,,
             vec[n] = (b1*v[1] + b2*v[2] + b3*v[3] + b4*v[4] + b5*v[5]);
	     n = n+1;);
)))));

for(a1 = 1,31,
  for(a2 = 1,31,
    for(a3 = 1,31,
      for(a4 = 1,31,
        for(a5 = 1,31,
           for(a6 = 1,31,
	      if(gcd(gcd(gcd(gcd(gcd(vec[a1],vec[a2]),vec[a3]),vec[a4]),vec[a5]),vec[a6])==1 && (Mod(1,2))*(vec[a1]^5 + vec[a2]^5 + vec[a3]^5 + vec[a4]^5 + vec[a5]^5 + vec[a6]^5) == 0 && none_equal(vec[a1],vec[a2],vec[a3],vec[a4],vec[a5],vec[a6]), print([vec[a1],vec[a2],vec[a3], vec[a4], vec[a5], vec[a6]]);
	print(find_splittingTypeE(vec[a1],vec[a2],vec[a3],vec[a4],vec[a5],vec[a6],4));print(););
))))));
print("we are done")
}

find_splittingTypeE(G0,G1,G2,G3,G4,G5,d) =
{
return(
4 *(find_splittingTypeOmega(G0,G1,G2,G3,G4,G5,d) + [d,d,d,d,d]) + [d,d,d,d,d])
}

find_splittingTypeOmega(G0,G1,G2,G3,G4,G5,d) =
{
local(r,j,i,m,e);
e = vector(5);
m = d; r = 0; i = 0;

while(r < 5, 
     rTemp = r;
     r = rTemp + hilbert_function(G0,G1,G2,G3,G4,G5,d,m) - i;
    
     j = 0;
    while(j < r - rTemp,
         e[rTemp + 1 + j] = -m;
         j++);
 
     i = i + rTemp + 2 *(r-rTemp);
    m++);

return(e)
}

hilbert_function(G0,G1,G2,G3,G4,G5,d,m) =
{
local(G,A,i,j,k);
G = [G0,G1,G2,G3,G4,G5];

A = matrix(m+1,(6) * (-d + m + 1));
i = 0;
j = 1;
k= 0;
while(i <= 5,
     while(j <= -d + m + 1,
            while(k <= d,
                   A[j + k,i*(-d + m + 1) + j] = polcoeff(polcoeff(G[i+1],d-k,S),k,T);
                   k++);
     j++;k=0);
i++;j=1);

return((6 * (-d + m + 1) - matrank(A)))
}