Changeset abbd22 in git


Ignore:
Timestamp:
Aug 10, 2010, 2:17:49 PM (14 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
71ea75859d658e8bb0cf07f0242fb4ef13f452a1
Parents:
7f8587b3752e6d6a92df017bafdfb3d03198e66b
Message:
optimized version

git-svn-id: file:///usr/local/Singular/svn/trunk@13097 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/monomial.lib

    r7f8587 rabbd22  
    4040";
    4141LIB "poly.lib";  // Para "maxdeg1" en "isprimeMon"
    42 //---------------------------------------------------------------------------       
     42//---------------------------------------------------------------------------
    4343//-----------------------   INTERNOS    -------------------------------------
    44 //---------------------------------------------------------------------------       
     44//---------------------------------------------------------------------------
    4545/////////////////////////////////////////////////////////////////////////////
    4646//
     
    5454  int i,n;
    5555  n = ncols(I);
    56   for (i = 1 ; i <= n ; i ++)
    57     {
    58       if ( size(I[i]) > 1 )
    59         {
    60           return (0);
    61         }
    62     }
     56  for (i = n ; i >= 1 ; i --)
     57  {
     58    if ( size(I[i]) > 1 )
     59    {
     60      return (0);
     61    }
     62  }
    6363  return (1);
    6464}
     
    8080  J = 0;
    8181
    82   int sizI = size(I);
     82  int sizI = ncols(I);
    8383  for (i = 1 ; i <= sizI ; i++)
    84     {
    85       g = gcdMon(I[i],f);
    86       // Cociente de dos monomios: restamos los exponentes, y en el
    87       // denominador va el mcd
    88       v = leadexp(I[i]) - leadexp(g);
    89       generator = monomial (v);
    90       if (membershipMon(generator,J) == 0)
    91         {
    92           J=J,generator;
    93         }
    94     }
     84  {
     85    g = gcd(I[i],f);
     86    // Cociente de dos monomios: restamos los exponentes, y en el
     87    // denominador va el mcd
     88    v = leadexp(I[i]) - leadexp(g);
     89    generator = monomial (v);
     90    if (membershipMon(generator,J) == 0)
     91    {
     92      J=J,generator;
     93    }
     94  }
    9595  // minimal monomial basis
    9696  return ( minbase(J) );
     
    107107"
    108108{
    109   def R = basering;
    110109  // Variables
    111   int nvar,i,cont,sop;
     110  int i,cont,sop;
    112111  intvec expf;
    113   nvar = nvars(R);
     112  int nvar = nvars(basering);
    114113  expf = leadexp(f);
    115114  cont = 0;
    116115  // cont va a contar el numero de componentes del vector no nulas.
    117116  // En sop guardamos el subindice de la componente no nula.
    118   for (i = 1 ; i <= nvar ; i++)
    119     {
    120       if (expf[i] > 0)
    121         {
    122           cont ++;
    123           sop = i;
    124           // Si cont > 1 ==> aparece mas de una variable, devolvemos 0
    125           if (cont > 1)
    126             {
    127               return (0);
    128             }
    129         }
    130     }
     117  for (i = nvar ; i >= 1 ; i--)
     118  {
     119    if (expf[i] > 0)
     120    {
     121      cont ++;
     122      sop = i;
     123      // Si cont > 1 ==> aparece mas de una variable, devolvemos 0
     124      if (cont > 1)
     125      {
     126        return (0);
     127      }
     128    }
     129  }
    131130  return(sop);
    132131}
     
    145144"
    146145{
    147   def R = basering;
    148146  // Variables
    149147  int sizI,i,nvar,j,sum;
    150148  intvec w,exp;
    151   sizI = size(I);
    152   nvar = nvars(R);
     149  sizI = ncols(I);
     150  nvar = nvars(basering);
    153151  for (i = 1 ; i <= sizI ; i++)
    154     {
    155       sum = 0;
    156       exp = leadexp(I[i]);
    157       for (j = 1 ; j <= nvar ; j++)
    158         {
    159           // Al menos tenemos una variable en cada generador, luego
    160           // entramos minimo 1 vez, luego sum >= 1.
    161           if (exp[j] <> 0)
    162             {
    163               sum = sum + 1;
    164               w[sum] = j;
    165             }
    166         }
    167       // Si hay mas de una variable la suma sera mayor que 1; y ya
    168       // sabemos que I no es irreducible.
    169       if (sum <> 1)
    170         {
    171           return(i,w);
    172         }
    173     }
     152  {
     153    sum = 0;
     154    exp = leadexp(I[i]);
     155    for (j = 1 ; j <= nvar ; j++)
     156    {
     157      // Al menos tenemos una variable en cada generador, luego
     158      // entramos minimo 1 vez, luego sum >= 1.
     159      if (exp[j] <> 0)
     160      {
     161        sum++;
     162        w[sum] = j;
     163      }
     164    }
     165    // Si hay mas de una variable la suma sera mayor que 1; y ya
     166    // sabemos que I no es irreducible.
     167    if (sum <> 1)
     168    {
     169      return(i,w);
     170    }
     171  }
    174172  return(1);
    175173}
     
    186184  poly f;
    187185  int i,resp;
    188   int n = size(I);
     186  int n = ncols(I);
    189187  // Desde que haya un generador que no pertenzca al ideal, ya no se da
    190188  // el contenido y terminamos.
    191189  for (i = 1 ; i <= n ; i++)
    192     {
    193       resp = membershipMon(I[i],J);
    194       if (resp == 0)
    195         {
    196           return(0);
    197         }
    198     }
     190  {
     191    resp = membershipMon(I[i],J);
     192    if (resp == 0)
     193    {
     194      return(0);
     195    }
     196  }
    199197  return(1);
    200198}
     
    215213  // que vienen dados por el sistema minimal de generadores.
    216214  if (size(I) <> size(J))
    217     {
    218       return(0);
    219     }
    220   n = size(I);
     215  {
     216    return(0);
     217  }
    221218  // Como ambos ideales vienen dados por la base minimal, no vamos a
    222219  // tener problemas con que comparemos uno de I con otro de J, pues
    223220  // no puede haber generadores iguales en el mismo ideal.
    224221  // Si los ordenamos, se puede comparar uno a uno
    225   I = sort(I)[1];
    226   J = sort(J)[1];
    227   for (i = 1 ; i <= n ; i++)
    228     {
    229       if (I[i] <> J[i])
    230         {
    231           return(0);
    232         }
    233     }
    234   return(1);
     222  return(matrix( sort(I)[1])==matrix(sort(J)[1]));
     223  //n = size(I);
     224  //I = sort(I)[1];
     225  //J = sort(J)[1];
     226  //for (i = 1 ; i <= n ; i++)
     227  //{
     228  //  if (I[i] <> J[i])
     229  //  {
     230  //    return(0);
     231  //  }
     232  //}
     233  //return(1);
    235234}
    236235/////////////////////////////////////////////////////////////////////////////
     
    245244{
    246245  // Cambiamos de anillo
    247   def R = basering;
    248   int nvar = nvars(R);
    249   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    250   execute(s);
     246  int nvar = nvars(basering);
    251247  // Variables
    252248  int i,cont;
    253249  intvec exp;
    254250  ideal rad;
    255   ideal I = fetch(R,I);
    256251  // Como en cada generador aparece solo una variable,  y ademas la
    257252  // la misma variable no va a aparecer dos veces, es suficiente
    258253  // con sumar los exponentes de todos los generadores para saber que
    259254  // variables aparecen.
    260   int n = size(I);
     255  int n = ncols(I);
    261256  for (i = 1 ; i <= n ; i++)
    262     {
    263       exp = exp + leadexp (I[i]);
    264     }
     257  {
     258    exp = exp + leadexp (I[i]);
     259  }
    265260  cont = 1;
    266261  for (i = 1 ; i <= nvar ; i++)
    267     {
    268       if (exp[i] <> 0)
    269         {
    270           rad[cont] = x(i);
    271           cont ++;
    272         }
    273     }
    274   setring R;
    275   ideal rad = fetch(R1,rad);
    276   kill R1;
     262  {
     263    if (exp[i] <> 0)
     264    {
     265      rad[cont] = var(i);
     266      cont ++;
     267    }
     268  }
    277269  return (rad);
    278270}
     
    292284"
    293285{
    294   def R = basering;
    295286  // Variables
    296287  int control,nvar,i,sub_in,l,j;
    297288  intvec v,w,exp_gen;
    298289  // El ideal ya entra generado por el sistema minimal
    299   nvar = nvars(R);
    300   int sizI = size(I);
     290  nvar = nvars(basering);
     291  int sizI = ncols(I);
    301292  v[nvar] = 0;
    302293  int cont = 1;
     
    305296  // generadores de I que hay que comprobar.
    306297  for (i = 1 ; i <= sizI ; i++ )
    307     {
    308       sub_in = soporte(I[i]);
    309       if ( sub_in <> 0)
    310         {
    311           v[sub_in] = 1;
    312         }
    313       else
    314         {
    315           w[cont] = i;
    316           cont ++;
    317         }
    318     }
     298  {
     299    sub_in = soporte(I[i]);
     300    if ( sub_in <> 0)
     301    {
     302      v[sub_in] = 1;
     303    }
     304    else
     305    {
     306      w[cont] = i;
     307      cont ++;
     308    }
     309  }
    319310  l = size(w);
    320311  // No hay ningun generador que tenga productos de variables, luego
    321312  //  este ideal ya es primario.
    322313  if (l == 1 && w[1] == 0)
    323     {
    324       return (1);
    325     }
     314  {
     315    return (1);
     316  }
    326317  for (i = 1 ; i <= l ; i++)
    327     {
    328       exp_gen = leadexp(I[w[i]]);
    329       // Ahora hay que ver que valor tiene el exponente de los
    330       // generadores oportunos en la posicion que es cero dentro del
    331       // vector v.
    332       for (j = 1 ; j <= nvar ; j++)
    333         {
    334           if (v[j] == 0)
    335             {
    336               if (exp_gen[j] <> 0)
    337                 {
    338                   return (0,j,w);
    339                 }
    340             }
    341         }
    342     }
     318  {
     319    exp_gen = leadexp(I[w[i]]);
     320    // Ahora hay que ver que valor tiene el exponente de los
     321    // generadores oportunos en la posicion que es cero dentro del
     322    // vector v.
     323    for (j = 1 ; j <= nvar ; j++)
     324    {
     325      if (v[j] == 0)
     326      {
     327        if (exp_gen[j] <> 0)
     328        {
     329          return (0,j,w);
     330        }
     331      }
     332    }
     333  }
    343334  // Si hemos llegado hasta aqui hemos recorrido todo el ideal y por tanto
    344335  // es primario.
     
    371362  max = 0;
    372363  for (i = 1 ; i <= n ; i++)
    373     {
    374       exp = leadexp (I[v[i+2]]);
    375       if (exp[v[2]] > max)
    376         {
    377           max = exp[v[2]];
    378         }
    379     }
     364  {
     365    exp = leadexp (I[v[i+2]]);
     366    if (exp[v[2]] > max)
     367    {
     368      max = exp[v[2]];
     369    }
     370  }
    380371  return (max);
    381372}
     
    396387  int sizl = size(l);
    397388  for (i = 1 ; i <= sizl ; i++)
    398     {
    399       J = 1;
    400       for (j = 1 ; j <= sizl ; j++)
    401         {
    402           // Hacemos la interseccion de todos los ideales menos uno y
    403           // luego se estudia el contenido.
    404           if (j <> i)
    405             {
    406               J = intersect (J,l[j]);
    407             }
    408         }
    409       J = minbase(J);
    410       resp = contents(J,l[i]);
    411       if (resp == 1)
    412         {
    413           l = delete (l,i);
    414           i--;
    415           sizl = size(l);
    416         }
    417     }
     389  {
     390    J = 1;
     391    for (j = 1 ; j <= sizl ; j++)
     392    {
     393      // Hacemos la interseccion de todos los ideales menos uno y
     394      // luego se estudia el contenido.
     395      if (j <> i)
     396      {
     397        J = intersect (J,l[j]);
     398      }
     399    }
     400    J = minbase(J);
     401    resp = contents(J,l[i]);
     402    if (resp == 1)
     403    {
     404      l = delete (l,i);
     405      i--;
     406      sizl = size(l);
     407    }
     408  }
    418409  return (l);
    419410}
     
    432423{
    433424  // Cambiamos de anillo
    434   def R = basering;
    435   int nvar = nvars(R);
    436   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    437   execute(s);
     425  int nvar = nvars(basering);
    438426  // Variables
    439427  int i,j;
     
    441429  list l;
    442430  ideal J;
    443   ideal I = fetch (R,I);
    444   int sizI = size(I);
     431  int sizI = ncols(I);
    445432  // Vamos a tener tantas componentes como generadores minimales tiene el
    446433  // ideal, por eso el bucle es de 1 a size(I).
    447  for (i = 1 ; i <= sizI ; i++)
    448    {
    449      J = 0;
    450      exp_I = leadexp (I[i]);
    451      for (j = 1 ; j <= nvar ; j++)
    452        {
    453          if (exp_I[j] <> 0)
    454            {
    455              exp[j] = v[j] + 1 - exp_I[j];
    456              J = J, x(j)^exp[j];
    457            }
    458        }
    459      // Tenemos siempre un cero por la inicializacion de J, entonces
    460      // lo quitamos.
    461      J = simplify (J,2);
    462      l = insert (l,J);
    463    }
    464  setring R;
    465  list l = fetch (R1,l);
    466  kill R1;
    467  return (l);
     434  for (i = 1 ; i <= sizI ; i++)
     435  {
     436    J = 0;
     437    exp_I = leadexp (I[i]);
     438    for (j = 1 ; j <= nvar ; j++)
     439    {
     440      if (exp_I[j] <> 0)
     441      {
     442        exp[j] = v[j] + 1 - exp_I[j];
     443        J = J, var(j)^exp[j];
     444      }
     445    }
     446    // Tenemos siempre un cero por la inicializacion de J, entonces
     447    // lo quitamos.
     448    J = simplify (J,2);
     449    l = insert (l,J);
     450  }
     451  return (l);
    468452}
    469453/////////////////////////////////////////////////////////////////////////////
     
    485469  sizl1 = size(l1);
    486470  for (i = 1 ; i <= sizl1 ; i++)
    487     {
    488       l2[i] = radicalAux (l1[i]);
    489     }
     471  {
     472    l2[i] = radicalAux (l1[i]);
     473  }
    490474  sizl2 = size(l2);
    491475  int sizl2i, sizl2j;
     
    495479  // l3 = primary components list
    496480  for (i = 1 ; i <= sizl1 ; i++)
    497     {
    498       J = l2[i];
    499       sizl2i = size(l2[i]);
    500       K = l1[i];
    501       for (j = i+1 ; j <= sizl2 ; j++)
    502         {
    503           sizl2j = size(l2[j]);
    504           if (sizl2i == sizl2j)
    505             {
    506               if (equal (J,l2[j]) == 1)
    507                 {
    508                   K = minbase(intersect (K,l1[j]));
    509                   l1 = delete (l1,j);
    510                   sizl1 = size(l1);
    511                   l2 = delete (l2,j);
    512                   sizl2 = size(l2);
    513                   j--;
    514                 }
    515             }
    516         }
    517       l3 = insert (l3,K);
    518     }
     481  {
     482    J = l2[i];
     483    sizl2i = size(l2[i]);
     484    K = l1[i];
     485    for (j = i+1 ; j <= sizl2 ; j++)
     486    {
     487      sizl2j = size(l2[j]);
     488      if (sizl2i == sizl2j)
     489      {
     490        if (equal (J,l2[j]) == 1)
     491        {
     492          K = minbase(intersect (K,l1[j]));
     493          l1 = delete (l1,j);
     494          sizl1 = size(l1);
     495          l2 = delete (l2,j);
     496          sizl2 = size(l2);
     497          j--;
     498        }
     499      }
     500    }
     501    l3 = insert (l3,K);
     502  }
    519503  return (l3);
    520504}
    521505/////////////////////////////////////////////////////////////////////////////
    522506//
    523 static proc isMinimal (ideal I)       
     507static proc isMinimal (ideal I)
    524508"
    525509USAGE:    isMinimal (I); I ideal.
     
    535519  I = simplify(I,2);
    536520  int resp = 1;
    537   int sizI = size(I);
     521  int sizI = ncols(I);
    538522  // Cambiamos el tamano de I cuando eliminamos generadores
    539523  for (i = 1 ; i <= sizI ; i++)
    540     {
    541       if (sizI <> 1)
    542         {
    543           if (i == 1)
    544             {
    545               J = I[2..sizI];
    546             }
    547           else
    548             {
    549               if (i > 1 && i < sizI)
    550                 {
    551                   J = I[1..i-1], I[i+1..sizI];
    552                 }
    553               else
    554                 {
    555                   J = I[1..sizI-1];
    556                 }
    557             }
    558           // Si quitamos el generador del lugar "i", luego el que
    559           // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos
    560           // 1 al i para volver al for de manera que recorramos los
    561           // generadores como debemos.               
    562           if (membershipMon(I[i],J) == 1)
    563             {
    564               resp = 0;
    565               I = J;
    566               i--;
    567               sizI = size(I);
    568             }
    569         }
    570     }
     524  {
     525    if (sizI <> 1)
     526    {
     527      if (i == 1)
     528      {
     529        J = I[2..sizI];
     530      }
     531      else
     532      {
     533        if (i > 1 && i < sizI)
     534        {
     535          J = I[1..i-1], I[i+1..sizI];
     536        }
     537        else
     538        {
     539          J = I[1..sizI-1];
     540        }
     541      }
     542      // Si quitamos el generador del lugar "i", luego el que
     543      // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos
     544      // 1 al i para volver al for de manera que recorramos los
     545      // generadores como debemos.
     546      if (membershipMon(I[i],J) == 1)
     547      {
     548        resp = 0;
     549        I = J;
     550        i--;
     551        sizI = size(I);
     552      }
     553    }
     554  }
    571555  if (resp == 1)
    572     {
    573       return (1);
    574     }
     556  {
     557    return (1);
     558  }
    575559  else
    576     {
    577       return (0,I);
    578     }
     560  {
     561    return (0,I);
     562  }
    579563}
    580564/////////////////////////////////////////////////////////////////////////////
    581 //       
    582 static proc isMonomialGB (ideal I)       
     565//
     566static proc isMonomialGB (ideal I)
    583567"
    584568USAGE:    isMonomialGB (I); I ideal.
     
    591575"
    592576{
    593   // Cambiamos de anillo
    594   def R = basering;
    595   int nvar = nvars(R);
    596   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    597   execute(s);
    598        
    599577  // Variables
    600   int resp,m,k;
    601   // Queremos la base de Grobner reducida, para uncidad.
    602   ideal I = fetch(R,I);
    603   option(redSB);       
     578  int resp;
    604579  // Si el ideal es cero, no es monomial.
    605580  if ( size(I) == 0)
    606     {
    607       return(0);
    608     }
     581  {
     582    return(0);
     583  }
     584  // Queremos la base de Grobner reducida, para uncidad.
     585  intvec save_opt=option(get);
     586  option(redSB);
    609587  // Base de Grobner
    610588  I = std(I);
     589  option(set,save_opt);
    611590  // Una vez que tenemos la GB, no es mas que comprobar que el ideal
    612591  // esta generado por monomios.
    613592  resp = checkIdeal(I);
    614593  if (resp == 0)
    615     {
    616       setring R;
    617       kill R1;
    618       return (0);
    619     }
     594  {
     595    return (0);
     596  }
    620597  else
    621     {
    622       setring R;
    623       I = fetch (R1,I);
    624       kill R1;
    625       return (1,I);
    626     }
     598  {
     599    return (1,I);
     600  }
    627601}
    628602/////////////////////////////////////////////////////////////////////////////
     
    635609proc areEqual(list l1,list l2)
    636610{
    637   def R = basering;
    638   l1 = fetch(R,l1);
    639   l2 = fetch(R,l2);
    640611  int i,j,sizIdeal;
    641612  poly generator;
     
    643614  int sizl1 = size(l1);
    644615  for (i = 1 ; i <= sizl1 ; i ++)
    645     {
    646       sizIdeal = size(l1[i]);
    647       generator = 1;
    648       for (j = 1 ; j <= sizIdeal ; j ++)
    649         {
    650           generator = generator*l1[i][j];
    651         }
    652       l1Ideal[i] = generator;
    653     }
     616  {
     617    sizIdeal = size(l1[i]);
     618    generator = 1;
     619    for (j = 1 ; j <= sizIdeal ; j ++)
     620    {
     621      generator = generator*l1[i][j];
     622    }
     623    l1Ideal[i] = generator;
     624  }
    654625  int sizl2 = size(l2);
    655626  for (i = 1 ; i <= sizl2 ; i ++)
    656     {
    657       sizIdeal = size(l2[i]);
    658       generator = 1;
    659       for (j = 1 ; j <= sizIdeal ; j ++)
    660         {
    661           generator = generator*l2[i][j];
    662         }
    663       l2Ideal[i] = generator;
    664     }
     627  {
     628    sizIdeal = size(l2[i]);
     629    generator = 1;
     630    for (j = 1 ; j <= sizIdeal ; j ++)
     631    {
     632      generator = generator*l2[i][j];
     633    }
     634    l2Ideal[i] = generator;
     635  }
    665636  return (equal(l1Ideal,l2Ideal));
    666637}
     
    670641//-------------------------------------------------------------------------//
    671642/////////////////////////////////////////////////////////////////////////////
    672 //       
    673 proc isMonomial (ideal I)       
     643//
     644proc isMonomial (ideal I)
    674645"USAGE:    isMonomial (I); I ideal.
    675646RETURN:   1, if I is monomial ideal; 0, otherwise.
     
    678649"
    679650{
    680   // Cambiamos de anillo
    681   def R = basering;
    682   int nvar = nvars(R);
    683   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    684   execute(s);       
     651  // Si el ideal es cero, no es monomial.
     652  if ( size(I) == 0)
     653  {
     654    return(0);
     655  }
     656  // Si ya viene dado por sistema de generadores monomiales, devolvemos 1
     657  if (checkIdeal (I) == 1)
     658  {
     659    return(1);
     660  }
    685661  // Variables
    686662  int resp,m,k;
    687663  // Queremos la base de Grobner reducida, para uncidad.
    688   ideal I = fetch(R,I);
    689   option(redSB);       
    690   // Si el ideal es cero, no es monomial.
    691   if ( size(I) == 0)
    692     {
    693       return(0);
    694     }
    695   // Si ya viene dado por sistema de generadores monomiales, devolvemos 1
    696   if (checkIdeal (I) == 1)
    697     {
    698       return(1);
    699     }
     664  intvec save_opt=option(get);
     665  option(redSB);
    700666  // Hallamos GB
    701667  I = std(I);
     668  option(set,save_opt);
    702669  // Una vez que tenemos la GB, no es mas que comprobar si el ideal
    703670  // esta generado por monomios.
    704671  resp = checkIdeal(I);
    705672  // Volvemos a dejar el comando "std" devolviendo una GB estandar.
    706   option(noredSB);
    707   setring R;
    708   kill R1;
    709673  return(resp);
    710674}
     
    733697  int control = checkIdeal(I);
    734698  if (control == 0)
    735     {
    736       return (-1);
    737     }
     699  {
     700    return (-1);
     701  }
    738702  // Quitamos los ceros del sistema de generadores.
    739703  I = simplify(I,2);
    740   int sizI = size(I);
     704  int sizI = ncols(I);
    741705  for (i = 1 ; i <= sizI ; i++)
    742     {
    743       if (sizI > 1)
    744         {
    745           if (i == 1)
    746             {
    747               J = I[2..sizI];
    748             }
    749           else
    750             {
    751               if (i > 1 && i < sizI)
    752                 {
    753                   J = I[1..i-1], I[i+1..sizI];
    754                 }
    755               else
    756                 {
    757                   if (i == sizI)
    758                     {
    759                       J = I[1..sizI-1];
    760                     }
    761                 }
    762             }
    763           // Si quitamos el generador del lugar "i", luego el que
    764           // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos
    765           // 1 al i para volver al for de manera que recorramos los
    766           // generadores como debemos.       
    767           if (membershipMon(I[i],J) == 1)
    768             {
    769               I = J;
    770               i--;
    771               sizI = size(I);
    772             }
    773         }
    774     }
     706  {
     707    if (sizI > 1)
     708    {
     709      if (i == 1)
     710      {
     711        J = I[2..sizI];
     712      }
     713      else
     714      {
     715        if (i > 1 && i < sizI)
     716        {
     717          J = I[1..i-1], I[i+1..sizI];
     718        }
     719        else
     720        {
     721          if (i == sizI)
     722          {
     723            J = I[1..sizI-1];
     724          }
     725        }
     726      }
     727      // Si quitamos el generador del lugar "i", luego el que
     728      // ocupa ahora el lugar "i" es el "i+1", de ahi que restemos
     729      // 1 al i para volver al for de manera que recorramos los
     730      // generadores como debemos.
     731      if (membershipMon(I[i],J) == 1)
     732      {
     733        I = J;
     734        i--;
     735        sizI = ncols(I);
     736      }
     737    }
     738  }
    775739  return (I);
    776740}
     
    841805    ERROR ("the input must be 2 monomials.");
    842806  }
    843   // Variables.
    844   int k;
    845   intvec exp;
    846   int nvar = nvars(basering);
     807  return(f*g/gcd(f,g));
     808  //// Variables.
     809  //int k;
     810  //intvec exp;
     811  //int nvar = nvars(basering);
    847812
    848   // No tenemos mas que tomar el mayor exponente.
    849   intvec expf = leadexp (f);
    850   intvec expg = leadexp (g);
    851        
    852   for (k = 1 ; k <= nvar ; k ++)
    853   {
    854     if (expf[k] <= expg[k])
    855     {
    856       exp[k] = expg[k];
    857     }
    858     else
    859     {
    860        exp[k] = expf[k];
    861     }
    862   }
    863   // Transformamos el vector de exponentes al monomio correspondiente.
    864   return(monomial (exp));
     813  //// No tenemos mas que tomar el mayor exponente.
     814  //intvec expf = leadexp (f);
     815  //intvec expg = leadexp (g);
     816
     817  //for (k = 1 ; k <= nvar ; k ++)
     818  //{
     819  //  if (expf[k] <= expg[k])
     820  //  {
     821  //    exp[k] = expg[k];
     822  //  }
     823  //  else
     824  //  {
     825  //     exp[k] = expf[k];
     826  //  }
     827  //}
     828  //// Transformamos el vector de exponentes al monomio correspondiente.
     829  //return(monomial (exp));
    865830}
    866831example
     
    873838//////////////////////////////////////////////////////////////////////
    874839//
    875 proc membershipMon(poly f,ideal I)       
     840proc membershipMon(poly f,ideal I)
    876841"USAGE:    membershipMon(f,I); f polynomial, I ideal.
    877842RETURN:   1, if f lies in I; 0 otherwise.
     
    881846"
    882847{
    883   def R = basering;
    884848  // Variables
    885849  int i,j,resp,k,control;
     
    914878  // Quitamos ceros.
    915879  I = simplify(I,2);
    916   int n = size(I);
     880  int n = ncols(I);
    917881  int m = size(f);
    918   int nvar = nvars(R);
     882  int nvar = nvars(basering);
    919883  for (i=1 ; i<=m ; i++)
    920884  {
     
    976940//////////////////////////////////////////////////////////////////////
    977941//
    978 proc intersectMon (ideal I,ideal J)       
     942proc intersectMon (ideal I,ideal J)
    979943"USAGE:    intersectMon (I,J); I,J ideals.
    980944RETURN:   an ideal, the intersection of I and J.
     
    991955  // El ideal trivial no es monomial.
    992956  if ( size(I) == 0 || size(J) == 0)
    993     {
    994       ERROR("one of the ideals is zero, hence not monomial.");
    995     }
     957  {
     958    ERROR("one of the ideals is zero, hence not monomial.");
     959  }
    996960 // COMPROBACIONES
    997961  control = checkIdeal(I);
    998962  if (control == 0)
    999     {
    1000       isMon = isMonomialGB(I);
    1001       if (isMon[1] == 0)
    1002         {
    1003           ERROR ("the first ideal is not monomial.");
    1004         }
    1005       else
    1006         {
    1007           // Sabemos que I ya viene dado por el sistema minimal de
    1008           // generadores, aunque aqui no sea necesario.
    1009           I = isMon[2];
    1010         }
    1011     }
     963  {
     964    isMon = isMonomialGB(I);
     965    if (isMon[1] == 0)
     966    {
     967      ERROR ("the first ideal is not monomial.");
     968    }
     969    else
     970    {
     971      // Sabemos que I ya viene dado por el sistema minimal de
     972      // generadores, aunque aqui no sea necesario.
     973      I = isMon[2];
     974    }
     975  }
    1012976  else
    1013     {
    1014       // Los generadores son monomiales, hallamos el sistema minimal
    1015       I = minbase(I);
    1016     }
     977  {
     978    // Los generadores son monomiales, hallamos el sistema minimal
     979    I = minbase(I);
     980  }
    1017981  control = checkIdeal(J);
    1018982  if (control == 0)
    1019     {
    1020       isMon = isMonomialGB (J);
    1021       if (isMon[1] == 0)
    1022         {
    1023           ERROR ("the second ideal is not monomial.");
    1024         }
    1025       else
    1026         {
    1027           // Sabemos que J ya viene dado por el sistema minimal de
    1028           // generadores, aunque aqui no sea necesario.
    1029           J = isMon[2];
    1030         }
    1031     }
     983  {
     984    isMon = isMonomialGB (J);
     985    if (isMon[1] == 0)
     986    {
     987      ERROR ("the second ideal is not monomial.");
     988    }
     989    else
     990    {
     991      // Sabemos que J ya viene dado por el sistema minimal de
     992      // generadores, aunque aqui no sea necesario.
     993      J = isMon[2];
     994    }
     995  }
    1032996  else
    1033     {
    1034       // Los generadores son monomiales,hallamos la base minimal
    1035       J = minbase(J);
    1036     }
     997  {
     998    // Los generadores son monomiales,hallamos la base minimal
     999    J = minbase(J);
     1000  }
    10371001  // Hemos asegurado que los ideales sean monomiales.
    10381002  // Quitamos ceros de la base para no alargar calculos.
    1039   int n = size(I);
    1040   int m = size(J);
     1003  int n = ncols(I);
     1004  int m = ncols(J);
    10411005  // Hallamos el m.c.m.de cada par de generadores de uno y otro ideal
    10421006  // y los a?adimos al ideal interseccion.
    10431007  for (i=1 ; i<=n ; i++)
    1044     {
    1045       for (j=1 ; j<=m ; j++)
    1046         {
    1047           K = K , lcmMon (I[i],J[j]);
    1048         }
    1049     }
     1008  {
     1009    for (j=1 ; j<=m ; j++)
     1010    {
     1011      K = K , lcmMon (I[i],J[j]);
     1012    }
     1013  }
    10501014  // Devolvemos el ideal ya dado por la base minimal porque sabemos
    10511015  // que este procedimiento genera muchos generadores redundantes.
     
    10611025//////////////////////////////////////////////////////////////////////
    10621026//
    1063 proc quotientMon (ideal I,ideal J)       
     1027proc quotientMon (ideal I,ideal J)
    10641028"USAGE:    quotientMon (I,J); I,J ideals.
    10651029RETURN:   an ideal, the quotient I:J.
     
    10761040  //COMPROBACIONES
    10771041  if (size(I) == 0 || size(J) == 0)
    1078     {
    1079       ERROR("one of the ideals is zero, hence not monomial.");
    1080     }
     1042  {
     1043    ERROR("one of the ideals is zero, hence not monomial.");
     1044  }
    10811045  control = checkIdeal(I);
    10821046  if (control == 0)
    1083     {
    1084       isMon = isMonomialGB (I);
    1085       if (isMon[1] == 0)
    1086         {
    1087           ERROR ("the first ideal is not monomial.");
    1088         }
    1089       else
    1090         {
    1091           // Sabemos que I ya viene dado por el sistema minimal de
    1092           // generadores, aunque aqui no sea necesario.
    1093           I = isMon[2];
    1094         }
    1095     }
     1047  {
     1048    isMon = isMonomialGB (I);
     1049    if (isMon[1] == 0)
     1050    {
     1051      ERROR ("the first ideal is not monomial.");
     1052    }
     1053    else
     1054    {
     1055      // Sabemos que I ya viene dado por el sistema minimal de
     1056      // generadores, aunque aqui no sea necesario.
     1057      I = isMon[2];
     1058    }
     1059  }
    10961060  else
    1097     {
    1098       // Los generadores son monomiales,hallamos sistema minimal
    1099       I = minbase(I);
    1100     }
     1061  {
     1062    // Los generadores son monomiales,hallamos sistema minimal
     1063    I = minbase(I);
     1064  }
    11011065  control = checkIdeal(J);
    11021066  if (control == 0)
    1103     {
    1104       isMon = isMonomialGB (J);
    1105       if (isMon[1] == 0)
    1106         {
    1107           ERROR ("the second ideal is not monomial.");
    1108           return (-1);
    1109         }
    1110       else
    1111         {
    1112           // Sabemos que J ya viene dado por el sistema minimal de
    1113           // generadores, aunque aqui no sea necesario.
    1114           J = isMon[2];
    1115         }
    1116     }
     1067  {
     1068    isMon = isMonomialGB (J);
     1069    if (isMon[1] == 0)
     1070    {
     1071      ERROR ("the second ideal is not monomial.");
     1072      return (-1);
     1073    }
     1074    else
     1075    {
     1076      // Sabemos que J ya viene dado por el sistema minimal de
     1077      // generadores, aunque aqui no sea necesario.
     1078      J = isMon[2];
     1079    }
     1080  }
    11171081  else
    1118     {
    1119       // Los generadores son monomiales, hallamos el sistema minimal
    1120       J = minbase(J);
    1121     }
     1082  {
     1083    // Los generadores son monomiales, hallamos el sistema minimal
     1084    J = minbase(J);
     1085  }
    11221086  // Tenemos los ideales dados por su sistema minimal (aunque no es necesario, ahorra
    11231087  // calculos. En K vamos a tener la interseccion de los ideales.
     
    11261090  // Los ideales estan dados por su sistema minimal, con lo que no aparecen ceros.
    11271091  // Luego podemos usar size(J).
    1128   n = size(J);
     1092  n = ncols(J);
    11291093  for (i = 1 ; i <= n ; i++)
    1130     {
    1131       K = intersect (K ,quotientIdealMon(I,J[i]));
    1132     }
     1094  {
     1095    K = intersect (K ,quotientIdealMon(I,J[i]));
     1096  }
    11331097  // Aqui tambien surgen muchos generadores que no forman parte de la
    11341098  // base minimal del ideal obtenido.
     
    11541118{
    11551119  // Cambiamos de anillo
    1156   def R = basering;
    1157   int nvar = nvars(R);
    1158   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    1159   execute(s);
     1120  int nvar = nvars(basering);
    11601121  // Variables
    11611122  int i,m,j,control;
     
    11631124  intvec v;
    11641125  ideal rad_I;
    1165   ideal I = fetch(R,I);
    11661126  // COMPROBACIONES
    11671127  control = checkIdeal(I);
     
    11691129  // que comprobar si el ideal es monomial.
    11701130  if (control == 0)
    1171     {
    1172       list isMon = isMonomialGB (I);
    1173       if (isMon[1] == 0)
    1174         {
    1175           ERROR ("the ideal is not monomial.");
    1176         }
    1177       else
    1178         {
    1179           I = isMon[2];
    1180           // Ya lo tenemos con los generadores monomiales minimales
    1181         }
    1182     }
     1131  {
     1132    list isMon = isMonomialGB (I);
     1133    if (isMon[1] == 0)
     1134    {
     1135      ERROR ("the ideal is not monomial.");
     1136    }
     1137    else
     1138    {
     1139      I = isMon[2];
     1140      // Ya lo tenemos con los generadores monomiales minimales
     1141    }
     1142  }
    11831143  else
    1184     {
    1185       // Generadores monomiales, hallamos sistema minimal
    1186       I = minbase(I);
    1187     }
     1144  {
     1145    // Generadores monomiales, hallamos sistema minimal
     1146    I = minbase(I);
     1147  }
    11881148  // Ya tenemos el ideal generado por la BASE MINIMAL MONOMIAL
    1189   m = size(I);
     1149  m = ncols(I);
    11901150  // Solo hay que poner exponente 1 a todas las variables que tengan
    11911151  // exponente >1.
    11921152  for (i = 1 ; i <= m ; i++)
    1193     {
    1194       v = leadexp(I[i]);
    1195       f = 1;
    1196       for (j = 1 ; j <= nvar ; j++)
    1197         {
    1198           if (v[j] <> 0)
    1199             {
    1200               f = f*x(j);
    1201             }
    1202         }
    1203       rad_I = rad_I,f;
    1204     }
    1205   setring R;       
     1153  {
     1154    v = leadexp(I[i]);
     1155    f = 1;
     1156    for (j = 1 ; j <= nvar ; j++)
     1157    {
     1158      if (v[j] <> 0)
     1159      {
     1160        f = f*var(j);
     1161      }
     1162    }
     1163    rad_I = rad_I,f;
     1164  }
    12061165  // Hay que devolver el ideal dado por la base minimal, pues se
    12071166  // producen muchos generadores redundantes.
    1208   ideal rad_I = fetch(R1,rad_I);
    1209   kill R1;
    12101167  return( minbase (rad_I));
    12111168}
     
    12181175//////////////////////////////////////////////////////////////////////
    12191176//
    1220 proc isprimeMon (ideal I)       
     1177proc isprimeMon (ideal I)
    12211178"USAGE:    isprimeMon (I); I ideal
    12221179RETURN:   1, if I is prime; 0, otherwise.
     
    12341191  // que comprobar si el ideal es monomial.
    12351192  if (control == 0)
    1236     {
    1237       list isMon = isMonomialGB (I);
    1238       if (isMon[1] == 0)
    1239         {
    1240           ERROR ("the ideal is not monomial.");
    1241         }
    1242       else
    1243         {
    1244           I = isMon[2];
    1245           // Ya lo tenemos con los generadores minimales
    1246         }
    1247     }
     1193  {
     1194    list isMon = isMonomialGB (I);
     1195    if (isMon[1] == 0)
     1196    {
     1197      ERROR ("the ideal is not monomial.");
     1198    }
     1199    else
     1200    {
     1201      I = isMon[2];
     1202      // Ya lo tenemos con los generadores minimales
     1203    }
     1204  }
    12481205  else
    1249     {
    1250       // Generadores monomiales, hallamos el sistema minimal
    1251       I = minbase(I);
    1252     }
     1206  {
     1207    // Generadores monomiales, hallamos el sistema minimal
     1208    I = minbase(I);
     1209  }
    12531210  // Ya tenemos el ideal generado por la BASE MINIMAL
    12541211  if (maxdeg1(I) == 1)
    1255     {
    1256       return (1);
    1257     }
    1258   return (0);               
     1212  {
     1213    return (1);
     1214  }
     1215  return (0);
    12591216}
    12601217example
     
    12681225//////////////////////////////////////////////////////////////////////
    12691226//
    1270 proc isprimaryMon (ideal I)       
     1227proc isprimaryMon (ideal I)
    12711228"USAGE:    isprimaryMon (I); I ideal
    12721229RETURN:   1, if I is primary; 0, otherwise.
     
    12761233"
    12771234{
    1278   def R = basering;
    12791235  // Variables
    12801236  int nvar,control,m,l,sub_in,i,j,k;
     
    12851241  // que comprobar si el ideal es monomial.
    12861242  if (control == 0)
    1287     {
    1288       list isMon = isMonomialGB (I);
    1289       if (isMon[1] == 0)
    1290         {
    1291           ERROR ("the ideal is not monomial.");
    1292         }
    1293       else
    1294         {
    1295           I = isMon[2];
    1296           // Ya lo tenemos con los generadores minimales
    1297         }
    1298     }
     1243  {
     1244    list isMon = isMonomialGB (I);
     1245    if (isMon[1] == 0)
     1246    {
     1247      ERROR ("the ideal is not monomial.");
     1248    }
     1249    else
     1250    {
     1251      I = isMon[2];
     1252      // Ya lo tenemos con los generadores minimales
     1253    }
     1254  }
    12991255  else
    1300     {
    1301       // Generadores monomiales, hallamos el sistema minimal
    1302       I = minbase(I);
    1303     }
     1256  {
     1257    // Generadores monomiales, hallamos el sistema minimal
     1258    I = minbase(I);
     1259  }
    13041260  // Ya tenemos el ideal generado por la BASE MINIMAL
    13051261  // Usamos la funcion "soporte" que hemos creado, para saber que
     
    13071263  // mismas y tambien cuales son los generadores del ideal donde
    13081264  // tenemos que comprobar si aparecen tales variables.
    1309   nvar = nvars(R);
    1310   m = size(I);
     1265  nvar = nvars(basering);
     1266  m = ncols(I);
    13111267  // Inicializo la ultima componente del vector para que contenga a
    13121268  // todas las variables (el subindice de la variable es el lugar
     
    13171273  // w = lugar de los generadores de I que son producto de mas de una variable.
    13181274  for (i = 1 ; i <= m ; i++)
    1319     {
    1320       sub_in = soporte(I[i]);
    1321       // Si soporte <> 0 la variable aparece sola, en caso contrario
    1322       // el generador es producto de mas de una variable
    1323       if (sub_in <> 0)
    1324         {
    1325           v[sub_in] = 1;
    1326         }
    1327       else
    1328         {
    1329           w[k] = i;
    1330           k++;
    1331         }
    1332     }
     1275  {
     1276    sub_in = soporte(I[i]);
     1277    // Si soporte <> 0 la variable aparece sola, en caso contrario
     1278    // el generador es producto de mas de una variable
     1279    if (sub_in <> 0)
     1280    {
     1281      v[sub_in] = 1;
     1282    }
     1283    else
     1284    {
     1285      w[k] = i;
     1286      k++;
     1287    }
     1288  }
    13331289  // Ahora solo hay que ver que no aparecen variables distintas de
    13341290  // las que tenemos marcadas con 1 en v.
     
    13371293  // son producto de una sola variable, luego es primario.
    13381294  if (l == 1 && w[1] == 0)
    1339     {
    1340       return(1);
    1341     }
     1295  {
     1296    return(1);
     1297  }
    13421298  // Estudiamos el exponente de los generadores de I oportunos (los
    13431299  // que nos indica w).
    13441300  for (i = 1 ; i <= l ; i++)
    1345     {
    1346       exp_gen = leadexp(I[w[i]]);
    1347       for (j = 1 ; j <= nvar ; j++)
    1348         {
    1349           if (v[j] == 0)
    1350             {
    1351               if (exp_gen[j] <> 0)
    1352                 {
    1353                   return (0);
    1354                 }
    1355             }
    1356         }
    1357     }
     1301  {
     1302    exp_gen = leadexp(I[w[i]]);
     1303    for (j = 1 ; j <= nvar ; j++)
     1304    {
     1305      if (v[j] == 0)
     1306      {
     1307        if (exp_gen[j] <> 0)
     1308        {
     1309          return (0);
     1310        }
     1311      }
     1312    }
     1313  }
    13581314  // Si hemos recorrido todo el ideal sin que salte el "for"
    13591315  // quiere decir que no se ha contradicho la caracterizacion,
     
    13861342  // que comprobar si el ideal es monomial.
    13871343  if (control == 0)
    1388     {
    1389       list isMon = isMonomialGB (I);
    1390       if (isMon[1] == 0)
    1391         {
    1392           ERROR ("the ideal is not monomial.");
    1393         }
    1394       else
    1395         {
    1396           I = isMon[2];
    1397           // Ya lo tenemos con los generadores minimales
    1398         }
    1399     }
     1344  {
     1345    list isMon = isMonomialGB (I);
     1346    if (isMon[1] == 0)
     1347    {
     1348      ERROR ("the ideal is not monomial.");
     1349    }
     1350    else
     1351    {
     1352      I = isMon[2];
     1353      // Ya lo tenemos con los generadores minimales
     1354    }
     1355  }
    14001356  else
    1401     {
    1402       // Generadores monomiales, hallamos sistema minimal
    1403       I = minbase(I);
    1404     }
     1357  {
     1358    // Generadores monomiales, hallamos sistema minimal
     1359    I = minbase(I);
     1360  }
    14051361  // Ya tenemos el ideal generado por la BASE MINIMAL
    1406   n = size(I);
     1362  n = ncols(I);
    14071363  // La funcion soporte devuelve 0 si el monomio es producto de mas
    14081364  // de una variable. Chequeamos generador a generador si el ideal
    14091365  // esta generado por potencias de variables.
    14101366  for (i = 1 ; i <= n ; i ++)
    1411     {
    1412       if (soporte(I[i]) == 0)
    1413         {
    1414           return(0);
    1415         }
    1416     }
     1367  {
     1368    if (soporte(I[i]) == 0)
     1369    {
     1370      return(0);
     1371    }
     1372  }
    14171373  return (1);
    14181374}
     
    14351391"
    14361392{
    1437   def R = basering;
    1438   int  nvar  = nvars(R);
     1393  int  nvar  = nvars(basering);
    14391394  // Declaracion de variables
    14401395  int i,j,k,cont,sizI;
     
    14451400  // que comprobar si el ideal es monomial.
    14461401  if (control == 0)
    1447     {
    1448       list isMon = isMonomialGB (I);
    1449       if (isMon[1] == 0)
    1450         {
    1451           ERROR ("the ideal is not monomial.");
    1452         }
    1453       else
    1454         {
    1455           I = isMon[2];
    1456           // Ya lo tenemos con los generadores minimales
    1457         }
    1458     }
     1402  {
     1403    list isMon = isMonomialGB (I);
     1404    if (isMon[1] == 0)
     1405    {
     1406      ERROR ("the ideal is not monomial.");
     1407    }
     1408    else
     1409    {
     1410      I = isMon[2];
     1411      // Ya lo tenemos con los generadores minimales
     1412    }
     1413  }
    14591414  else
    1460     {
    1461       // Generadores monomiales, hallamos sistema minimal
    1462       I = minbase(I);
    1463     }
     1415  {
     1416    // Generadores monomiales, hallamos sistema minimal
     1417    I = minbase(I);
     1418  }
    14641419  // Ya tenemos el ideal generado por la BASE MINIMAL
    1465   sizI = size(I);
     1420  sizI = ncols(I);
    14661421  // Comprobamos que entre los generadores minimales aparece una
    14671422  // potencia de cada. Cuando encontramos un generador que es potencia
     
    14691424  cont = 0;
    14701425  for (i = 1 ; i <= sizI ; i++)
    1471     {
    1472       if (soporte(I[i]) <> 0)
    1473         {
    1474           cont ++;
    1475           // Solo volvemos a evaluar en caso de que hayamos aumentado
    1476           if (cont == nvar)
    1477             {
    1478               // Ya hemos encontrado que todas las variables aparrecen en
    1479               // el sistema minimal como potencia pura. No queremos seguir
    1480               // buscando
    1481               return (1);
    1482             }
    1483         }
    1484     }
     1426  {
     1427    if (soporte(I[i]) <> 0)
     1428    {
     1429      cont ++;
     1430      // Solo volvemos a evaluar en caso de que hayamos aumentado
     1431      if (cont == nvar)
     1432      {
     1433        // Ya hemos encontrado que todas las variables aparrecen en
     1434        // el sistema minimal como potencia pura. No queremos seguir
     1435        // buscando
     1436        return (1);
     1437      }
     1438    }
     1439  }
    14851440  // Si ha salido, es que faltan variables
    14861441  return(0);
     
    15041459"
    15051460{
    1506   def R = basering;
    1507   int nvar = nvars(R);
     1461  int nvar = nvars(basering);
    15081462  // Declaracion de variables
    15091463  int sizI,i,j,k;
     
    15141468  // que comprobar si el ideal es monomial.
    15151469  if (control == 0)
    1516     {
    1517       list isMon = isMonomialGB (I);
    1518       if (isMon[1] == 0)
    1519         {
    1520           ERROR ("the ideal is not monomial.");
    1521         }
    1522       else
    1523         {
    1524           I = isMon[2];
    1525           // Ya lo tenemos con los generadores minimales
    1526         }
    1527     }
     1470  {
     1471    list isMon = isMonomialGB (I);
     1472    if (isMon[1] == 0)
     1473    {
     1474      ERROR ("the ideal is not monomial.");
     1475    }
     1476    else
     1477    {
     1478      I = isMon[2];
     1479      // Ya lo tenemos con los generadores minimales
     1480    }
     1481  }
    15281482  else
    1529     {
    1530       // Generadores monomiales, hallamos sistema minimal
    1531       I = minbase(I);
    1532     }
     1483  {
     1484    // Generadores monomiales, hallamos sistema minimal
     1485    I = minbase(I);
     1486  }
    15331487  // Ya tenemos el ideal generado por la BASE MINIMAL
    1534   sizI = size(I);
     1488  sizI = ncols(I);
    15351489  // Creamos una lista que tenga los exponentes de todos los
    15361490  // generadores.
    15371491  for (i = 1 ; i <= sizI ; i++)
    1538     {
    1539       exp[i] = leadexp(I[i]);
    1540     }
     1492  {
     1493    exp[i] = leadexp(I[i]);
     1494  }
    15411495  // Ahora hay que ver si alguno se repite, y si uno de ellos
    15421496  // lo hace, ya no es gen?rico.
    15431497  for (i = 1 ; i <= nvar ; i++)
    1544     {
    1545       for (j = 1 ; j <= sizI-1 ; j++)
    1546         {
    1547           for (k = j+1 ; k <= sizI ; k++)
    1548             {
    1549               // Notar que no se pueden repetir si la variable realmente
    1550               // aparece en el generador, es decir, exponente >1.
    1551               if (exp[j][i] == exp[k][i] & exp[j][i] <> 0)
    1552                 {
    1553                   return (0);
    1554                 }
    1555             }
    1556         }
    1557     }
     1498  {
     1499    for (j = 1 ; j <= sizI-1 ; j++)
     1500    {
     1501      for (k = j+1 ; k <= sizI ; k++)
     1502      {
     1503        // Notar que no se pueden repetir si la variable realmente
     1504        // aparece en el generador, es decir, exponente >1.
     1505        if (exp[j][i] == exp[k][i] & exp[j][i] <> 0)
     1506        {
     1507          return (0);
     1508        }
     1509      }
     1510    }
     1511  }
    15581512  return (1);
    15591513}
     
    15771531"
    15781532{
    1579   def R = basering;
    1580   int nvar = nvars(R);
     1533 // El ideal trivial no es monomial.
     1534  if ( size(I) == 0 )
     1535  {
     1536    ERROR("the ideal is zero, hence not monomial.");
     1537  }
    15811538  // VARIABLES
    15821539  int control,sizSum,sumandos,i,j,k,cont;
    1583   intvec index,indexAux,vaux,w;
    1584   list sum, sumAux;
    1585   // La base del ideal tiene que ser la monomial
    1586  // El ideal trivial no es monomial.
    1587   if ( size(I) == 0 )
    1588     {
    1589       ERROR("the ideal is zero, hence not monomial.");
    1590     }
    15911540 // COMPROBACIONES
    15921541  control = checkIdeal(I);
    15931542  if (control == 0)
    1594     {
    1595       list isMon = isMonomialGB (I);
    1596       if (isMon[1] == 0)
    1597         {
    1598           ERROR ("the ideal is not monomial.");
    1599         }
    1600       else
    1601         {
    1602           // Sabemos que I ya viene dado por el sistema minimal de
    1603           // generadores, aunque aqui no sea necesario.
    1604           I = isMon[2];
    1605         }
    1606     }
    1607   // Si el ideal es artiniano, es 0-dimensional
    1608   if (isartinianMon(I) == 1)
    1609     {
    1610       return (0);
    1611     }
    1612   int sizI = size(I);
    1613   // v(i) = vector con sizI entradas y donde cada entrada "j" se corresponde
    1614   //        con el exponente del generador "i" en la variable "j"
    1615   for (i = 1 ; i <= nvar ; i++)
    1616     {
    1617       intvec v(i);
    1618       for (j = 1 ; j <= sizI ;j++ )
    1619         {
    1620           v(i)[j] = leadexp(I[j])[i];
    1621         }
    1622     }
    1623   // Vamos a guardar en el vector "index" la ultima variable que se ha
    1624   // sumado y en cada "sum(i)" el vector suma que se corresponde con la
    1625   // entrada "i" del vector index.
    1626   // Inicializo los valores de index y de cada sum
    1627   w[sizI] = 0;
    1628   sum[1] = w;
    1629   index[1] = 0;
    1630   sizSum = 1;
    1631   while ( 1 )
    1632     {
    1633       cont = 1;
    1634       sumandos ++;
    1635       for (i = 1 ; i <= sizSum ; i ++)
    1636         {
    1637           for (j = index[i] + 1 ; j <= nvar ; j ++)
    1638             {
    1639               w = sum[i];
    1640               vaux = w + v(j);
    1641               // Comprobamos
    1642               for (k = 1 ; k <= sizI ; k ++)
    1643                 {
    1644                   if (vaux[k] == 0)
    1645                     {
    1646                       break;
    1647                     }
    1648                 }
    1649               if (k == sizI +1)
    1650                 {
    1651                   return (nvar - sumandos);
    1652                 }
    1653               if (j <> nvar)
    1654                 {
    1655                   sumAux[cont] = vaux;
    1656                   indexAux[cont] = j;
    1657                   cont ++;
    1658                 }
    1659             }
    1660        
    1661         }
    1662       index = indexAux;
    1663       sum = sumAux;
    1664       sizSum = size(sumAux);
    1665     }
     1543  {
     1544    list isMon = isMonomialGB (I);
     1545    if (isMon[1] == 0)
     1546    {
     1547      ERROR ("the ideal is not monomial.");
     1548    }
     1549    else
     1550    {
     1551      // Sabemos que I ya viene dado por el sistema minimal de
     1552      // generadores, aunque aqui no sea necesario.
     1553      I = isMon[2];
     1554    }
     1555  }
     1556  attrib(I,"isSB",1);
     1557  return (dim(I));
     1558//  int nvar = nvars(basering);
     1559//  intvec index,indexAux,vaux,w;
     1560//  list sum, sumAux;
     1561//  // La base del ideal tiene que ser la monomial
     1562//  // Si el ideal es artiniano, es 0-dimensional
     1563//  if (isartinianMon(I) == 1)
     1564//  {
     1565//    return (0);
     1566//  }
     1567//  int sizI = ncols(I);
     1568//  // v(i) = vector con sizI entradas y donde cada entrada "j" se corresponde
     1569//  //        con el exponente del generador "i" en la variable "j"
     1570//  for (i = 1 ; i <= nvar ; i++)
     1571//  {
     1572//    intvec v(i);
     1573//    for (j = 1 ; j <= sizI ;j++ )
     1574//    {
     1575//      v(i)[j] = leadexp(I[j])[i];
     1576//    }
     1577//  }
     1578//  // Vamos a guardar en el vector "index" la ultima variable que se ha
     1579//  // sumado y en cada "sum(i)" el vector suma que se corresponde con la
     1580//  // entrada "i" del vector index.
     1581//  // Inicializo los valores de index y de cada sum
     1582//  w[sizI] = 0;
     1583//  sum[1] = w;
     1584//  index[1] = 0;
     1585//  sizSum = 1;
     1586//  while ( 1 )
     1587//  {
     1588//    cont = 1;
     1589//    sumandos ++;
     1590//    for (i = 1 ; i <= sizSum ; i ++)
     1591//    {
     1592//      for (j = index[i] + 1 ; j <= nvar ; j ++)
     1593//      {
     1594//        w = sum[i];
     1595//        vaux = w + v(j);
     1596//        // Comprobamos
     1597//        for (k = 1 ; k <= sizI ; k ++)
     1598//        {
     1599//          if (vaux[k] == 0)
     1600//          {
     1601//            break;
     1602//          }
     1603//        }
     1604//        if (k == sizI +1)
     1605//        {
     1606//          return (nvar - sumandos);
     1607//        }
     1608//        if (j <> nvar)
     1609//        {
     1610//          sumAux[cont] = vaux;
     1611//          indexAux[cont] = j;
     1612//          cont ++;
     1613//        }
     1614//      }
     1615//    }
     1616//    index = indexAux;
     1617//    sum = sumAux;
     1618//    sizSum = size(sumAux);
     1619//  }
    16661620}
    16671621example
     
    16901644static proc irredDec1 (ideal I)
    16911645{
    1692   // Cambiamos de anillo
    1693   def R = basering;
    1694   int nvar = nvars(R);
    1695   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    1696   execute(s);
    16971646  // Variables
    16981647  int i,j,n,resp;
     
    17001649  intvec exp,v;
    17011650  ideal J,K;
    1702   ideal I = fetch(R,I);
    17031651  // ----- DESCOMPOSICION IRREDUCIBLE
    17041652  // Inicializamos la lista que va a estar formada por los ideales
     
    17071655  l1 = I;
    17081656  while (size(l1) > 0)
    1709     {
    1710       for (i = 1 ; i <= size(l1) ; i++)
    1711         {
    1712           J = l1[i];
    1713           n = size(J);
    1714           l1 = delete(l1,i);
    1715           // Llamamos a la funcion que va a detectar si el ideal es o
    1716           // no irreducible, y en caso de no serlo sabemos sobre que
    1717           // generador y con que variables hay que aplicar el
    1718           // el resultado teorico.
    1719           v = irredAux (J);
    1720           // No irreducible
    1721           if (size(v) > 1)
    1722             {
    1723               // En este caso, v[1] nos indica el generador del ideal
    1724               // que debemos eliminar.
    1725               exp = leadexp(J[v[1]]);
    1726               if (v[1] == 1)
    1727                 {
    1728                   J = J[2..n];
    1729                 }
    1730               if (v[1] > 1 && v[1] < n)
    1731                 {
    1732                   J = J[1..v[1]-1],J[v[1]+1..n];
    1733                 }
    1734               if (v[1] == n)
    1735                 {
    1736                   J = J[1..n-1];
    1737                 }
    1738               // Ahora vamos a introducir los nuevos generadores en
    1739               // cada uno de los nuevos ideales que generamos. Los
    1740               // ponemos en la lista en la que comprobamos.
    1741               for (j = 1 ; j <= size(v)-1 ; j++)
    1742                 {
    1743                   K = J,x(v[j+1])^exp[v[j+1]];
    1744                   l1 = insert(l1,minbase(K));
    1745                 }
    1746             }
    1747           // Si v[1]=0, el ideal es irreducible y lo introducimos en
    1748           // la lista l2, que es la que finalmente devolvera las
    1749           // componentes de la descomposicion.
    1750           else
    1751             {
    1752               l2 = insert(l2,J);
    1753             }
    1754         }
    1755     }
     1657  {
     1658    for (i = 1 ; i <= size(l1) ; i++)
     1659    {
     1660      J = l1[i];
     1661      n = ncols(J);
     1662      l1 = delete(l1,i);
     1663      // Llamamos a la funcion que va a detectar si el ideal es o
     1664      // no irreducible, y en caso de no serlo sabemos sobre que
     1665      // generador y con que variables hay que aplicar el
     1666      // el resultado teorico.
     1667      v = irredAux (J);
     1668      // No irreducible
     1669      if (size(v) > 1)
     1670      {
     1671        // En este caso, v[1] nos indica el generador del ideal
     1672        // que debemos eliminar.
     1673        exp = leadexp(J[v[1]]);
     1674        if (v[1] == 1)
     1675        {
     1676          J = J[2..n];
     1677        }
     1678        if (v[1] > 1 && v[1] < n)
     1679        {
     1680          J = J[1..v[1]-1],J[v[1]+1..n];
     1681        }
     1682        if (v[1] == n)
     1683        {
     1684          J = J[1..n-1];
     1685        }
     1686        // Ahora vamos a introducir los nuevos generadores en
     1687        // cada uno de los nuevos ideales que generamos. Los
     1688        // ponemos en la lista en la que comprobamos.
     1689        for (j = 1 ; j <= size(v)-1 ; j++)
     1690        {
     1691          K = J,var(v[j+1])^exp[v[j+1]];
     1692          l1 = insert(l1,minbase(K));
     1693        }
     1694      }
     1695      // Si v[1]=0, el ideal es irreducible y lo introducimos en
     1696      // la lista l2, que es la que finalmente devolvera las
     1697      // componentes de la descomposicion.
     1698      else
     1699      {
     1700        l2 = insert(l2,J);
     1701      }
     1702    }
     1703  }
    17561704  // ---- IRREDUNDANTE
    17571705  l2 = irredundant (l2);
    17581706  // La salida es la lista de los ideales irreducibles.
    1759   setring R;
    1760   list l2 = fetch(R1,l2);
    1761   kill R1;
    17621707  return (l2);
    17631708}
     
    17671712//////////////////////////////////////////////////////////////////////
    17681713//
    1769 static proc primDec1 (ideal I)  {
     1714static proc primDec1 (ideal I)
     1715{
    17701716  // Variables
    17711717  list l1,l2;
     
    17791725// METODO 2: Metodo directo para descomp. primaria (ver Vasconcelos)
    17801726//
    1781 //////////////////////////////////////////////////////////////////////       
     1727//////////////////////////////////////////////////////////////////////
    17821728// La siguiente funcion va a calcular una descomposicion primaria   //
    17831729// minimal de un ideal monomial, pero esta vez usando la            //
     
    17861732//////////////////////////////////////////////////////////////////////
    17871733//
    1788 static proc primDec2 (ideal I)  {
    1789   // Cambiamos de anillo
    1790   def R = basering;
    1791   int nvar = nvars(R);
    1792   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    1793   execute(s);
     1734static proc primDec2 (ideal I)
     1735{
    17941736  // Variables en el nuevo anillo
    17951737  int i,n,max;
     
    17971739  intvec v;
    17981740  ideal J,K;
    1799   ideal I = fetch(R,I);
    18001741  // Vamos a tener dos listas: l1 que va a guardar todos los ideales
    18011742  // que vayamos generando con el resultado citado antes, que seran
     
    18051746  l1 = I;
    18061747  while (size(l1) > 0)
    1807     {
    1808       for (i = 1 ; i <= size(l1) ; i++)
    1809         {
    1810           J = l1[i];
    1811           n = size(J);
    1812           l1 = delete (l1,i);
    1813           // Usamos la funcion que hemos creado para saber si el ideal
    1814           // es primario. Si no lo es devuelve la variable que crea
    1815           // conflicto y los generadores del ideal que luego hay que
    1816           // usar (los que tienen productos de mas de una vble).
    1817           // Se le llama con el sistema minimal de generadores
    1818           v = primAux (J);
    1819           // En caso de no ser primario, hay que buscar el maximo
    1820           // exponente de la variable que aparece en los generadores
    1821           // del ideal multiplicada siempre por otras variables,
    1822           // nunca por si misma.
    1823           if (v[1] == 0)
    1824             {
    1825               max = maxExp(J,v);
    1826               K = J,x(v[2])^max;
    1827               l1 = insert (l1,minbase(K));
    1828               K = quotientIdealMon(J,x(v[2])^max);
    1829               // quotientidealMon devuelve sistema minimal de generadores
    1830               l1 = insert (l1,minbase(K));
    1831             }
    1832           // En caso de ser primario, lo introducimos en la lista
    1833           // conveniente.
    1834           else
    1835             {
    1836               l2 = insert (l2,J);
    1837             }
    1838         }
    1839     }
     1748  {
     1749    for (i = 1 ; i <= size(l1) ; i++)
     1750    {
     1751      J = l1[i];
     1752      n = ncols(J);
     1753      l1 = delete (l1,i);
     1754      // Usamos la funcion que hemos creado para saber si el ideal
     1755      // es primario. Si no lo es devuelve la variable que crea
     1756      // conflicto y los generadores del ideal que luego hay que
     1757      // usar (los que tienen productos de mas de una vble).
     1758      // Se le llama con el sistema minimal de generadores
     1759      v = primAux (J);
     1760      // En caso de no ser primario, hay que buscar el maximo
     1761      // exponente de la variable que aparece en los generadores
     1762      // del ideal multiplicada siempre por otras variables,
     1763      // nunca por si misma.
     1764      if (v[1] == 0)
     1765      {
     1766        max = maxExp(J,v);
     1767        K = J,var(v[2])^max;
     1768        l1 = insert (l1,minbase(K));
     1769        K = quotientIdealMon(J,var(v[2])^max);
     1770        // quotientidealMon devuelve sistema minimal de generadores
     1771        l1 = insert (l1,minbase(K));
     1772      }
     1773      // En caso de ser primario, lo introducimos en la lista
     1774      // conveniente.
     1775      else
     1776      {
     1777        l2 = insert (l2,J);
     1778      }
     1779    }
     1780  }
    18401781// ------   IRREDUNDANTE
    18411782  l2 = irredundant (l2);
    1842   setring R;
    1843   list l2 = fetch (R1,l2);
    1844   kill R1;
    18451783  return (l2);
    18461784}
     
    18541792//////////////////////////////////////////////////////////////////////
    18551793//
    1856 static proc irredDec3 (ideal I)  {
    1857   def R = basering;
     1794static proc irredDec3 (ideal I)
     1795{
    18581796  int i,n,j;
    18591797  poly lcm;
     
    18621800  list l;
    18631801  // Hallamos el m.c.m. de los generadores minimales del ideal.
    1864   n = size (I);
     1802  n = ncols (I);
    18651803  lcm = I[1];
    18661804  for ( i = 2 ; i <= n ; i++ )
    1867     {
    1868       lcm = lcmMon (lcm,I[i]);
    1869     }
     1805  {
     1806    lcm = lcmMon (lcm,I[i]);
     1807  }
    18701808  v = leadexp (lcm);
    18711809  // Calculamos el dual de Alexander.
     
    18891827//////////////////////////////////////////////////////////////////////
    18901828//
    1891 static proc primDec3 (ideal I)   {
     1829static proc primDec3 (ideal I)
     1830{
    18921831  // Variables
    18931832  list l1,l2;
     
    19071846//////////////////////////////////////////////////////////////////////
    19081847//
    1909 static proc irredDec4 (ideal I)  {
     1848static proc irredDec4 (ideal I)
     1849{
    19101850  // Cambiamos de anillo.
    1911   def R = basering;
    1912   int nvar = nvars(R);
    1913   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    1914   execute(s);
     1851  int nvar = nvars(basering);
    19151852 // Variables
    19161853  int n,i,j,m,resp;
     
    19191856  ideal J,K;
    19201857  list L;
    1921   ideal I = fetch (R,I);
    19221858  // Calculamos el l.c.m. de los generadores minimales del ideal.
    1923   n = size (I);
     1859  n = ncols (I);
    19241860  lcm = I[1];
    19251861  for ( i = 2 ; i <= n ; i++ )
    1926     {
    1927       lcm = lcmMon (lcm,I[i]);
    1928     }
     1862  {
     1863    lcm = lcmMon (lcm,I[i]);
     1864  }
    19291865  v = leadexp (lcm);
    19301866  // Hallamos el ideal J = (x(1)^(l(1)+1),...,x(n)^(l(n)+1)). Como
     
    19331869  // el ideal J.
    19341870  for ( i = 1 ; i <= nvar ; i++ )
    1935     {
    1936       J[i] = (x(i))^(v[i]+1);
    1937     }
     1871  {
     1872    J[i] = (var(i))^(v[i]+1);
     1873  }
    19381874  // Ahora hacemos el cociente oportuno.
    19391875  K = minbase(quotient (J,I));
     
    19411877  // generadores de J. Los generadores que son divisibles los hacemos
    19421878  // cero y luego los eliminamos.
    1943   m = size (K);
     1879  m = ncols (K);
    19441880  for ( i = 1 ; i <= m ; i++ )
    1945     {
    1946       resp = membershipMon(K[i],J);
    1947       if ( resp == 1)
    1948         {
    1949           K[i] = 0;
    1950         }
    1951     }
     1881  {
     1882    resp = membershipMon(K[i],J);
     1883    if ( resp == 1)
     1884    {
     1885      K[i] = 0;
     1886    }
     1887  }
    19521888  K = simplify (K,2);
    19531889  // Ahora obtenemos las componentes de la descomposicion irreducible,
     
    19561892  // Volvemos al anillo de partida y devolvemos la lista de las
    19571893  // componentes irreducibles irredundantes.
    1958   setring R;
    1959   list L = fetch(R1,L);
    1960   kill R1;
    19611894  return (L);
    19621895}
     
    19671900//////////////////////////////////////////////////////////////////////
    19681901//
    1969 static proc primDec4 (ideal I) {
     1902static proc primDec4 (ideal I)
     1903{
    19701904  // Variables
    19711905  list l1,l2;
     
    19871921static proc irredDec5 (ideal I)
    19881922{
    1989   // New ring
    1990   def R = basering;
    1991   int nvar = nvars(R);
    1992   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    1993   execute(s);
    1994   ideal I = fetch (R,I);
     1923  int nvar = nvars(basering);
    19951924  //Variables
    19961925  int i,j;
     
    19991928  list artiniano = artinian (I);
    20001929  if (artiniano[1] == 0)
    2001     {
    2002       I = artiniano[2];
    2003       intvec elimina = artiniano[3];
    2004     }
     1930  {
     1931    I = artiniano[2];
     1932    intvec elimina = artiniano[3];
     1933  }
    20051934  // Quotient
    2006   ideal M = (x(1..nvar));
     1935  ideal M = maxideal(1);
    20071936  ideal J = quotient (I,M);
    20081937  // Deleting generators lying in I
    2009   for (i = 1 ; i <= size(J) ; i ++)
    2010     {
    2011       if (membershipMon(J[i],I) == 1)
    2012         {
    2013           if (i == 1)
    2014             {
    2015               J = J[2..size(J)];
    2016               i --;
    2017             }
    2018           else
    2019             {
    2020               if (i == size(J))
    2021                 {
    2022                   J = J[1..size(J)-1];
    2023                   i --;
    2024                 }
    2025               else
    2026                 {
    2027                   J = J[1..i-1],J[i+1..size(J)];
    2028                   i --;
    2029                 }
    2030             }
    2031         }
    2032     }
     1938  for (i = 1 ; i <= ncols(J) ; i ++)
     1939  {
     1940    if (membershipMon(J[i],I) == 1)
     1941    {
     1942      if (i == 1)
     1943      {
     1944        J = J[2..ncols(J)];
     1945        i --;
     1946      }
     1947      else
     1948      {
     1949        if (i == ncols(J))
     1950        {
     1951          J = J[1..i-1];
     1952          i --;
     1953        }
     1954        else
     1955        {
     1956          J = J[1..i-1],J[i+1..ncols(J)];
     1957          i --;
     1958        }
     1959      }
     1960    }
     1961  }
    20331962  // Exponents of the ideals are going to form the decomposition
    2034   int sizJ = size(J);
     1963  int sizJ = ncols(J);
    20351964  for (i = 1 ; i <= sizJ ; i ++ )
    2036     {
    2037       intvec exp(i) = leadexp(J[i]) + 1;
    2038     }
     1965  {
     1966    intvec exp(i) = leadexp(J[i]) + 1;
     1967  }
    20391968  // Deleting artinianization process
    20401969  if (artiniano[1] == 0)
    2041    {
    2042      // En elimina estan guardadas las variables que hay que eliminar
    2043      for (i = 1 ; i <= nvar ; i ++)
    2044        {
    2045          if (elimina[i] <> 0)
    2046            {
    2047              for (j = 1 ; j <= sizJ ; j ++)
    2048                {
    2049                  if (exp(j)[i] == elimina[i])
    2050                    {
    2051                      exp(j)[i] = 0;
    2052                    }
    2053                }
    2054            }
    2055        }
    2056    }
     1970  {
     1971    // En elimina estan guardadas las variables que hay que eliminar
     1972    for (i = 1 ; i <= nvar ; i ++)
     1973    {
     1974      if (elimina[i] <> 0)
     1975      {
     1976        for (j = 1 ; j <= sizJ ; j ++)
     1977        {
     1978          if (exp(j)[i] == elimina[i])
     1979          {
     1980            exp(j)[i] = 0;
     1981          }
     1982        }
     1983      }
     1984    }
     1985  }
    20571986  // En exp(i) tengo los exponentes de cada variable de las que aparecen
    20581987  // en cada ideal.
    20591988  list facets;
    20601989  for (i = 1 ; i <= sizJ ; i ++)
    2061     {
    2062       J = 0;
    2063       for (j = 1 ; j <= nvar ; j ++)
    2064         {
    2065           if (exp(i)[j] <> 0)
    2066             {
    2067               J = J,x(j)^exp(i)[j];
    2068             }
    2069         }
    2070       J = simplify(J,2);
    2071       facets[i] = J;
    2072     }
    2073   setring R;
    2074   list facets = fetch (R1,facets);
    2075   kill R1;
     1990  {
     1991    J = 0;
     1992    for (j = 1 ; j <= nvar ; j ++)
     1993    {
     1994      if (exp(i)[j] <> 0)
     1995      {
     1996        J = J,var(j)^exp(i)[j];
     1997      }
     1998    }
     1999    J = simplify(J,2);
     2000    facets[i] = J;
     2001  }
    20762002  return (facets);
    20772003}
     
    20822008//////////////////////////////////////////////////////////////////////
    20832009//
    2084 static proc primDec5 (ideal I) {
     2010static proc primDec5 (ideal I)
     2011{
    20852012  // Variables
    20862013  list l1,l2;
     
    21082035  int max,j,k,sizI;
    21092036  intvec exp;
    2110   sizI = size(I);
     2037  sizI = ncols(I);
    21112038  max = 0;
    21122039  for (j = 1 ; j <= sizI ; j ++)
    2113     {
    2114       exp = leadexp(I[j]);
    2115       if ( exp[i] > max)
    2116         {
    2117           max = exp[i];
    2118         }
    2119     }
     2040  {
     2041    exp = leadexp(I[j]);
     2042    if ( exp[i] > max)
     2043    {
     2044      max = exp[i];
     2045    }
     2046  }
    21202047  return(max);
    21212048}
     
    21302057{
    21312058  // Cambiamos de anillo
    2132   def R = basering;
    2133   int  nvar  = nvars(R);
    2134   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2135   execute(s);
     2059  int  nvar  = nvars(basering);
    21362060  // Declaracion de variables
    21372061  int i,j,k,cont1,cont2,sizI,marcavar,max;
     
    21392063  list nuevo;
    21402064  ideal J;
    2141   ideal I = fetch(R,I);
    2142   sizI = size(I);
     2065  sizI = ncols(I);
    21432066  // Comprobamos que entre los generadores minimales aparece una
    21442067  // potencia de cada
    21452068  cont2 = 0;
    21462069  for (i = 1 ; i <= sizI ; i++)
    2147     {
    2148       v = leadexp(I[i]);
    2149       marcavar  = 0;
    2150       cont1 = 0;
    2151       for (j = 1 ; j <= nvar ; j++)
    2152         {
    2153           if (v[j] <> 0)
    2154             {
    2155               cont1 ++;
    2156               marcavar = j;
    2157             }
    2158         }
    2159       // Si cont1=1 hemos encontrado un generador de los que nos
    2160       // interesa."variablesin" guarda el indice de las que estan.
    2161       if (cont1 == 1)
    2162         {
    2163           cont2 ++;
    2164           variablesin[cont2] = marcavar;
    2165         }
    2166     }
     2070  {
     2071    v = leadexp(I[i]);
     2072    marcavar  = 0;
     2073    cont1 = 0;
     2074    for (j = 1 ; j <= nvar ; j++)
     2075    {
     2076      if (v[j] <> 0)
     2077      {
     2078        cont1 ++;
     2079        marcavar = j;
     2080      }
     2081    }
     2082    // Si cont1=1 hemos encontrado un generador de los que nos
     2083    // interesa."variablesin" guarda el indice de las que estan.
     2084    if (cont1 == 1)
     2085    {
     2086      cont2 ++;
     2087      variablesin[cont2] = marcavar;
     2088    }
     2089  }
    21672090  // Notar que como el sistema de generadores es minimal no se
    21682091  // va a repetir la potencia de la misma variable. Por tanto basta
    21692092  // comprobar si cont2 es o no nvar.
    21702093  if (cont2 == nvar)
    2171     {
    2172       setring R;
    2173       list output;
    2174       output[1] = 1;
    2175       return(output);
    2176     }
     2094  {
     2095    list output;
     2096    output[1] = 1;
     2097    return(output);
     2098  }
    21772099  else
    2178     {
    2179       J = I;
    2180       // Buscamos las que no estan
    2181       if (cont2 == 0)
    2182         {
    2183           for (i = 1 ; i <= nvar ; i ++)
    2184             {
    2185               max = maximoExp(I,i);
    2186               cambio[i] = max + 1;
    2187               J = J,x(i)^(max + 1);
    2188             }
    2189         }
    2190       else
    2191         {
    2192           for (i = 1 ; i <= nvar ; i++)
    2193             {
    2194               for (j = 1 ; j <= cont2 ; j ++)
    2195                 {
    2196                   if (i == variablesin[j])
    2197                     {
    2198                       cambio[i] = 0;
    2199                       break;
    2200                     }
    2201                 }
    2202               if (j == cont2 + 1)
    2203                 {
    2204                   max = maximoExp(I,i);
    2205                   cambio[i] = max + 1;
    2206                   J = J,x(i)^(max + 1);
    2207                 }
    2208             }
    2209         }
    2210       list output;
    2211       output[1] = 0;
    2212       output[2] = J;
    2213       output[3] = cambio;
    2214       setring R;
    2215       list output = fetch (R1,output);
    2216       kill R1;
    2217       return(output);
    2218     }
     2100  {
     2101    J = I;
     2102    // Buscamos las que no estan
     2103    if (cont2 == 0)
     2104    {
     2105      for (i = 1 ; i <= nvar ; i ++)
     2106      {
     2107        max = maximoExp(I,i);
     2108        cambio[i] = max + 1;
     2109        J = J,var(i)^(max + 1);
     2110      }
     2111    }
     2112    else
     2113    {
     2114      for (i = 1 ; i <= nvar ; i++)
     2115      {
     2116        for (j = 1 ; j <= cont2 ; j ++)
     2117        {
     2118          if (i == variablesin[j])
     2119          {
     2120            cambio[i] = 0;
     2121            break;
     2122          }
     2123        }
     2124        if (j == cont2 + 1)
     2125        {
     2126          max = maximoExp(I,i);
     2127          cambio[i] = max + 1;
     2128          J = J,var(i)^(max + 1);
     2129        }
     2130      }
     2131    }
     2132    list output;
     2133    output[1] = 0;
     2134    output[2] = J;
     2135    output[3] = cambio;
     2136    return(output);
     2137  }
    22192138}
    22202139//////////////////////////////////////////////////////////////////////
     
    22272146{
    22282147  // New ring
    2229   def R = basering;
    2230   int nvar = nvars(R);
    2231    string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2232    execute(s);
    2233    ideal I = fetch(R,I);
     2148  int nvar = nvars(basering);
    22342149  // VARIABLES
    22352150  int i,j,k;
    22362151  // Cargamos la matriz con los exponentes
    2237   int sizI = size(I);
     2152  int sizI = ncols(I);
    22382153  intmat EXP[sizI][nvar];
    22392154  for (i = 1 ; i <= sizI ; i ++)
    2240     {
    2241       // Ordenamos el vector de exponentes oportuno
    2242       EXP[i,1..nvar] = leadexp(I[i]);
    2243     }
     2155  {
     2156    // Ordenamos el vector de exponentes oportuno
     2157    EXP[i,1..nvar] = leadexp(I[i]);
     2158  }
    22442159
    22452160  // Ahora tenemos que ordenarla segun la variable que este en conficto.
     
    22492164  int count = 0;
    22502165  for (i = 1 ; i <= nvar ; i ++)
    2251     {
    2252       // Buscamos conflicto en la variable x(i), para ello tengo que ordenar
    2253       // la columna i de EXP
    2254       vari = EXP[1..sizI,i];
    2255       aux = sort(vari);
    2256       vari = aux[1];
    2257       change = aux[2];
    2258       for (j = 1 ; j <= sizI - 1 ; j ++)
    2259         {
    2260           if (vari[j] > 0)
    2261             {
    2262               while (NEWEXP[change[j + count] , i] >= vari[j + 1 + count])
    2263                 {
    2264                   NEWEXP[change[j + 1 + count] , i] = NEWEXP[change[j + count] , i] + 1;
    2265                   count ++;
    2266                   if (j + 1 + count > sizI)
    2267                     {
    2268                       break;
    2269                     }
    2270                 }
    2271             }
    2272           j = j + count;
    2273           count = 0;
    2274         }
    2275     }
    2276   setring R;
    2277   I = fetch(R1,I);
     2166  {
     2167    // Buscamos conflicto en la variable x(i), para ello tengo que ordenar
     2168    // la columna i de EXP
     2169    vari = EXP[1..sizI,i];
     2170    aux = sort(vari);
     2171    vari = aux[1];
     2172    change = aux[2];
     2173    for (j = 1 ; j <= sizI - 1 ; j ++)
     2174    {
     2175      if (vari[j] > 0)
     2176      {
     2177        while (NEWEXP[change[j + count] , i] >= vari[j + 1 + count])
     2178        {
     2179          NEWEXP[change[j + 1 + count] , i] = NEWEXP[change[j + count] , i] + 1;
     2180          count ++;
     2181          if (j + 1 + count > sizI)
     2182          {
     2183            break;
     2184          }
     2185        }
     2186      }
     2187      j = j + count;
     2188      count = 0;
     2189    }
     2190  }
    22782191  // Devolvemos tambien la matriz, pues aqui tengo la biyeccion entre los exponentes
    22792192  if (EXP == NEWEXP)
    2280     {
    2281       return (1,I);
    2282     }
     2193  {
     2194    return (1,I);
     2195  }
    22832196  else
    2284     {
    2285       // Hallamos el ideal con los nuevos exponentes
    2286       intvec expI;
    2287       for (i = 1 ; i <= sizI ; i ++)
    2288         {
    2289           expI = NEWEXP[i,1..nvar];
    2290           I[i] = monomial(expI);
    2291         }
    2292       return(0,I,EXP,NEWEXP);
    2293     }
     2197  {
     2198    // Hallamos el ideal con los nuevos exponentes
     2199    intvec expI;
     2200    for (i = 1 ; i <= sizI ; i ++)
     2201    {
     2202      expI = NEWEXP[i,1..nvar];
     2203      I[i] = monomial(expI);
     2204    }
     2205    return(0,I,EXP,NEWEXP);
     2206  }
    22942207}
    22952208//////////////////////////////////////////////////////////////////////
     
    23012214static proc nonGeneric (EXP,NEWEXP,Faces,sizI)
    23022215{
    2303   def R = basering;
    2304   int nvar = nvars(R);
     2216  int nvar = nvars(basering);
    23052217  int sizFaces = size(Faces);
    23062218  // Variables
     
    23112223  newFaces = Faces;
    23122224  for (i = 1 ; i <= nvar ; i ++)
    2313     {
    2314       // comparamos las matrices de exponentes por columnas
    2315       exp = EXP[1..sizI,i];
    2316       newexp = NEWEXP[1..sizI,i];
    2317       if (exp <> newexp)
    2318         {
    2319           for (j = 1 ; j <= sizI ; j ++)
     2225  {
     2226    // comparamos las matrices de exponentes por columnas
     2227    exp = EXP[1..sizI,i];
     2228    newexp = NEWEXP[1..sizI,i];
     2229    if (exp <> newexp)
     2230    {
     2231      for (j = 1 ; j <= sizI ; j ++)
     2232      {
     2233        if (exp[j] <> newexp[j])
     2234        {
     2235          for (k = 1 ; k <= sizFaces ; k ++)
     2236          {
     2237            if (Faces[k][i] == newexp[j])
    23202238            {
    2321               if (exp[j] <> newexp[j])
    2322                 {
    2323                   for (k = 1 ; k <= sizFaces ; k ++)
    2324                     {
    2325                       if (Faces[k][i] == newexp[j])
    2326                         {
    2327                           newFaces[k][i] = exp[j];
    2328                         }
    2329                     }
    2330                 }
     2239              newFaces[k][i] = exp[j];
    23312240            }
    2332         }
    2333     }
     2241          }
     2242        }
     2243      }
     2244    }
     2245  }
    23342246  return (newFaces);
    23352247}
     
    23442256  // Cambiamos de anillo
    23452257  // Queremos usar x(1)..x(n) como variables.
    2346   def R = basering;
    2347   int nvar = nvars(R);
    2348   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2349   execute(s);
     2258  int nvar = nvars(basering);
    23502259  // Declaracion de variables.
    23512260  int i,sizJ,j,max,aux,sizK,l, elim;
    23522261  intvec v;
    23532262  list face;
    2354   // Traemos al nuevo anillo el ideal de entrada.
    2355   ideal I = fetch(R,I);
    23562263  // Hacemos una copia de I pues ahora modificaremos el sistema
    23572264  // de generadores.
    23582265  ideal J = I;
    2359   sizJ = size(J);
     2266  sizJ = ncols(J);
    23602267  // Para cada variable buscamos el maximo exponente, teniendo en
    23612268  // cuenta que un mismo generador no puede dar dos exponentes.
     
    23632270  intvec expIni;
    23642271  for (i = 1 ; i <= nvar ; i++)
    2365     {
    2366       max = 0;
     2272  {
     2273    max = 0;
     2274    for (j = 1 ; j <= sizJ ; j++)
     2275    {
     2276      aux = leadexp(J[j])[i];
     2277      if (aux > max)
     2278      {
     2279        max = aux;
     2280        elim = j;
     2281      }
     2282    }
     2283    // Guardamos el exponente
     2284    expIni[i] = max;
     2285    // Ahora tenemos el maximo de la variable x(i), por lo que
     2286    // eliminamos el generador en el que la encontramos.
     2287    // Si queda un generador no hay nada que hacer
     2288    if (sizJ <> 1)
     2289    {
     2290      if (elim <> 1 & elim <> sizJ)
     2291      {
     2292        J = J[1..elim-1],J[elim+1..sizJ];
     2293      }
     2294      else
     2295      {
     2296        if (elim == 1)
     2297        {
     2298          J = J[2..sizJ];
     2299        }
     2300        else
     2301        {
     2302          J = J[1..sizJ-1];
     2303        }
     2304      }
     2305      sizJ = ncols(J);
     2306      // Eliminamos la variable x(i) en todos los generadores.
    23672307      for (j = 1 ; j <= sizJ ; j++)
    2368         {
    2369           aux = leadexp(J[j])[i];
    2370           if (aux > max)
    2371             {
    2372               max = aux;
    2373               elim = j;
    2374             }
    2375         }
    2376       // Guardamos el exponente
    2377       expIni[i] = max;
    2378       // Ahora tenemos el maximo de la variable x(i), por lo que
    2379       // eliminamos el generador en el que la encontramos.
    2380       // Si queda un generador no hay nada que hacer
    2381       if (sizJ <> 1)
    2382         {
    2383           if (elim <> 1 & elim <> sizJ)
    2384             {
    2385               J = J[1..elim-1],J[elim+1..sizJ];
    2386             }
    2387           else
    2388             {
    2389               if (elim == 1)
    2390                 {
    2391                   J = J[2..sizJ];
    2392                 }
    2393               else
    2394                 {
    2395                   J = J[1..sizJ-1];
    2396                 }
    2397             }
    2398           sizJ = size(J);
    2399           // Eliminamos la variable x(i) en todos los generadores.
    2400           for (j = 1 ; j <= sizJ ; j++)
    2401             {
    2402               v = leadexp(J[j]);
    2403               if (v [i] <> 0)
    2404                 {
    2405                   v[i] = 0;
    2406                   J[j] = monomial(v);
    2407                 }
    2408             }
    2409           // Hallamos el sistema minimal de generadores que
    2410           // corresponde al ideal que nos ha quedado.
    2411           J = minbase(J);
    2412           sizJ = size(J);
    2413         }
    2414     }
     2308      {
     2309        v = leadexp(J[j]);
     2310        if (v [i] <> 0)
     2311        {
     2312          v[i] = 0;
     2313          J[j] = monomial(v);
     2314        }
     2315      }
     2316      // Hallamos el sistema minimal de generadores que
     2317      // corresponde al ideal que nos ha quedado.
     2318      J = minbase(J);
     2319      sizJ = ncols(J);
     2320    }
     2321  }
    24152322  // En expIni tenemos los exponentes de los monomios que dan la cara
    24162323  // inicial, ahora hay que buscar en el ideal original a que
    24172324  // generador se corresponde (el ideal es generico)
    2418   int sizI = size(I);
     2325  int sizI = ncols(I);
    24192326  for (i = 1 ; i <= nvar ; i ++)
    2420     {
    2421       for (j = 1 ; j <= sizI ; j ++)
    2422         {
    2423           if (expIni[i] == leadexp(I[j])[i])
    2424             {
    2425               face = insert(face, I[j]);
    2426               // Si lo encontramos buscamos el siguiente
    2427               break;
    2428             }
    2429         }
    2430     }
    2431   setring R;
    2432   list face = fetch (R1,face);
    2433   kill R1;
     2327  {
     2328    for (j = 1 ; j <= sizI ; j ++)
     2329    {
     2330      if (expIni[i] == leadexp(I[j])[i])
     2331      {
     2332        face = insert(face, I[j]);
     2333        // Si lo encontramos buscamos el siguiente
     2334        break;
     2335      }
     2336    }
     2337  }
    24342338  return (face);
    24352339}
     
    24432347  // Cambiamos de anillo
    24442348  // Queremos usar x(1)..x(n) como variables.
    2445   def R = basering;
    2446   int nvar = nvars(R);
    2447   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2448   execute(s);
     2349  int nvar = nvars(basering);
    24492350  // Declaracion de variables.
    24502351  int i,j,cambio,sizI,k,min,m,generador,max;
     
    24522353  poly LCM,newLCM;
    24532354  intvec v,newv,expgen;
    2454   // Traemos al nuevo anillo las dos entradas.
    2455   list l1 = fetch(R,l1);
    2456   ideal I = fetch(R,I);
    2457   sizI = size(I);
     2355  sizI = ncols(I);
    24582356  // Hallamos el lcm de los elementos, e. d., la faceta del
    24592357  // complejo para luego comparar con los nuevos
    24602358  LCM = 1;
    24612359  for (i = 1 ; i <= nvar ; i++)
    2462     {
    2463       LCM = lcmMon(LCM,l1[i]);
    2464     }
     2360  {
     2361    LCM = lcmMon(LCM,l1[i]);
     2362  }
    24652363  v = leadexp(LCM);
    24662364  // Calculo los exponentes de los monomios de I
    24672365  for (i = 1 ; i <= sizI ; i++)
    2468     {
    2469       expI[i] = leadexp(I[i]);
    2470     }
     2366  {
     2367    expI[i] = leadexp(I[i]);
     2368  }
    24712369  // Hay que quitar cada elemento de la lista y comprobar si hay o no
    24722370  // cara adyacente al simplice que queda, y en caso de haberla, la
    24732371  // calculamos.
    24742372  for (i = 1 ; i <= nvar ; i++)
    2475     {
    2476       newl1 = delete(l1,i);
    2477       // Hallamos el lcm de los elementos que hay en la nueva lista.
    2478       newLCM = 1;
    2479       for (j = 1 ; j <= nvar - 1 ; j++)
    2480         {
    2481           newLCM = lcmMon(newLCM,newl1[j]);
    2482         }
    2483       // Ahora hay que detectar si alguna variable ha desaparecido
    2484       // en este LCM.
    2485       newv = leadexp(newLCM);
    2486       for (j = 1 ; j <= nvar ; j++)
    2487         {
    2488           if (newv[j] == 0)
    2489             {
    2490               l2[i] = 0;
    2491               break;
    2492             }
    2493         }
    2494       if (j == nvar+1)
    2495         {
     2373  {
     2374    newl1 = delete(l1,i);
     2375    // Hallamos el lcm de los elementos que hay en la nueva lista.
     2376    newLCM = 1;
     2377    for (j = 1 ; j <= nvar - 1 ; j++)
     2378    {
     2379      newLCM = lcmMon(newLCM,newl1[j]);
     2380    }
     2381    // Ahora hay que detectar si alguna variable ha desaparecido
     2382    // en este LCM.
     2383    newv = leadexp(newLCM);
     2384    for (j = 1 ; j <= nvar ; j++)
     2385    {
     2386      if (newv[j] == 0)
     2387      {
     2388        l2[i] = 0;
     2389        break;
     2390      }
     2391    }
     2392    if (j == nvar+1)
     2393    {
    24962394      // Si no ha habido ceros, queremos hallar la cara adyacente,
    24972395      // es decir, buscar un generador que introducido en l1 de una
     
    24992397      // Comparamos los lcm entre s?, para comprobar en que variable
    25002398      // contribu?a el monomio que hemos eliminado.
    2501           for (j = 1 ; j <= nvar ; j++)
     2399      for (j = 1 ; j <= nvar ; j++)
     2400      {
     2401        if (v[j] <> newv[j])
     2402        {
     2403          cambio = j;
     2404          // Una vez encontrado no hay mas
     2405          break;
     2406        }
     2407      }
     2408      // Hallamos los exponentes de los monomios que quedan
     2409      // para ver cual da el exponente en "newv"
     2410      for (j = 1 ; j <= nvar - 1 ; j++)
     2411      {
     2412        w[j] = leadexp(newl1[j]);
     2413      }
     2414      for (j = 1 ; j <= nvar ; j++)
     2415      {
     2416        for (k = 1 ; k <= nvar - 1 ; k++)
     2417        {
     2418          if (newv[cambio] == w[k][cambio])
     2419          {
     2420            cambio = k;
     2421            break;
     2422          }
     2423        }
     2424        // Si no termino el for con k es que hemos encontrado ya
     2425        // los que son iguales.
     2426        if (k <> nvar)
     2427        {
     2428          break;
     2429        }
     2430      }
     2431
     2432      // Donde contribuye antes, e.d., en "v"
     2433      for (j = 1 ; j <= nvar ; j++)
     2434      {
     2435        if (w[cambio][j] == v[j])
     2436        {
     2437          cambio = j;
     2438          break;
     2439        }
     2440      }
     2441      // Ahora ya buscamos entre los generadores el nuevo monomio.
     2442      // Ponemos de tope para encontrar el minimo el maximo de
     2443      // las variables en el ideal
     2444      max = 0;
     2445      for (m = 1 ; m <= sizI ; m ++)
     2446      {
     2447        if (expI[m][cambio] > max)
     2448        {
     2449          max = expI[m][cambio];
     2450        }
     2451      }
     2452      min = max;
     2453      for (j = 1 ; j <= sizI ; j++)
     2454      {
     2455        for (k = 1 ; k <= nvar ; k ++)
     2456        {
     2457          if (I[j] == l1[k])
     2458          {
     2459            break;
     2460          }
     2461        }
     2462        // El generador no esta en la lista, es de los que hay que
     2463        // comprobar
     2464        if (k == nvar +1)
     2465        {
     2466          for (m = 1 ; m <= nvar ; m++)
     2467          {
     2468            if (m <> cambio)
    25022469            {
    2503               if (v[j] <> newv[j])
    2504                 {
    2505                   cambio = j;
    2506                   // Una vez encontrado no hay mas
    2507                   break;
    2508                 }
     2470              if (expI[j][m] > newv[m])
     2471              {
     2472                break;
     2473              }
    25092474            }
    2510           // Hallamos los exponentes de los monomios que quedan
    2511           // para ver cual da el exponente en "newv"
    2512           for (j = 1 ; j <= nvar - 1 ; j++)
     2475            else
    25132476            {
    2514               w[j] = leadexp(newl1[j]);
     2477              if (expI[j][m] <= newv[m])
     2478              {
     2479                break;
     2480              }
    25152481            }
    2516           for (j = 1 ; j <= nvar ; j++)
     2482          }
     2483          // Si termina el bucle cumple las condiciones
     2484          // oportunas, solo hay que comparar con el
     2485          // otro que tengamos.
     2486          if (m == nvar + 1)
     2487          {
     2488            if (expI[j][cambio] <=  min)
    25172489            {
    2518               for (k = 1 ; k <= nvar - 1 ; k++)
    2519                 {
    2520                   if (newv[cambio] == w[k][cambio])
    2521                   {
    2522                     cambio = k;
    2523                     break;
    2524                   }
    2525                 }
    2526               // Si no termino el for con k es que hemos encontrado ya
    2527               // los que son iguales.
    2528               if (k <> nvar)
    2529                 {
    2530                   break;
    2531                 }
     2490              min = expI[j][cambio];
     2491              generador = j;
    25322492            }
    2533        
    2534           // Donde contribuye antes, e.d., en "v"
    2535           for (j = 1 ; j <= nvar ; j++)
    2536             {
    2537               if (w[cambio][j] == v[j])
    2538                 {
    2539                   cambio = j;
    2540                   break;
    2541                 }
    2542             }
    2543           // Ahora ya buscamos entre los generadores el nuevo monomio.
    2544           // Ponemos de tope para encontrar el minimo el maximo de
    2545           // las variables en el ideal
    2546           max = 0;
    2547           for (m = 1 ; m <= sizI ; m ++)
    2548             {
    2549               if (expI[m][cambio] > max)
    2550                 {
    2551                   max = expI[m][cambio];
    2552                 }
    2553             }
    2554           min = max;       
    2555           for (j = 1 ; j <= sizI ; j++)
    2556             {
    2557               for (k = 1 ; k <= nvar ; k ++)
    2558                 {
    2559                   if (I[j] == l1[k])
    2560                     {
    2561                       break;
    2562                     }
    2563                 }
    2564               // El generador no esta en la lista, es de los que hay que
    2565               // comprobar
    2566               if (k == nvar +1)
    2567                 {
    2568                   for (m = 1 ; m <= nvar ; m++)
    2569                     {
    2570                       if (m <> cambio)
    2571                         {
    2572                           if (expI[j][m] > newv[m])
    2573                             {
    2574                               break;
    2575                             }
    2576                         }
    2577                       else
    2578                         {
    2579                           if (expI[j][m] <= newv[m])
    2580                             {
    2581                               break;
    2582                             }
    2583                         }
    2584                     }
    2585                   // Si termina el bucle cumple las condiciones
    2586                   // oportunas, solo hay que comparar con el
    2587                   // otro que tengamos.
    2588                   if (m == nvar + 1)
    2589                     {
    2590                       if (expI[j][cambio] <=  min)
    2591                         {
    2592                           min = expI[j][cambio];
    2593                           generador = j;
    2594                         }
    2595                     }
    2596                 }
    2597             }
    2598           // En la lista ponemos en el lugar "i" el generador que
    2599           // hay que introducir cuando eliminamos el generador
    2600           // "i" de la lista de entrada.
    2601           l2[i] = I[generador];
    2602         }
    2603     }
    2604   setring R;
    2605   list l2 = fetch(R1,l2);
    2606   kill R1;
     2493          }
     2494        }
     2495      }
     2496      // En la lista ponemos en el lugar "i" el generador que
     2497      // hay que introducir cuando eliminamos el generador
     2498      // "i" de la lista de entrada.
     2499      l2[i] = I[generador];
     2500    }
     2501  }
    26072502  return(l2);
    26082503}
     
    26162511  // Cambiamos de anillo
    26172512  // Queremos usar x(1)..x(n) como variables.
    2618   def R = basering;
    2619   int nvar = nvars(R);
     2513  int nvar = nvars(basering);
    26202514  // Sabemos que dp siempre es mejor para trabajar, auqque luego para
    26212515  // comparar I y genI vamos a cambiarlo al lexicografico.
    2622   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2623   execute(s);
    26242516  // Variables
    26252517  int i,j,k,sizl1,sizl,cont1,cont2;
     
    26292521  intvec v,w,betas;
    26302522  ideal J,genI,artgenI;
    2631   ideal I = fetch(R,I);
    26322523  // Comprobamos si el ideal es generico y artiniano, y, en caso de
    26332524  // no serlo, obtenemos una modificacion de este ideal que si
     
    26352526  list genericlist = generic(I);
    26362527  if (genericlist[1] == 0)
    2637     {
    2638       genI = genericlist[2];
    2639     }
     2528  {
     2529    genI = genericlist[2];
     2530  }
    26402531  else
    2641     {
    2642       genI = I;
    2643     }
     2532  {
     2533    genI = I;
     2534  }
    26442535  list artinianization = artinian (genI);
    26452536  if (artinianization[1] == 0)
    2646     {
    2647       artgenI = artinianization[2];
    2648     }
     2537  {
     2538    artgenI = artinianization[2];
     2539  }
    26492540  else
    2650     {
    2651       artgenI = genI;
    2652     }
     2541  {
     2542    artgenI = genI;
     2543  }
    26532544  // Una vez tenemos el ideal artiniano y generico, podemos hallar
    26542545  // el complejo de Scarf asociado al ideal modificado
     
    26632554  LCM = 1;
    26642555  for (i = 1 ; i <= nvar ; i++)
    2665     {
    2666       mon = initial[i];
    2667       LCM = lcmMon(LCM,mon);
    2668     }
     2556  {
     2557    mon = initial[i];
     2558    LCM = lcmMon(LCM,mon);
     2559  }
    26692560  v = leadexp(LCM);
    26702561  // Guardamos la primera faceta
     
    26772568  // Ahora hayamos las posibles caras maximales adyacentes
    26782569  while (sizl <> 0)
    2679     {
    2680       // Hallamos la lista de monomios que hay que introducir
    2681       // cuando eliminamos cada monomio.
    2682       auxl = adyacency(l[1],artgenI);
    2683       cont1 = 1;
    2684       cont2 = 0;
    2685       l1 = 0;
     2570  {
     2571    // Hallamos la lista de monomios que hay que introducir
     2572    // cuando eliminamos cada monomio.
     2573    auxl = adyacency(l[1],artgenI);
     2574    cont1 = 1;
     2575    cont2 = 0;
     2576    l1 = 0;
     2577    for (j = 1 ; j <= nvar ; j++)
     2578    {
     2579      if (auxl[j] <> 0)
     2580      {
     2581        l2 = delete(l[1],j);
     2582        l1[cont1] = insert(l2,auxl[j],cont1 + cont2 - 1);
     2583        cont1 ++;
     2584      }
     2585      else
     2586      {
     2587        cont2 ++;
     2588      }
     2589    }
     2590    // Hallamos los nuevos LCM
     2591    sizl1 = size(l1);
     2592    for (i = 1 ; i <= sizl1 ; i++)
     2593    {
     2594      newLCM[i] = 1;
    26862595      for (j = 1 ; j <= nvar ; j++)
    26872596      {
    2688         if (auxl[j] <> 0)
    2689           {
    2690             l2 = delete(l[1],j);
    2691             l1[cont1] = insert(l2,auxl[j],cont1 + cont2 - 1);
    2692             cont1 ++;
    2693           }
    2694         else
    2695           {
    2696             cont2 ++;
    2697           }
    2698       }
    2699       // Hallamos los nuevos LCM
    2700       sizl1 = size(l1);
    2701       for (i = 1 ; i <= sizl1 ; i++)
    2702         {
    2703           newLCM[i] = 1;
    2704          for (j = 1 ; j <= nvar ; j++)
    2705            {
    2706              newLCM[i] = lcmMon(newLCM[i],l1[i][j]);
    2707            }
    2708          expl1[i] = leadexp(newLCM[i]);
    2709         }
    2710       // Hallamos los LCM de las nuevas caras y eliminamos las que
    2711       // ya esten en la lista Faces
    2712       cont1 = 0;
    2713       cont2 = 0;
    2714       for (i = 1 ; i <= sizl1 ; i++)
    2715         {
    2716           for (j = 1 ; j <= sizfaces ; j++)
    2717             {
    2718               v = expl1[i];
    2719               w = Faces[j];
    2720               if (v == w)
    2721                 {
    2722                   // Si ya esta el LCM en la lista, no queremos
    2723                   // seguir buscando
    2724                   break;
    2725                 }
    2726             }
    2727           // Si no ha salido del bucle en "j" es que este LCM
    2728           // no esta en la lista de las caras, la introducimos
    2729           if (j == sizfaces + 1)
    2730             {
    2731               Faces = insert(Faces,expl1[i],sizfaces + cont1);
    2732               l = insert(l,l1[i]);
    2733               cont1 ++;
    2734             }
    2735         }
    2736       l = delete(l,cont1 + 1);
    2737       sizl = size(l);
    2738       sizfaces = size(Faces);
    2739     }
     2597        newLCM[i] = lcmMon(newLCM[i],l1[i][j]);
     2598      }
     2599      expl1[i] = leadexp(newLCM[i]);
     2600    }
     2601    // Hallamos los LCM de las nuevas caras y eliminamos las que
     2602    // ya esten en la lista Faces
     2603    cont1 = 0;
     2604    cont2 = 0;
     2605    for (i = 1 ; i <= sizl1 ; i++)
     2606    {
     2607      for (j = 1 ; j <= sizfaces ; j++)
     2608      {
     2609        v = expl1[i];
     2610        w = Faces[j];
     2611        if (v == w)
     2612        {
     2613          // Si ya esta el LCM en la lista, no queremos
     2614          // seguir buscando
     2615          break;
     2616        }
     2617      }
     2618      // Si no ha salido del bucle en "j" es que este LCM
     2619      // no esta en la lista de las caras, la introducimos
     2620      if (j == sizfaces + 1)
     2621      {
     2622        Faces = insert(Faces,expl1[i],sizfaces + cont1);
     2623        l = insert(l,l1[i]);
     2624        cont1 ++;
     2625      }
     2626    }
     2627    l = delete(l,cont1 + 1);
     2628    sizl = size(l);
     2629    sizfaces = size(Faces);
     2630  }
    27402631  // En "Faces" ya tengo los exponentes que luego seran los exponentes
    27412632  // de los ideales que forman la descomposicion.
     
    27432634  intvec elimin = artinianization[3];
    27442635  if (artinianization[1] == 0)
    2745    {
    2746      // En elimina tenemos las variables que hemos introducido
    2747      // y cual es la potencia
    2748      // Solo miro las que tengan cambio
    2749      for (i = 1 ; i <= nvar ; i ++)
    2750        {
    2751          if (elimin[i] <> 0)
    2752            {
    2753              for (j = 1 ; j <= sizfaces ; j ++)
    2754                {
    2755                  if (Faces[j][i] == elimin[i])
    2756                    {
    2757                      Faces[j][i] = 0;
    2758                    }
    2759                }
    2760            }
    2761        }
    2762    }
     2636  {
     2637    // En elimina tenemos las variables que hemos introducido
     2638    // y cual es la potencia
     2639    // Solo miro las que tengan cambio
     2640    for (i = 1 ; i <= nvar ; i ++)
     2641    {
     2642      if (elimin[i] <> 0)
     2643      {
     2644        for (j = 1 ; j <= sizfaces ; j ++)
     2645        {
     2646          if (Faces[j][i] == elimin[i])
     2647          {
     2648            Faces[j][i] = 0;
     2649          }
     2650        }
     2651      }
     2652    }
     2653  }
    27632654  // Generico
    27642655  sizI = size(I);
    27652656  if (genericlist[1] == 0)
    2766     {
    2767       Faces = nonGeneric(genericlist[3],genericlist[4],Faces,sizI);
    2768     }
     2657  {
     2658    Faces = nonGeneric(genericlist[3],genericlist[4],Faces,sizI);
     2659  }
    27692660  // Ya tenemos en Faces los exponentes de las componentes
    27702661  // ahora solo hay que obtener los ideales.
    2771  for (i = 1 ; i <= sizfaces ; i ++)
    2772     {
    2773       J = 0;
    2774       for (j = 1 ; j <= nvar ; j ++)
    2775         {
    2776           if (Faces[i][j] <> 0)
    2777             {
    2778               J = J,x(j)^(Faces[i][j]);
    2779             }
    2780         }
    2781       J = simplify(J,2);
    2782       Faces[i] = J;
    2783     }
    2784  // Esta es la parte LENTA computacionalmente si el ideal de partida
    2785  // no es generico
    2786  if (genericlist[1] == 0)
    2787    {
    2788      Faces = irredundant(Faces);
    2789    }
    2790  setring R;
    2791  list components = fetch(R1,Faces);
    2792  kill R1;
    2793  return(components);
     2662  for (i = 1 ; i <= sizfaces ; i ++)
     2663  {
     2664    J = 0;
     2665    for (j = 1 ; j <= nvar ; j ++)
     2666    {
     2667      if (Faces[i][j] <> 0)
     2668      {
     2669        J = J,var(j)^(Faces[i][j]);
     2670      }
     2671    }
     2672    J = simplify(J,2);
     2673    Faces[i] = J;
     2674  }
     2675  // Esta es la parte LENTA computacionalmente si el ideal de partida
     2676  // no es generico
     2677  if (genericlist[1] == 0)
     2678  {
     2679    Faces = irredundant(Faces);
     2680  }
     2681  return(Faces);
    27942682}
    27952683//////////////////////////////////////////////////////////////////////
     
    28212709{
    28222710  // Cambiamos de anillo
    2823   def R = basering;
    2824   int nvar = nvars(R);
    2825   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2826   execute(s);
     2711  int nvar = nvars(basering);
    28272712  // Variables
    28282713  int sizF,i,j;
     
    28302715  list listphi;
    28312716  intvec exp,newexp;
    2832   list F = fetch(R,F);
    28332717  // F es una lista de pares, que indica una x(i) etiqueta de una
    28342718  // cara del ideal. Suponemos que F tiene ordenados sus elementos
     
    28362720  sizF = size(F);
    28372721  for (i = 1 ; i <= sizF ; i ++)
    2838     {
    2839       f = F[i];
    2840       exp = leadexp(f);
    2841       for (j = 1 ; j <= nvar ; j ++)
    2842         {
    2843           if (j <> i)
    2844             {
    2845               exp[j] = exp[j] + 1;
    2846             }
    2847         }
    2848       listphi[i] = monomial(exp);
    2849     }
     2722  {
     2723    f = F[i];
     2724    exp = leadexp(f);
     2725    for (j = 1 ; j <= nvar ; j ++)
     2726    {
     2727      if (j <> i)
     2728      {
     2729        exp[j] = exp[j] + 1;
     2730      }
     2731    }
     2732    listphi[i] = monomial(exp);
     2733  }
    28502734  // Ya tenemos la lista de los monomios a los que
    28512735  // luego haremos el "lcm"
    2852   setring R;
    2853   list listphi = fetch (R1,listphi);
    2854   kill R1;
    28552736  return (listphi);
    28562737}
     
    28602741{
    28612742 // Cambiamos de anillo
    2862   def R = basering;
    2863   int nvar = nvars(R);
    2864   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    2865   execute(s);
     2743  int nvar = nvars(basering);
    28662744  int i,sizI;
    28672745  intvec exp;
    2868   poly f = fetch (R,f);
    28692746  exp = leadexp(f);
    2870   for (i = 1 ; i <= nvar  ; i ++)
    2871     {
    2872       if (exp[i] <> 0)
    2873         {
    2874           exp[i] = exp[i] - 1;
    2875         }
    2876     }
     2747  for (i = nvar ; i > 0  ; i --)
     2748  {
     2749    if (exp[i] <> 0)
     2750    {
     2751      exp[i] = exp[i] - 1;
     2752    }
     2753  }
    28772754  f = monomial(exp);
    2878   setring R;
    2879   f = fetch (R1,f);
    2880   kill R1;
    28812755  return (f);
    28822756}
     
    28852759static proc conditionComplex (intvec posActual,ideal I,ideal S)
    28862760{
    2887   def R = basering;
    2888   int nvar = nvars(R);
     2761  int nvar = nvars(basering);
    28892762  // VARIABLES
    28902763  int i,nuevo;
     
    28932766  // ultimo dentro de posActual que es distinto de 0.
    28942767  for (i = 1 ; i <= nvar ; i ++)
    2895     {
    2896       if (posActual[i] == 0)
    2897         {
    2898           break ;
    2899         }
    2900     }
     2768  {
     2769    if (posActual[i] == 0)
     2770    {
     2771      break;
     2772    }
     2773  }
    29012774  nuevo = i - 1;
    29022775  // No se pueden repetir generadores, se mira que el ultimo que se ha
    2903  // ha introducido no sea de los que ya tenemos
     2776  // ha introducido no sea de los que ya tenemos
    29042777  for (i = 1 ; i <= nuevo - 1 ; i ++)
    2905     {
    2906       if (posActual[i] == posActual[nuevo])
    2907         {
    2908           return (0);
    2909         }
    2910     }
     2778  {
     2779    if (posActual[i] == posActual[nuevo])
     2780    {
     2781      return (0);
     2782    }
     2783  }
    29112784  // Vemos si la variable oportuna divide al generador
    29122785  if (leadexp(I[i]) == 0)
    2913     {
    2914       return (0);
    2915     }
     2786  {
     2787    return (0);
     2788  }
    29162789  // Caso de que el LCM sea multiplo de los que ya tenemos
    29172790  poly LCM = 1;
    29182791  for (i = 1 ; i <= nuevo ; i ++)
    2919     {
    2920       F = insert (F,I[posActual[i]],size(F));
    2921     }
     2792  {
     2793    F = insert (F,I[posActual[i]],size(F));
     2794  }
    29222795  list phiF = phi(F);
    29232796  for (i = 1 ; i <= nuevo ; i ++)
    2924     {
    2925       LCM = lcmMon(phiF[i],LCM);
    2926     }
     2797  {
     2798    LCM = lcmMon(phiF[i],LCM);
     2799  }
    29272800  // Comprobamos si ya tenemos algun divisor del actual
    29282801  if (membershipMon(LCM,S) == 1)
    2929     {
    2930       return (0);
    2931     }
     2802  {
     2803    return (0);
     2804  }
    29322805  // Ahora vemos si la lista esta en el complejo simplicial
    29332806  if (membershipMon(LCM,I) == 1)
    2934     {
    2935       if (membershipMon(pi(LCM),I) == 0)
    2936         {
    2937           return (1,LCM);
    2938         }
    2939     }
     2807  {
     2808    if (membershipMon(pi(LCM),I) == 0)
     2809    {
     2810      return (1,LCM);
     2811    }
     2812  }
    29402813  return (0);
    29412814}
     
    29442817static proc findFaces (ideal I)
    29452818{
    2946   def R = basering;
    2947   int nvar = nvars(R);
     2819  int nvar = nvars(basering);
    29482820  // Variables
    29492821  int i;
     
    29562828
    29572829  int variable = 1;
    2958   int sizI = size(I);
     2830  int sizI = ncols(I);
    29592831  while (1)
    2960     {
    2961       while (posActual[variable] == sizI)
    2962         {
    2963           posActual[variable] = 0;
    2964           variable --;
    2965           if (variable == 0)
    2966             {
    2967               break;
    2968             }
    2969         }
    2970       // Comprobamos si hemos recorrido todas las posibilidades. Si
    2971       // es as?, terminamos el while
     2832  {
     2833    while (posActual[variable] == sizI)
     2834    {
     2835      posActual[variable] = 0;
     2836      variable --;
    29722837      if (variable == 0)
    2973         {
    2974           break;
    2975         }
    2976       posActual[variable] = posActual[variable] + 1;
    2977       // Comprobamos las condiciones para saber si los generadores que
    2978       // tenemos est?n o no en el complejo.
    2979       condiciones = conditionComplex (posActual,I,S);
     2838      {
     2839        break;
     2840      }
     2841    }
     2842    // Comprobamos si hemos recorrido todas las posibilidades. Si
     2843    // es as?, terminamos el while
     2844    if (variable == 0)
     2845    {
     2846      break;
     2847    }
     2848    posActual[variable] = posActual[variable] + 1;
     2849    // Comprobamos las condiciones para saber si los generadores que
     2850    // tenemos est?n o no en el complejo.
     2851    condiciones = conditionComplex (posActual,I,S);
    29802852
    2981       if (condiciones[1] == 1 )
    2982         {
    2983           if (posActual[nvar] <> 0)
    2984             {
    2985               S = S,condiciones[2];
    2986               F = insert (F,condiciones[2]);
    2987             }
    2988           if (variable < nvar)
    2989             {
    2990               variable ++;
    2991             }
    2992         }
    2993     }
     2853    if (condiciones[1] == 1 )
     2854    {
     2855      if (posActual[nvar] <> 0)
     2856      {
     2857        S = S,condiciones[2];
     2858        F = insert (F,condiciones[2]);
     2859      }
     2860      if (variable < nvar)
     2861      {
     2862        variable ++;
     2863      }
     2864    }
     2865  }
    29942866  return (F);
    29952867}
     
    30022874static proc labelAlgorithm(ideal I)
    30032875{
    3004   def R = basering;
    3005   int nvar = nvars(R);
    3006   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    3007   execute(s);
    3008   ideal I = fetch(R,I);
     2876  int nvar = nvars(basering);
    30092877
    30102878  // Variables
     
    30162884  list artiniano = artinian (I);
    30172885  if (artiniano[1] == 0)
    3018     {
    3019       artI = artiniano[2];
    3020       intvec elimina = artiniano[3];
    3021     }
     2886  {
     2887    artI = artiniano[2];
     2888    intvec elimina = artiniano[3];
     2889  }
    30222890  else
    3023     {
    3024       artI = I;
    3025     }
     2891  {
     2892    artI = I;
     2893  }
    30262894  // Llamamos a findFaces para que encuentre las caras maximales del
    30272895  // complejo asociado al ideal
     
    30312899  poly f;
    30322900  for (i = 1 ; i <= sizComponents ; i ++)
    3033     {
    3034       f = components[i];
    3035       expComponents[i] = leadexp(f);
    3036     }
     2901  {
     2902    f = components[i];
     2903    expComponents[i] = leadexp(f);
     2904  }
    30372905  // Deshacemos la artinianizacion
    30382906  if (artiniano[1] == 0)
    3039    {
    3040      // En elimina tenemos las variables que hemos introducido
    3041      // y cual es la potencia
    3042      // Solo miro las que tengan cambio
    3043      for (i = 1 ; i <= nvar ; i ++)
    3044        {
    3045          if (elimina[i] <> 0)
    3046            {
    3047              for (j = 1 ; j <= sizComponents ; j ++)
    3048                {
    3049                  if (expComponents[j][i] == elimina[i])
    3050                    {
    3051                      expComponents[j][i] = 0;
    3052                    }
    3053                }
    3054            }
    3055        }
    3056    }
     2907  {
     2908    // En elimina tenemos las variables que hemos introducido
     2909    // y cual es la potencia
     2910    // Solo miro las que tengan cambio
     2911    for (i = 1 ; i <= nvar ; i ++)
     2912    {
     2913      if (elimina[i] <> 0)
     2914      {
     2915        for (j = 1 ; j <= sizComponents ; j ++)
     2916        {
     2917          if (expComponents[j][i] == elimina[i])
     2918          {
     2919            expComponents[j][i] = 0;
     2920          }
     2921        }
     2922      }
     2923    }
     2924  }
    30572925  // En exp(i) tengo los exponentes de cada variable de las que aparecen
    30582926  // en cada ideal.
     
    30602928  list facets;
    30612929  for (i = 1 ; i <= sizComponents ; i ++)
    3062     {
    3063       J = 0;
    3064       for (j = 1 ; j <= nvar ; j ++)
    3065         {
    3066           if (expComponents[i][j] <> 0)
    3067             {
    3068               J = J,x(j)^expComponents[i][j];
    3069             }
    3070         }
    3071       J = simplify(J,2);
    3072       facets[i] = J;
    3073     }
    3074   setring R;
    3075   list facets = fetch (R1,facets);
    3076   kill R1;
     2930  {
     2931    J = 0;
     2932    for (j = 1 ; j <= nvar ; j ++)
     2933    {
     2934      if (expComponents[i][j] <> 0)
     2935      {
     2936        J = J,var(j)^expComponents[i][j];
     2937      }
     2938    }
     2939    J = simplify(J,2);
     2940    facets[i] = J;
     2941  }
    30772942  return (facets);
    30782943}
     
    31002965static proc divide (intvec v, intvec w, int k)
    31012966{
    3102   def R = basering;
    3103   int nvar = nvars(R);
     2967  int nvar = nvars(basering);
    31042968  // Variables
    31052969  int i;
    3106   for (i = 1 ; i <= nvar ; i ++)
    3107     {
    3108       if (i == k)
    3109         {
    3110           if (v[i] <> w[i])
    3111             {
    3112               return (0);
    3113             }
    3114         }
    3115       else
    3116         {
    3117           if (v[i] >= w[i])
    3118             {
    3119               return (0);
    3120             }
    3121         }
    3122     }
     2970  for (i = nvar ; i > 0 ; i --)
     2971  {
     2972    if (i == k)
     2973    {
     2974      if (v[i] <> w[i])
     2975      {
     2976        return (0);
     2977      }
     2978    }
     2979    else
     2980    {
     2981      if (v[i] >= w[i])
     2982      {
     2983        return (0);
     2984      }
     2985    }
     2986  }
    31232987  return (1);
    31242988}
     
    31292993static proc incrementalAlg (ideal I)
    31302994{
    3131   def R = basering;
    3132   int nvar = nvars(R);
    3133   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    3134   execute(s);
    3135   ideal I = fetch(R,I);
     2995  int nvar = nvars(basering);
    31362996  // COMPROBACIONES
    31372997  // Variables
     
    31433003  ideal artI;
    31443004  if (artiniano[1] == 0)
    3145     {
    3146       artI = artiniano[2];
    3147       elimina = artiniano[3];
    3148     }
     3005  {
     3006    artI = artiniano[2];
     3007    elimina = artiniano[3];
     3008  }
    31493009  else
    3150     {
    3151       artI = I;
    3152       elimina[nvar] = 0;
    3153     }
     3010  {
     3011    artI = I;
     3012    elimina[nvar] = 0;
     3013  }
    31543014  // Buscamos la primera componente irreducible o, lo que es lo
    31553015  // mismo, aquellos generadores que son potencia de una variable.
     
    31583018  // ideal.
    31593019  list MinI,componentes;
    3160   int sizartI = size(artI);
     3020  int sizartI = ncols(artI);
    31613021  int sizelimina = size(elimina);
    31623022  for (i = 1 ; i <= nvar ; i ++)
    3163     {
    3164       if (elimina[i] == 0)
    3165         {
    3166           // Buscamos en el ideal los generadores que nos interesan
    3167           for (j = 1 ; j <= sizartI ; j ++)
     3023  {
     3024    if (elimina[i] == 0)
     3025    {
     3026      // Buscamos en el ideal los generadores que nos interesan
     3027      for (j = 1 ; j <= sizartI ; j ++)
     3028      {
     3029        sop = soporte(artI[j]);
     3030        if (sop <> 0)
     3031        {
     3032          beta[sop] = leadexp(artI[j])[sop];
     3033          MinI = insert(MinI,leadexp(artI[j]));
     3034          if (j <> 1 and j <> sizartI)
     3035          {
     3036            artI = artI[1..j - 1],artI[j + 1..sizartI];
     3037          }
     3038          else
     3039          {
     3040            if (j == 1)
    31683041            {
    3169               sop = soporte(artI[j]);
    3170               if (sop <> 0)
    3171                 {
    3172                   beta[sop] = leadexp(artI[j])[sop];
    3173                   MinI = insert(MinI,leadexp(artI[j]));
    3174                   if (j <> 1 and j <> sizartI)
    3175                     {
    3176                       artI = artI[1..j - 1],artI[j + 1..sizartI];
    3177                     }
    3178                   else
    3179                     {
    3180                       if (j == 1)
    3181                         {
    3182                           artI = artI[2..sizartI];
    3183                         }
    3184                       else
    3185                         {
    3186                           artI = artI[1..sizartI - 1];
    3187                         }
    3188                     }
    3189                   sizartI = size(artI);
    3190                   break;
    3191                 }
     3042              artI = artI[2..sizartI];
    31923043            }
    3193         }
    3194       else
    3195         {
    3196           // Buscamos la que esta al final
    3197           sop = soporte(artI[sizartI]);
    3198           beta[sop] = leadexp(artI[sizartI])[sop];
    3199           MinI = insert(MinI,leadexp(artI[sizartI]));
    3200           if (sizartI <> 1)
     3044            else
    32013045            {
    32023046              artI = artI[1..sizartI - 1];
    32033047            }
    3204           else
    3205             {
    3206               artI = artI[1];
    3207             }
    3208           sizartI = size(artI);
    3209         }
    3210     }
     3048          }
     3049          sizartI = ncols(artI);
     3050          break;
     3051        }
     3052      }
     3053    }
     3054    else
     3055    {
     3056      // Buscamos la que esta al final
     3057      sop = soporte(artI[sizartI]);
     3058      beta[sop] = leadexp(artI[sizartI])[sop];
     3059      MinI = insert(MinI,leadexp(artI[sizartI]));
     3060      if (sizartI <> 1)
     3061      {
     3062        artI = artI[1..sizartI - 1];
     3063      }
     3064      else
     3065      {
     3066        artI = artI[1];
     3067      }
     3068      sizartI = ncols(artI);
     3069    }
     3070  }
    32113071  // En beta tenemos la primera componente
    32123072  componentes = insert(componentes,beta);
     
    32193079  intvec expartI;
    32203080  for(i = 1 ; i <= sizartI ; i ++)
    3221     {
    3222       expartI = leadexp(artI[1]);
    3223       if (size(artI) <> 1)
    3224         {
    3225           artI = artI[2..size(artI)];
    3226         }
    3227       // Hay que distinguir T_1 y T_2. Para ello se comparar vectores
    3228       // de la lista actual de generadores con el que se acaba de
    3229       // introducir.
    3230       cont2 = 0;
    3231       for (j = 1 ; j <= sizcomponents ; j ++)
    3232         {
    3233           beta = componentes[1 + cont2];
    3234           // Si el nuevo generador divide a la componente beta, hay
    3235           // que buscar las nuevas componentes
    3236           for (k = 1 ; k <= nvar ; k ++)
     3081  {
     3082    expartI = leadexp(artI[1]);
     3083    if (size(artI) <> 1)
     3084    {
     3085      artI = artI[2..size(artI)];
     3086    }
     3087    // Hay que distinguir T_1 y T_2. Para ello se comparar vectores
     3088    // de la lista actual de generadores con el que se acaba de
     3089    // introducir.
     3090    cont2 = 0;
     3091    for (j = 1 ; j <= sizcomponents ; j ++)
     3092    {
     3093      beta = componentes[1 + cont2];
     3094      // Si el nuevo generador divide a la componente beta, hay
     3095      // que buscar las nuevas componentes
     3096      for (k = 1 ; k <= nvar ; k ++)
     3097      {
     3098        if (expartI[k] >= beta[k])
     3099        {
     3100          break;
     3101        }
     3102      }
     3103      // Si el bucle anterior termino, divide y hay que hacer
     3104      // los cambios.
     3105      if (k == nvar + 1)
     3106      {
     3107        componentes = delete (componentes,1 + cont2);
     3108        // Buscamos las nuevas componentes calculando las
     3109        // distancias. Para cada variable busco d(beta,k,l)
     3110        for (k = 1 ; k <= nvar ; k ++)
     3111        {
     3112          betaaux = beta;
     3113          max = -1;
     3114          cont = 0;
     3115          dbeta = 0;
     3116          for (l = 1 ; l <= nvar ; l ++)
     3117          {
     3118            if (l <> k)
    32373119            {
    3238               if (expartI[k] >= beta[k])
     3120              min = 32767;
     3121              cont ++;
     3122              for (m = 1 ; m <= sizMin ; m ++)
     3123              {
     3124                // Estos son de los buenos
     3125                if (divide(MinI[m],beta,l) == 1)
    32393126                {
    3240                   break;
     3127                  if (MinI[m][k] < min)
     3128                  {
     3129                    min = MinI[m][k];
     3130                  }
    32413131                }
     3132              }
     3133              dbeta[cont] = min;
    32423134            }
    3243           // Si el bucle anterior termino, divide y hay que hacer
    3244           // los cambios.
    3245           if (k == nvar + 1)
     3135          }
     3136          // Aqui ya tenemos d(beta,k,l) para cada k
     3137          // Hallamos el maximo cuando terminemos
     3138          for (l = 1 ; l <= cont ; l ++)
     3139          {
     3140            if (dbeta[l] > max)
    32463141            {
    3247               componentes = delete (componentes,1 + cont2);
    3248               // Buscamos las nuevas componentes calculando las
    3249               // distancias. Para cada variable busco d(beta,k,l)
    3250               for (k = 1 ; k <= nvar ; k ++)
    3251                 {
    3252                   betaaux = beta;
    3253                   max = -1;
    3254                   cont = 0;
    3255                   dbeta = 0;
    3256                   for (l = 1 ; l <= nvar ; l ++)
    3257                     {
    3258                       if (l <> k)
    3259                         {
    3260                           min = 32767;
    3261                           cont ++;
    3262                           for (m = 1 ; m <= sizMin ; m ++)
    3263                             {
    3264                               // Estos son de los buenos
    3265                               if (divide(MinI[m],beta,l) == 1)
    3266                                 {
    3267                                   if (MinI[m][k] < min)
    3268                                     {
    3269                                       min = MinI[m][k];
    3270                                     }
    3271                                 }
    3272                             }
    3273                           dbeta[cont] = min;
    3274                         }
    3275                     }       
    3276                   // Aqui ya tenemos d(beta,k,l) para cada k
    3277                   // Hallamos el maximo cuando terminemos
    3278                   for (l = 1 ; l <= cont ; l ++)
    3279                     {
    3280                       if (dbeta[l] > max)
    3281                         {
    3282                           max = dbeta[l];
    3283                         }
    3284                     }
    3285                   // Condicion para introducir nueva componente
    3286                   if (max < expartI[k])
    3287                     {
    3288                       betaaux[k] = expartI[k];
    3289                       componentes = insert(componentes,betaaux,size(componentes));
    3290                     }
    3291                 }
     3142              max = dbeta[l];
    32923143            }
    3293           else
    3294             {
    3295               cont2 ++;
    3296             }
    3297         }
    3298       MinI = insert(MinI,expartI);
    3299       sizMin = size(MinI);
    3300       sizcomponents = size(componentes);
    3301     }
     3144          }
     3145          // Condicion para introducir nueva componente
     3146          if (max < expartI[k])
     3147          {
     3148            betaaux[k] = expartI[k];
     3149            componentes = insert(componentes,betaaux,size(componentes));
     3150          }
     3151        }
     3152      }
     3153      else
     3154      {
     3155        cont2 ++;
     3156      }
     3157    }
     3158    MinI = insert(MinI,expartI);
     3159    sizMin = size(MinI);
     3160    sizcomponents = size(componentes);
     3161  }
    33023162  // Deahacer los cambios de artiniano si se han hecho
    33033163  if (artiniano[1] == 0)
    3304    {
    3305      // En elimina tenemos las variables que hemos introducido
    3306      // y cual es la potencia
    3307      // Solo miro las que tengan cambio
    3308      for (i = 1 ; i <= nvar ; i ++)
    3309        {
    3310          if (elimina[i] <> 0)
    3311            {
    3312              for (j = 1 ; j <= sizcomponents ; j ++)
    3313                {
    3314                  if (componentes[j][i] == elimina[i])
    3315                    {
    3316                      componentes[j][i] = 0;
    3317                    }
    3318                }
    3319            }
    3320        }
    3321    }
     3164  {
     3165    // En elimina tenemos las variables que hemos introducido
     3166    // y cual es la potencia
     3167    // Solo miro las que tengan cambio
     3168    for (i = 1 ; i <= nvar ; i ++)
     3169    {
     3170      if (elimina[i] <> 0)
     3171      {
     3172        for (j = 1 ; j <= sizcomponents ; j ++)
     3173        {
     3174          if (componentes[j][i] == elimina[i])
     3175          {
     3176            componentes[j][i] = 0;
     3177          }
     3178        }
     3179      }
     3180    }
     3181  }
    33223182  // En exp(i) tengo los exponentes de cada variable de las que aparecen
    33233183  // en cada ideal.
     
    33253185  list facets;
    33263186  for (i = 1 ; i <= sizcomponents ; i ++)
    3327     {
    3328       J = 0;
    3329       for (j = 1 ; j <= nvar ; j ++)
    3330         {
    3331           if (componentes[i][j] <> 0)
    3332             {
    3333               J = J,x(j)^componentes[i][j];
    3334             }
    3335         }
    3336       J = simplify(J,2);
    3337       facets[i] = J;
    3338     }
    3339   setring R;
    3340   list facets = fetch (R1,facets);
    3341   kill R1;
     3187  {
     3188    J = 0;
     3189    for (j = 1 ; j <= nvar ; j ++)
     3190    {
     3191      if (componentes[i][j] <> 0)
     3192      {
     3193        J = J,var(j)^componentes[i][j];
     3194      }
     3195    }
     3196    J = simplify(J,2);
     3197    facets[i] = J;
     3198  }
    33423199  return (facets);
    33433200}
     
    33643221static proc divideMon (poly f , poly g)
    33653222{
    3366   def R = basering;
    3367   int nvar = nvars(R);
    3368   intvec expf = leadexp(f);
    3369   intvec expg = leadexp(g);
    3370   for (int i = 1 ; i <= nvar ; i ++)
    3371     {
    3372       if (expf[i] > expg[i])
    3373         {
    3374           return (0);
    3375         }
    3376     }
    3377   return (1);
     3223  return (lead(g)/lead(f)!=0);
     3224  //int nvar = nvars(basering);
     3225  //intvec expf = leadexp(f);
     3226  //intvec expg = leadexp(g);
     3227  //for (int i = 1 ; i <= nvar ; i ++)
     3228  //{
     3229  //  if (expf[i] > expg[i])
     3230  //  {
     3231  //    return (0);
     3232  //  }
     3233  //}
     3234  //return (1);
    33783235}
    33793236//////////////////////////////////////////////////////////////////////
     
    33823239{
    33833240  // I is monomial ideal
    3384   def R = basering;
    3385   I = fetch (R,I);
    3386   S = fetch(R,S);
    3387   int sizI = size(I);
    3388   int nvar = nvars(R);
     3241  int sizI = ncols(I);
     3242  int nvar = nvars(basering);
    33893243  intvec explcmMin = leadexp(lcmMin);
    33903244  // Variables
     
    33953249  intvec xiexp;
    33963250  for (i = 1 ; i <= nvar ; i ++)
    3397     {
    3398       if (explcmMin[i] >= 2 )
    3399         {
    3400           // Median exponent of x(i) from intersection(minI,x(i))
    3401           cont = 0;
    3402           for (j = 1 ; j <= sizI ; j ++)
    3403             {
    3404               exp = leadexp(I[j])[i];
    3405               if (exp > 0)
    3406                 {
    3407                   cont ++;
    3408                   xiexp[cont] = exp;
    3409                 }
    3410             }
    3411           xiexp = sort(xiexp)[1];
    3412           sizxi = size(xiexp);
    3413           if (size(xiexp) == 1)
    3414             {
    3415               median = xiexp[1] - 1;
    3416             }
    3417           else
    3418             {
    3419               if (size(xiexp) == 2)
    3420                 {
    3421                   median = xiexp[2] - 1;
    3422                 }
    3423               else
    3424                 {
    3425                   median = xiexp[(size(xiexp) + 1) / 2];
    3426                 }
    3427             }
    3428           p = x(i)^median;
    3429           // valid pivot??
    3430           if ( membershipMon(p,S) == 0)
    3431             {
    3432               return(p);
    3433             }
    3434           else
    3435             {
    3436               max = maximoExp(S,i);
    3437               if ( xiexp[sizxi] == max )
    3438                 {
    3439                   return(x(i)^(max-1));
    3440                 }
    3441             }
    3442           xiexp = 0;
    3443         }
    3444     }
     3251  {
     3252    if (explcmMin[i] >= 2 )
     3253    {
     3254      // Median exponent of x(i) from intersection(minI,x(i))
     3255      cont = 0;
     3256      for (j = 1 ; j <= sizI ; j ++)
     3257      {
     3258        exp = leadexp(I[j])[i];
     3259        if (exp > 0)
     3260        {
     3261          cont ++;
     3262          xiexp[cont] = exp;
     3263        }
     3264      }
     3265      xiexp = sort(xiexp)[1];
     3266      sizxi = size(xiexp);
     3267      if (size(xiexp) == 1)
     3268      {
     3269        median = xiexp[1] - 1;
     3270      }
     3271      else
     3272      {
     3273        if (size(xiexp) == 2)
     3274        {
     3275          median = xiexp[2] - 1;
     3276        }
     3277        else
     3278        {
     3279          median = xiexp[(size(xiexp) + 1) / 2];
     3280        }
     3281      }
     3282      p = var(i)^median;
     3283      // valid pivot??
     3284      if ( membershipMon(p,S) == 0)
     3285      {
     3286        return(p);
     3287      }
     3288      else
     3289      {
     3290        max = maximoExp(S,i);
     3291        if ( xiexp[sizxi] == max )
     3292        {
     3293          return(var(i)^(max-1));
     3294        }
     3295      }
     3296      xiexp = 0;
     3297    }
     3298  }
    34453299}
    34463300//////////////////////////////////////////////////////////////////////
     
    34513305  int i, j, k, cont, numdeleted;
    34523306  intvec isMaximal;
    3453   def R = basering;
    3454   I = fetch(R,I);
    3455   int sizI = size(I);
    3456   int nvar = nvars(R);
     3307  int sizI = ncols(I);
     3308  int nvar = nvars(basering);
    34573309  poly lcmMinI = 1;
    34583310  for (i = 1 ; i <= sizI ; i ++)
    3459     {
    3460       lcmMinI = lcmMon(I[i],lcmMinI);
    3461     }
     3311  {
     3312    lcmMinI = lcmMon(I[i],lcmMinI);
     3313  }
    34623314  intvec explcmMinI = leadexp(lcmMinI);
    34633315  // Buscamos los elementos que son x(i) maximales. En caso de que
     
    34663318  isMaximal[sizI] = 0;
    34673319  intvec genexp;
    3468    for (i = 1 ; i <= sizI ; i ++)
    3469     {
    3470       genexp = leadexp(I[i]);
    3471       cont = 0;
    3472       for ( j = 1 ; j <= nvar ; j ++)
    3473         {
    3474           if (genexp[j] <> 0 && genexp[j] == explcmMinI[j])
     3320  for (i = 1 ; i <= sizI ; i ++)
     3321  {
     3322    genexp = leadexp(I[i]);
     3323    cont = 0;
     3324    for ( j = 1 ; j <= nvar ; j ++)
     3325    {
     3326      if (genexp[j] <> 0 && genexp[j] == explcmMinI[j])
     3327      {
     3328        if (cont == 0)
     3329        {
     3330          cont ++;
     3331          isMaximal[i] = j;
     3332        }
     3333        else
     3334        {
     3335          // Porque cuando encontramos que era maximal para
     3336          // la primera variable, lo guardamos
     3337          isMaximal[i] = 0;
     3338          // Eliminamos del ideal
     3339          if (i <> 1 && i <> sizI)
     3340          {
     3341            I = I[1..i - 1],I[i + 1..sizI];
     3342          }
     3343          else
     3344          {
     3345            if (i == 1)
    34753346            {
    3476        
    3477               if (cont == 0)
    3478                 {
    3479                   cont ++;
    3480                   isMaximal[i] = j;
    3481                 }
    3482               else
    3483                 {
    3484                   // Porque cuando encontramos que era maximal para
    3485                   // la primera variable, lo guardamos
    3486                   isMaximal[i] = 0;
    3487                   // Eliminamos del ideal
    3488                   if (i <> 1 && i <> sizI)
    3489                     {
    3490                       I = I[1..i - 1],I[i + 1..sizI];
    3491                     }
    3492                   else
    3493                     {
    3494                       if (i == 1)
    3495                         {
    3496                           I = I[2..sizI];
    3497                         }
    3498                       else
    3499                         {
    3500                           I = I[1..sizI - 1];
    3501                         }
    3502                     }
    3503                   i --;
    3504                   sizI = size(I);
    3505                   // Generador i eliminado, miramos el siguiente
    3506                   break;
    3507                 }
     3347              I = I[2..sizI];
    35083348            }
    3509         }
    3510     }
     3349            else
     3350            {
     3351              I = I[1..sizI - 1];
     3352            }
     3353          }
     3354          i --;
     3355          sizI = ncols(I);
     3356          // Generador i eliminado, miramos el siguiente
     3357          break;
     3358        }
     3359      }
     3360    }
     3361  }
    35113362   // En isMaximal[i] tenemos 0 si I[i] no es maximal,
    3512    // y j si I[i] es maximal en x(j).                                       
     3363   // y j si I[i] es maximal en x(j).
    35133364  // Matriz de exponentes de los generadores del ideal
    35143365  intmat expI[sizI][nvar];
    35153366  for (i = 1 ; i <= sizI ; i++)
    3516     {
    3517       expI[i,1..nvar] = leadexp(I[i]);
    3518     }
     3367  {
     3368    expI[i,1..nvar] = leadexp(I[i]);
     3369  }
    35193370  // Buscamos ahora cota inferior
    35203371  poly lcmMi = 1;
     
    35223373  intvec Mi, mincol,expgcd;
    35233374  for (i = 1 ; i <= nvar ; i ++)
    3524     {
    3525       Mi = 0;
    3526       cont = 0;
    3527       for (j = 1 ; j <= sizI ; j ++)
    3528         {
    3529           // De isMaximal solo se usan las entradas que se corresponden con elementos del ideal
    3530           if (expI[j,i] <> 0)
    3531             {
    3532               if (isMaximal[j] == 0 or isMaximal[j] == i)
    3533                 {
    3534                   // Elementos del sistema minimal que estan
    3535                   // en Mi
    3536                   cont ++;
    3537                   Mi[cont] = j;
    3538                 }
    3539             }
    3540         }
    3541       // Si solo hay un elemento en Mi, no hay nada que hacer
    3542       if (cont > 1)
    3543         {
    3544           gcdMi = I[Mi[1]];
    3545           // Tenemos los generadores a los que hay que hallar el gcd
    3546           for (j = 2; j <= cont ; j ++)
    3547             {
    3548               gcdMi = gcdMon(gcdMi,I[Mi[j]]);
    3549             }
    3550         }
     3375  {
     3376    Mi = 0;
     3377    cont = 0;
     3378    for (j = 1 ; j <= sizI ; j ++)
     3379    {
     3380      // De isMaximal solo se usan las entradas que se corresponden con elementos del ideal
     3381      if (expI[j,i] <> 0)
     3382      {
     3383        if (isMaximal[j] == 0 or isMaximal[j] == i)
     3384        {
     3385          // Elementos del sistema minimal que estan
     3386          // en Mi
     3387          cont ++;
     3388          Mi[cont] = j;
     3389        }
     3390      }
     3391    }
     3392    // Si solo hay un elemento en Mi, no hay nada que hacer
     3393    if (cont > 1)
     3394    {
     3395      gcdMi = I[Mi[1]];
     3396      // Tenemos los generadores a los que hay que hallar el gcd
     3397      for (j = 2; j <= cont ; j ++)
     3398      {
     3399        gcdMi = gcd(gcdMi,I[Mi[j]]);
     3400      }
     3401    }
     3402    else
     3403    {
     3404      if (Mi <> 0)
     3405      {
     3406        gcdMi = I[Mi[1]];
     3407      }
    35513408      else
    3552         {
    3553           if (Mi <> 0)
    3554             {
    3555               gcdMi = I[Mi[1]];
    3556             }
    3557           else
    3558             {
    3559               // Falta alguna variable
    3560               return (0,I);
    3561             }
    3562         }
    3563       l = gcdMi/x(i);
    3564       lcmMi = lcmMon(lcmMi,l);
    3565     }
     3409      {
     3410        // Falta alguna variable
     3411        return (0,I);
     3412      }
     3413    }
     3414    l = gcdMi/var(i);
     3415    lcmMi = lcmMon(lcmMi,l);
     3416  }
    35663417  // Ahora devolvemos la cota inferior, que luego hay que multiplicar
    35673418  // por el monomio que define el corte.
     
    35733424static proc con (ideal I , ideal S , poly q)
    35743425{
    3575   def R = basering;
    3576   int nvar = nvars(R);
    3577   I = fetch(R,I);
    3578   S = fetch(R,S);
    3579   q = fetch(R,q);
     3426  int nvar = nvars(basering);
    35803427  // Variables
    35813428  int i;
    35823429  poly piI;
    3583   int sizI = size(I);
     3430  int sizI = ncols(I);
    35843431  // Simplification process
    35853432  poly p;
    35863433  list sol;
    35873434  while (1)
    3588     {
    3589       // (I,S,q) normal slice?
    3590       // Como cada vez que introducimos una cota inferior sabemos
    3591       // que la slice actual es la inner slice (la otra es vacio),
    3592       // hay que volver a verificar si es normal
    3593       if ( S <> 0 )
    3594         {
    3595           // m/rad(m) esta en S, para m generador minimal de I??
    3596           for (i = 1 ; i <= sizI ; i ++)
    3597             {       
    3598               piI = pi(I[i]);
    3599               if (membershipMon(piI,S) == 1)
    3600                 {
    3601                   if (i == 1)
    3602                     {
    3603                       I = I[2..sizI];
    3604                     }
    3605                   else
    3606                     {
    3607                       if (i == sizI)
    3608                         {
    3609                           I = I[1..sizI - 1];
    3610                         }
    3611                       else
    3612                         {
    3613                           I = I[1..i - 1],I[i + 1..sizI];
    3614                         }
    3615                     }
    3616                   sizI = size(I);
    3617                   i --;
    3618                 }
     3435  {
     3436    // (I,S,q) normal slice?
     3437    // Como cada vez que introducimos una cota inferior sabemos
     3438    // que la slice actual es la inner slice (la otra es vacio),
     3439    // hay que volver a verificar si es normal
     3440    if ( S <> 0 )
     3441    {
     3442      // m/rad(m) esta en S, para m generador minimal de I??
     3443      for (i = 1 ; i <= sizI ; i ++)
     3444      {
     3445        piI = pi(I[i]);
     3446        if (membershipMon(piI,S) == 1)
     3447        {
     3448          if (i == 1)
     3449          {
     3450            I = I[2..sizI];
     3451          }
     3452          else
     3453          {
     3454            if (i == sizI)
     3455            {
     3456              I = I[1..sizI - 1];
    36193457            }
    3620         }
    3621       // Buscamos cota inferior, y si es distinta de 1, simplificamos
    3622       sol = simplification(I);
    3623       p = sol[1];
    3624       if (p == 1)
     3458            else
     3459            {
     3460              I = I[1..i - 1],I[i + 1..sizI];
     3461            }
     3462          }
     3463          sizI = ncols(I);
     3464          i --;
     3465        }
     3466      }
     3467    }
     3468    // Buscamos cota inferior, y si es distinta de 1, simplificamos
     3469    sol = simplification(I);
     3470    p = sol[1];
     3471    if (p == 1)
     3472    {
     3473      break;
     3474    }
     3475    else
     3476    {
     3477      if (p == 0)
     3478      {
     3479        break;
     3480      }
     3481      else
     3482      {
     3483        if (membershipMon(p,I) == 1 )
    36253484        {
    36263485          break;
    36273486        }
    3628       else
    3629         {
    3630           if (p == 0)
    3631             {
    3632               break;
    3633             }
    3634           else
    3635             {
    3636               if (membershipMon(p,I) == 1 )
    3637                 {
    3638                   break;
    3639                 }
    3640             }
    3641         }
    3642       // Changing slice by simplification
    3643       I = sol[2];
    3644       I = minbase(quotient(I,p));
    3645       q = p*q;
    3646       S = minbase(quotient(S,p));
    3647       sizI = size(I);
    3648     }
    3649   sizI = size(I);
     3487      }
     3488    }
     3489    // Changing slice by simplification
     3490    I = sol[2];
     3491    I = minbase(quotient(I,p));
     3492    q = p*q;
     3493    S = minbase(quotient(S,p));
     3494    sizI = ncols(I);
     3495  }
     3496  sizI = ncols(I);
    36503497  // (I,S,q) base case?
    36513498  poly lcmMinI;
    36523499  lcmMinI = 1;
    36533500  for (i = 1 ; i <= sizI ; i ++)
    3654     {
    3655       lcmMinI = lcmMon(lcmMinI,I[i]);
    3656     }
     3501  {
     3502    lcmMinI = lcmMon(lcmMinI,I[i]);
     3503  }
    36573504  // a:b generates an intvec of length b with constant entries a
    36583505  intvec one = 1:nvar;
    36593506  if (divideMon(monomial(one),lcmMinI) == 0)
    3660    {
    3661      return (0);
    3662    }
     3507  {
     3508    return (0);
     3509  }
    36633510  if (equal(radicalMon(I),I) == 1)
    3664     {
    3665       if (equal(I, maxideal(1)) == 0)
    3666         {
    3667                 return (0);
    3668               }
    3669        else
    3670          {
    3671           for (i = 1 ; i <= nvar ; i ++)
    3672             {
    3673               q = q * x(i);
    3674             }
    3675           return (q);
    3676         }
    3677     }
     3511  {
     3512    if (equal(I, maxideal(1)) == 0)
     3513    {
     3514      return (0);
     3515    }
     3516    else
     3517    {
     3518      for (i = 1 ; i <= nvar ; i ++)
     3519      {
     3520        q = q * var(i);
     3521      }
     3522      return (q);
     3523    }
     3524  }
    36783525  // Selecting pivot
    36793526  p = pivot(I,lcmMinI,S);
     
    36893536static proc irredDecMonSlice (ideal I)
    36903537{
    3691   // New ring
    3692   def R = basering;
    3693   int nvar = nvars(R);
    3694   string s = "ring R1 =",charstr(R),",x(1..nvar),dp;";
    3695   execute(s);
    3696   ideal I = fetch(R,I);
    3697   int sizI = size(I);
     3538  int nvar = nvars(basering);
     3539  int sizI = ncols(I);
    36983540  int i,j;
    36993541  // Artinian ideal
     
    37013543  list artinianization = artinian(I);
    37023544  if (artinianization[1] == 0)
    3703     {
    3704       artI = artinianization[2];
    3705     }
     3545  {
     3546    artI = artinianization[2];
     3547  }
    37063548  else
    3707     {
    3708       artI = I;
    3709     }
     3549  {
     3550    artI = I;
     3551  }
    37103552  // Easy case: 2 variables
    37113553  if (nvar == 2)
    3712     {
    3713       artI = sort(artI)[1];
    3714       int sizartI = size(artI);
    3715       for (i = 1 ; i <= sizartI - 1 ; i ++)
    3716         {
    3717           components[i] = x(1)^(leadexp[artI[i]][1])*x(2)^(leadexp[artI[i + 1]][2]);
    3718         }
    3719       setring R;
    3720       list components = fetch(R1,components);
    3721       kill R1;
    3722       return (components);
    3723     }
     3554  {
     3555    artI = sort(artI)[1];
     3556    int sizartI = size(artI);
     3557    for (i = 1 ; i <= sizartI - 1 ; i ++)
     3558    {
     3559      components[i] = var(1)^(leadexp[artI[i]][1])*var(2)^(leadexp[artI[i + 1]][2]);
     3560    }
     3561    return (components);
     3562  }
    37243563  ideal irredDec = con (artI,0,1);
    37253564  // Delelting zeros
     
    37283567  intvec elimina;
    37293568  if (artinianization[1] == 0)
    3730     {
    3731       elimina = artinianization[3];
    3732     }
     3569  {
     3570    elimina = artinianization[3];
     3571  }
    37333572  else
    3734     {
    3735       elimina = 0;
    3736     }
     3573  {
     3574    elimina = 0;
     3575  }
    37373576 // Each generator (monomial) corresponds to an ideal
    37383577  list components;
     
    37423581  ideal auxIdeal;
    37433582  for (i = 1 ; i <= sizIrred ; i ++)
    3744     {
    3745       comp = irredDec[i];
    3746       exp = leadexp(comp);
    3747       for (j = 1 ; j <= nvar ; j ++)
    3748         {
    3749           if (exp[j] <> 0)
    3750             {
    3751               if (elimina <> 0)
    3752                 {
    3753                   if (exp[j] == elimina[j])
    3754                     {
    3755                       auxIdeal[j] = 0;
    3756                     }
    3757                   else
    3758                     {
    3759                       auxIdeal[j] = x(j)^exp[j];
    3760                     }
    3761                 }
    3762               else
    3763                 {
    3764                   auxIdeal[j] = x(j)^exp[j];
    3765                 }
    3766             }
    3767         }
    3768       components[i] = simplify(auxIdeal,2);
    3769       auxIdeal = 0;
    3770     }
    3771   setring R;
    3772   list components = fetch(R1,components);
    3773   kill R1;
     3583  {
     3584    comp = irredDec[i];
     3585    exp = leadexp(comp);
     3586    for (j = 1 ; j <= nvar ; j ++)
     3587    {
     3588      if (exp[j] <> 0)
     3589      {
     3590        if (elimina <> 0)
     3591        {
     3592          if (exp[j] == elimina[j])
     3593          {
     3594            auxIdeal[j] = 0;
     3595          }
     3596          else
     3597          {
     3598            auxIdeal[j] = var(j)^exp[j];
     3599          }
     3600        }
     3601        else
     3602        {
     3603          auxIdeal[j] = var(j)^exp[j];
     3604        }
     3605      }
     3606    }
     3607    components[i] = simplify(auxIdeal,2);
     3608    auxIdeal = 0;
     3609  }
    37743610  return (components);
    37753611}
     
    38203656  // que comprobar si el ideal es monomial.
    38213657  if (control == 0)
    3822     {
    3823       list isMon = isMonomialGB (I);
    3824       if (isMon[1] == 0)
    3825         {
    3826           ERROR ("the ideal is not monomial.");
    3827         }
    3828       else
    3829         {
    3830           I = isMon[2];
    3831           // Ya lo tenemos con los generadores minimales
    3832         }
    3833     }
     3658  {
     3659    list isMon = isMonomialGB (I);
     3660    if (isMon[1] == 0)
     3661    {
     3662      ERROR ("the ideal is not monomial.");
     3663    }
     3664    else
     3665    {
     3666      I = isMon[2];
     3667      // Ya lo tenemos con los generadores minimales
     3668    }
     3669  }
    38343670  else
    3835     {
    3836       // Generadores monomiales, hallamos sistema minimal
    3837       I = minbase(I);
    3838 
    3839     }
     3671  {
     3672    // Generadores monomiales, hallamos sistema minimal
     3673    I = minbase(I);
     3674  }
    38403675  // Si el ideal es irreducible, devolvemos el mismo
    38413676  if (isirreducibleMon(I) == 1)
    3842     {
    3843       return (I);
    3844     }
    3845  // Si no me han dado opcion, elijo una yo.
    3846  if (size(#) == 1)
    3847    {
    3848      return (irredDec3(I));
    3849    }
     3677  {
     3678    return (I);
     3679  }
     3680  // Si no me han dado opcion, elijo una yo.
     3681  if (size(#) == 1)
     3682  {
     3683    return (irredDec3(I));
     3684  }
    38503685  // Leo la opcion y llamo al procedimiento oportuno
    38513686  else
    3852     {
    3853       if (#[2] == "vas")
    3854         {
    3855           return (irredDec1(I));
    3856         }
    3857       if (#[2] == "add")
    3858         {
    3859           return (irredDec3(I));
    3860         }
    3861       if (#[2] == "ad")
    3862         {
    3863           return (irredDec4(I));
    3864         }
    3865       if (#[2] == "for")
    3866         {
    3867           return (irredDec5(I));
    3868         }
    3869       if (#[2] == "mil")
    3870         {
    3871           return (ScarfMethod(I));
    3872         }
    3873       if (#[2] == "lr")
    3874         {
    3875           return (labelAlgorithm(I));
    3876         }
    3877       if (#[2] == "gz")
    3878         {
    3879           return (incrementalAlg(I));
    3880         }
    3881       if (#[2] == "sr")
    3882         {
    3883           return (irredDecMonSlice(I));
    3884         }
    3885     }
     3687  {
     3688    if (#[2] == "vas")
     3689    {
     3690      return (irredDec1(I));
     3691    }
     3692    if (#[2] == "add")
     3693    {
     3694      return (irredDec3(I));
     3695    }
     3696    if (#[2] == "ad")
     3697    {
     3698      return (irredDec4(I));
     3699    }
     3700    if (#[2] == "for")
     3701    {
     3702      return (irredDec5(I));
     3703    }
     3704    if (#[2] == "mil")
     3705    {
     3706      return (ScarfMethod(I));
     3707    }
     3708    if (#[2] == "lr")
     3709    {
     3710      return (labelAlgorithm(I));
     3711    }
     3712    if (#[2] == "gz")
     3713    {
     3714      return (incrementalAlg(I));
     3715    }
     3716    if (#[2] == "sr")
     3717    {
     3718      return (irredDecMonSlice(I));
     3719    }
     3720  }
    38863721}
    38873722example
     
    39353770  // que comprobar si el ideal es monomial.
    39363771  if (control == 0)
    3937     {
    3938       list isMon = isMonomialGB (I);
    3939       if (isMon[1] == 0)
    3940         {
    3941           ERROR ("the ideal is not monomial.");
    3942         }
    3943       else
    3944         {
    3945           I = isMon[2];
    3946           // Ya lo tenemos con los generadores minimales
    3947         }
    3948     }
     3772  {
     3773    list isMon = isMonomialGB (I);
     3774    if (isMon[1] == 0)
     3775    {
     3776      ERROR ("the ideal is not monomial.");
     3777    }
     3778    else
     3779    {
     3780      I = isMon[2];
     3781      // Ya lo tenemos con los generadores minimales
     3782    }
     3783  }
    39493784  else
    3950     {
    3951       // Generadores monomiales, hallamos sistema minimal
    3952       I = minbase(I);
    3953     }
     3785  {
     3786    // Generadores monomiales, hallamos sistema minimal
     3787    I = minbase(I);
     3788  }
    39543789  // Estudiamos si el ideal es o no primario
    39553790  if (isprimaryMon(I) == 1)
    3956     {
    3957       return (I);
    3958     }
     3791  {
     3792    return (I);
     3793  }
    39593794  // Si no me han dado opcion, elijo una yo.
    39603795  if (size(#) == 1)
    3961     {
    3962       return(primDec3(I));
    3963     }
     3796  {
     3797    return(primDec3(I));
     3798  }
    39643799  // Leo la opcion y llamo al procedimiento oportuno
    39653800  else
    3966     {
    3967       if (#[2] == "vi")
    3968         {
    3969           return (primDec1(I));
    3970         }
    3971       if (#[2] == "vp")
    3972         {
    3973           return (primDec2(I));
    3974         }
    3975       if (#[2] == "add")
    3976         {
    3977           return (primDec3(I));
    3978         }
    3979       if (#[2] == "ad")
    3980         {
    3981           return (primDec4(I));
    3982         }
    3983       if (#[2] == "for")
    3984         {
    3985           return (primDec5(I));
    3986         }
    3987       if (#[2] == "mil")
    3988         {
    3989           return (scarfMethodPrim(I));
    3990         }
    3991       if (#[2] == "lr")
    3992         {
    3993           return (labelAlgPrim(I));
    3994         }
    3995       if (#[2] == "gz")
    3996         {
    3997           return (incrementalAlgPrim(I));
    3998         }
    3999       if (#[2] == "sr")
    4000         {
    4001           return (primDecMonSlice(I));
    4002         }
    4003     }
     3801  {
     3802    if (#[2] == "vi")
     3803    {
     3804      return (primDec1(I));
     3805    }
     3806    if (#[2] == "vp")
     3807    {
     3808      return (primDec2(I));
     3809    }
     3810    if (#[2] == "add")
     3811    {
     3812      return (primDec3(I));
     3813    }
     3814    if (#[2] == "ad")
     3815    {
     3816      return (primDec4(I));
     3817    }
     3818    if (#[2] == "for")
     3819    {
     3820      return (primDec5(I));
     3821    }
     3822    if (#[2] == "mil")
     3823    {
     3824      return (scarfMethodPrim(I));
     3825    }
     3826    if (#[2] == "lr")
     3827    {
     3828      return (labelAlgPrim(I));
     3829    }
     3830    if (#[2] == "gz")
     3831    {
     3832      return (incrementalAlgPrim(I));
     3833    }
     3834    if (#[2] == "sr")
     3835    {
     3836      return (primDecMonSlice(I));
     3837    }
     3838  }
    40043839}
    40053840example
Note: See TracChangeset for help on using the changeset viewer.