Changeset f0daaa2 in git


Ignore:
Timestamp:
May 15, 2006, 12:59:17 PM (17 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
Children:
45c9af467659b9010e2fc67a7cb8da665abaf595
Parents:
181148eb58afcf5d585ec06f89fbab21c1ab9c99
Message:
*pfister: S.Laplagnes radical


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

Legend:

Unmodified
Added
Removed
  • Singular/LIB/primdec.lib

    r181148 rf0daaa2  
    11///////////////////////////////////////////////////////////////////////////////
    2 version="$Id: primdec.lib,v 1.114 2006-05-12 12:12:05 Singular Exp $";
     2version="$Id: primdec.lib,v 1.115 2006-05-15 10:59:17 Singular Exp $";
    33category="Commutative Algebra";
    44info="
     
    55095509
    55105510///////////////////////////////////////////////////////////////////////////////
    5511 proc radical(ideal i,list #)
    5512 "USAGE:   radical(i); i ideal.
     5511proc radical(ideal i, list #)
     5512"USAGE:           radical(i); i ideal.
     5513                        Optional parameters in list #: (can be entered in any order)
     5514                        1, "equiRad" -> equiRadical is computed
     5515                        0, "fullRad" -> full radical is computed  (default)
     5516                        "SL" ->                 the new algorithm is used (default)
     5517                        "KL" ->                 the old algorithm is used
     5518                        "KLdp" ->                 the old algorithm, with modifications
     5519                        "facstd" ->                uses facstd to first decompose the ideal (default for non homogeneous ideals)
     5520                        "noFacstd" ->        does not use facstd (default for homogeneous ideals)
    55135521RETURN:  ideal, the radical of i.
    55145522NOTE:    A combination of the algorithms of Krick/Logar and Kemper is used.
     
    55175525"
    55185526{
     5527   dbprint(printlevel - voice, "Radical, version 2006.05.08");
    55195528   if(ord_test(basering)!=1)
    55205529   {
     
    55245533   }
    55255534   def @P=basering;
    5526    int j,il;
    5527    if(size(#)>0){il=#[1];}
    5528    if(size(i)==0){return(ideal(0));}
    5529    ideal re=1;
     5535   int j;
     5536   int il;
     5537   string algorithm;
     5538   int useFac;
     5539
     5540   // Set input parameters
     5541   algorithm = "SL";                                 // Default: SL algorithm
     5542   il = 0;                                                        // Default: Full radical (not only equidim part)
     5543   if (homog(i) == 1) {                                // Default: facStd is used, except if the ideal is homogeneous.
     5544      useFac = 0;
     5545   } else {
     5546             useFac = 1;
     5547   };
     5548   if(size(#) > 0){
     5549           int valid;
     5550           for(j = 1; j <= size(#); j++){
     5551                   valid = 0;
     5552                   if((typeof(#[j]) == "int") or (typeof(#[j]) == "number")) {
     5553                           il = #[j];                        // If il == 1, equiRadical is computed
     5554                           valid = 1;
     5555                   };
     5556                   if(typeof(#[j]) == "string"){
     5557                           if(#[j] == "KL") {
     5558                                   algorithm = "KL";
     5559                                   valid = 1};
     5560                           if(#[j] == "KLdp") {
     5561                                   algorithm = "KLdp";
     5562                                   valid = 1};
     5563                           if(#[j] == "SL") {
     5564                                   algorithm = "SL";
     5565                                   valid = 1};
     5566                           if(#[j] == "noFacstd") {
     5567                                   useFac = 0;
     5568                                   valid = 1};
     5569                           if(#[j] == "facstd") {
     5570                                   useFac = 1;
     5571                                      valid = 1};
     5572                           if(#[j] == "equiRad") {
     5573                                   il = 1;
     5574                                   valid = 1};
     5575                           if(#[j] == "fullRad") {
     5576                                   il = 0;
     5577                                   valid = 1};
     5578                   };
     5579                   if(valid == 0) {
     5580                           dbprint(1, "Warning! The following input parameter was not recognized:", #[j]);
     5581                   };
     5582           };
     5583   };
     5584
     5585   if(size(i) == 0){return(ideal(0));}
     5586   ideal rad = 1;
    55305587   intvec op = option(get);
    5531    list qr=simplifyIdeal(i);
    5532    ideal isave=i;
    5533    map phi=@P,qr[2];
     5588   list qr = simplifyIdeal(i);
     5589   // SL - Line removed. The ideal isave was never used.
     5590   //ideal isave=i;
     5591   map phi = @P, qr[2];
    55345592
    55355593   option(redSB);
    5536    i=groebner(qr[1]);
    5537    option(set,op);
    5538    int di=dim(i);
    5539 
    5540    if(di==0)
    5541    {
    5542      i=zeroRad(i,qr[1]);
     5594   i = groebner(qr[1]);
     5595   option(set, op);
     5596   int di = dim(i);
     5597
     5598   if(di == 0)
     5599   {
     5600     i = zeroRad(i, qr[1]);
    55435601     return(interred(phi(i)));
    55445602   }
    55455603
    55465604   option(redSB);
    5547    list pr=i;
    5548    if (!homog(i))
    5549    {
    5550      pr=facstd(i);
    5551    }
    5552    option(set,op);
    5553    int s=size(pr);
    5554 
    5555    for(j=1;j<=s;j++)
    5556    {
    5557       attrib(pr[s+1-j],"isSB",1);
    5558       if((size(reduce(re,pr[s+1-j],1))!=0)&&((dim(pr[s+1-j])==di)||!il))
    5559       {
    5560          re=intersect(re,radicalKL(pr[s+1-j],re,il));
    5561       }
    5562    }
    5563    return(interred(phi(re)));
     5605   list pr;
     5606   if(useFac == 1)
     5607   {
     5608     pr = facstd(i);
     5609   } else {
     5610         pr = i
     5611   };
     5612   option(set, op);
     5613   int s = size(pr);
     5614   if(useFac == 1) {
     5615      dbprint(printlevel - voice, "Number of components returned by facstd: ", s);
     5616   };
     5617   for(j = 1; j <= s; j++)
     5618   {
     5619      attrib(pr[s + 1 - j], "isSB", 1);
     5620      if((size(reduce(rad, pr[s + 1 - j], 1)) != 0) && ((dim(pr[s + 1 - j]) == di) || !il))
     5621      {
     5622         // SL Debug messages
     5623         dbprint(printlevel-voice, "We shall compute the radical of ", pr[s + 1 - j]);
     5624         dbprint(printlevel-voice, "The dimension is: ", dim(pr[s+1-j]));
     5625
     5626             if(algorithm == "KL") {
     5627                  rad = intersect(rad, radicalKL(pr[s + 1 - j], rad, il));
     5628              }
     5629             if(algorithm == "KLdp") {
     5630                  rad = intersect(rad, newRadicalKL(pr[s + 1 - j], rad, il));
     5631              }
     5632              if(algorithm == "SL") {
     5633                      rad = intersect(rad, newRadicalSL(pr[s + 1 - j], il));
     5634              };
     5635      } else
     5636      {
     5637              // SL Debug
     5638          dbprint(printlevel-voice, "The radical of this component is not needed.");
     5639          dbprint(printlevel-voice, "size(reduce(rad, pr[s + 1 - j], 1))", size(reduce(rad, pr[s + 1 - j], 1)));
     5640          dbprint(printlevel-voice, "dim(pr[s + 1 - j])", dim(pr[s + 1 - j]));
     5641          dbprint(printlevel-voice, "il", il);
     5642      };
     5643   }
     5644   return(interred(phi(rad)));
    55645645}
    55655646example
     
    55695650   poly  q = z3+2;
    55705651   ideal i = p*q^2,y-z2;
    5571    ideal pr= radical(i);
     5652   ideal pr = radical(i);
    55725653   pr;
    55735654}
     5655
     5656///////////////////////////////////////////////////////////////////////////////
     5657//
     5658// Computes the radical of I using KL algorithm.
     5659// The only difference with the the previous implementation of KL algorithm is
     5660// that now it uses block dp instead of lp ordering for the reduction to the
     5661// zerodimensional case.
     5662// The reduction step has been moved to the new routine newRadicalReduction, so that it can be
     5663// used also by the new algorithm.
     5664// This algorithm should be left in the final version of the library,
     5665// and radicalKL removed.
     5666//
     5667static proc newRadicalKL(ideal I, ideal ser, list #) {
     5668// I                                The ideal for which the radical is computed
     5669// ideal ser                Same as in radicalKL (used to reduce components already obtained)
     5670// list #                        If #[1] = 1, equiradical is computed.
     5671
     5672        // I needs to be a Groebner basis.
     5673        if (attrib(I, "isSB") != 1) {
     5674                I = groebner(I);
     5675        };
     5676
     5677        ideal rad;                                // The radical
     5678        int allIndep = 1;                // All max independent sets are used
     5679
     5680        list result = newRadicalReduction(I, ser, allIndep, #);
     5681        int done = result[3];
     5682        rad = result[1];
     5683        if (done == 0) {
     5684                rad = intersect(rad, newRadicalKL(result[2], ideal(1), #));
     5685        };
     5686        return(rad);
     5687};
     5688
     5689
     5690///////////////////////////////////////////////////////////////////////////////
     5691//
     5692// Computes the radical of I via the new algorithm, using zerodimensional radical in
     5693// the zero dimensional case.
     5694// For the reduction to the zerodimensional case, it uses the procedure
     5695// radical of primdec.lib, with some modifications to avoid the recursion.
     5696//
     5697static proc newRadicalSL(ideal I, list #)
     5698// Input = I, ideal
     5699//         #, list. If #[1] = 1, then computes only the equiradical.
     5700// Output = (P, primaryDec) where P = rad(I) and primaryDec is the list of the radicals
     5701// obtained in intermediate steps.
     5702{
     5703        ideal rad = 1;
     5704        ideal equiRad = 1;
     5705        list primes;
     5706        int k;                        // Counter
     5707        int il;                 // If il = 1, only the equiradical is required.
     5708        int iDim;                // The dimension of I
     5709        int stop = 0;   // Checks if the radical has been obtained
     5710
     5711        if (attrib(I, "isSB") != 1) {
     5712                I = groebner(I);
     5713        };
     5714        iDim = dim(I);
     5715
     5716    // Checks if only equiradical is required
     5717    if (size(#) > 0) {
     5718       il = #[1];
     5719    };
     5720
     5721        while(stop == 0) {
     5722                dbprint (printlevel-voice, "// We call radLoopR to find new prime ideals.");
     5723                primes = newRadicalSLIteration(I, rad);                         // A list of primes or intersections of primes, not included in P
     5724                dbprint (printlevel - voice, "// Output of Iteration Step:");
     5725                dbprint (printlevel - voice, primes);
     5726                if (size(primes) > 0) {
     5727                        dbprint (printlevel - voice, "// We intersect P with the ideal just obtained.");
     5728                        for(k = 1; k <= size(primes); k++) {
     5729                                rad = intersect(rad, primes[k]);
     5730                                if (il == 1){
     5731                                        if (attrib(primes[k], "isSB") != 1) {
     5732                                                primes[k] = groebner(primes[k]);
     5733                                        };
     5734                                        if (iDim == dim(primes[k])) {
     5735                                                equiRad = intersect(equiRad, primes[k]);
     5736                                        };
     5737                                };
     5738                        };
     5739                } else {
     5740                        stop = 1
     5741                };
     5742        };
     5743        if (il == 0) {
     5744                return(rad);
     5745        } else {
     5746                return(equiRad);
     5747        };
     5748};
     5749
     5750//////////////////////////////////////////////////////////////////////////
     5751// Based on radicalKL.
     5752// It contains all of proc radicalKL except the recursion call.
     5753
     5754// Output:
     5755// #1 -> output ideal, the part of the radical that has been computed
     5756// #2 -> complementary ideal, the part of the ideal I whose radical remains to be computed
     5757//       = (I, h) in KL algorithm
     5758//       This is not used in the new algorithm. It is part of KL algorithm
     5759// #3 -> done, 1: output = radical, there is no need to continue
     5760//                   0: radical = output \cap \sqrt{complementary ideal}
     5761//       This is not used in the new algorithm. It is part of KL algorithm
     5762
     5763static proc newRadicalReduction(ideal I, ideal ser, int allIndep, list #) {
     5764// allMaximal                1 -> Indicates that the reduction to the zerodim case
     5765//                       must be done for all indep set of the leading terms ideal
     5766//                                        0 -> Otherwise
     5767// ideal ser                Only for radicalKL. (Same as in radicalKL)
     5768// list #                        Only for radicalKL (If #[1] = 1, only equiradical is required.
     5769//                  It is used to set the value of done.)
     5770
     5771   attrib(I, "isSB", 1);   // I needs to be a reduced standard basis
     5772   list indep, fett;
     5773   intvec @w, @hilb, op;
     5774   int @wr, @n, @m, lauf, di;
     5775   ideal fac, @h, collectrad, lsau;
     5776   poly @q;
     5777   string @va, quotring;
     5778
     5779   def @P = basering;
     5780   int jdim = dim(I);               // Computes the dimension of I
     5781   int  homo = homog(I);            // Finds out if I is homogeneous
     5782   ideal rad = ideal(1);            // The unit ideal
     5783   ideal te = ser;
     5784   if(size(#) > 0)
     5785   {
     5786      @wr = #[1];
     5787   }
     5788   if(homo == 1)
     5789   {
     5790      for(@n = 1; @n <= nvars(basering); @n++)
     5791      {
     5792         @w[@n] = ord(var(@n));
     5793      }
     5794      @hilb = hilb(I, 1, @w);
     5795   }
     5796
     5797   // SL 2006.04.11 1 Debug messages
     5798   dbprint(printlevel-voice, "//Computes the radical of the ideal:", I);
     5799   // SL 2006.04.11 2 Debug messages
     5800
     5801  //---------------------------------------------------------------------------
     5802  //j is the ring
     5803  //---------------------------------------------------------------------------
     5804
     5805   if (jdim==-1)
     5806   {
     5807      return(ideal(1), ideal(1), 1);
     5808   }
     5809
     5810  //---------------------------------------------------------------------------
     5811  //the zero-dimensional case
     5812  //---------------------------------------------------------------------------
     5813
     5814   if (jdim==0)
     5815   {
     5816      return(zeroRad(I), ideal(1), 1);
     5817   }
     5818
     5819   //-------------------------------------------------------------------------
     5820   //search for a maximal independent set indep,i.e.
     5821   //look for subring such that the intersection with the ideal is zero
     5822   //j intersected with K[var(indep[3]+1),...,var(nvar)] is zero,
     5823   //indep[1] is the new varstring, indep[2] the string for the block-ordering
     5824   //-------------------------------------------------------------------------
     5825
     5826   // SL 2006-04-24 1         If allIndep = 0, then it only computes one maximal
     5827   //                                        independent set.
     5828   //                                        This looks better for the new algorithm but not for KL
     5829   //                                        algorithm
     5830   list parameters = allIndep;
     5831   indep = newMaxIndependSet(I, parameters);
     5832   // SL 2006-04-24 2
     5833
     5834   for(@m = 1; @m <= size(indep); @m++)
     5835   {
     5836      if((indep[@m][1] == varstr(basering)) && (@m == 1))
     5837      //this is the good case, nothing to do, just to have the same notations
     5838      //change the ring
     5839      {
     5840         execute("ring gnir1 = ("+charstr(basering)+"),("+varstr(basering)+"),("
     5841                              +ordstr(basering)+");");
     5842         ideal @j = fetch(@P, I);
     5843         attrib(@j, "isSB", 1);
     5844      }
     5845      else
     5846      {
     5847         @va = string(maxideal(1));
     5848
     5849         execute("ring gnir1 = (" + charstr(basering) + "), (" + indep[@m][1] + "),("
     5850                              + indep[@m][2] + ");");
     5851         execute("map phi = @P," + @va + ";");
     5852         if(homo == 1)
     5853         {
     5854            ideal @j = std(phi(I), @hilb, @w);
     5855         }
     5856         else
     5857         {
     5858            ideal @j = groebner(phi(I));
     5859         }
     5860      }
     5861      if((deg(@j[1]) == 0) || (dim(@j) < jdim))
     5862      {
     5863         setring @P;
     5864         break;
     5865      }
     5866      for (lauf = 1; lauf <= size(@j); lauf++)
     5867      {
     5868         fett[lauf] = size(@j[lauf]);
     5869      }
     5870      //------------------------------------------------------------------------
     5871      // We have now the following situation:
     5872      // j intersected with K[var(nnp+1),..,var(nva)] is zero so we may pass
     5873      // to this quotientring, j is there still a standardbasis, the
     5874      // leading coefficients of the polynomials there (polynomials in
     5875      // K[var(nnp+1),..,var(nva)]) are collected in the list h,
     5876      // we need their LCM, gh, because of the following:
     5877      // let (j:gh^n)=(j:gh^infinity) then j*K(var(nnp+1),..,var(nva))[..rest..]
     5878      // intersected with K[var(1),...,var(nva)] is (j:gh^n)
     5879      // on the other hand j = ((j, gh^n) intersected with (j : gh^n))
     5880
     5881      //------------------------------------------------------------------------
     5882      // The arrangement for the quotientring K(var(nnp+1),..,var(nva))[..rest..]
     5883      // and the map phi:K[var(1),...,var(nva)] ----->
     5884      // K(var(nnpr+1),..,var(nva))[..the rest..]
     5885      //------------------------------------------------------------------------
     5886      quotring = newPrepareQuotientRing(nvars(basering) - indep[@m][3]);
     5887      //------------------------------------------------------------------------
     5888      // We pass to the quotientring   K(var(nnp+1),..,var(nva))[..the rest..]
     5889      //------------------------------------------------------------------------
     5890
     5891      execute(quotring);
     5892
     5893      // @j considered in the quotientring
     5894      ideal @j = imap(gnir1, @j);
     5895
     5896      kill gnir1;
     5897
     5898      // j is a standardbasis in the quotientring but usually not minimal
     5899      // here it becomes minimal
     5900
     5901      @j = clearSB(@j, fett);
     5902
     5903      // We need later LCM(h[1],...) = gh for saturation
     5904      ideal @h;
     5905      if(deg(@j[1]) > 0)
     5906      {
     5907         for(@n = 1; @n <= size(@j); @n++)
     5908         {
     5909            @h[@n] = leadcoef(@j[@n]);
     5910         }
     5911         op = option(get);
     5912         option(redSB);
     5913         @j = interred(@j);  //to obtain a reduced standardbasis
     5914         attrib(@j, "isSB", 1);
     5915         option(set, op);
     5916
     5917         // SL 1 Debug messages
     5918         dbprint(printlevel - voice, "zero_rad", basering, @j, dim(groebner(@j)));
     5919         ideal zero_rad = zeroRad(@j);
     5920         dbprint(printlevel - voice, "zero_rad passed");
     5921         // SL 2
     5922      }
     5923      else
     5924      {
     5925         ideal zero_rad = ideal(1);
     5926      }
     5927
     5928      // We need the intersection of the ideals in the list quprimary with the
     5929      // polynomialring, i.e. let q=(f1,...,fr) in the quotientring such an ideal
     5930      // but fi polynomials, then the intersection of q with the polynomialring
     5931      // is the saturation of the ideal generated by f1,...,fr with respect to
     5932      // h which is the lcm of the leading coefficients of the fi considered in
     5933      // the quotientring: this is coded in saturn
     5934
     5935      zero_rad = std(zero_rad);
     5936
     5937      ideal hpl;
     5938
     5939      for(@n = 1; @n <= size(zero_rad); @n++)
     5940      {
     5941         hpl = hpl, leadcoef(zero_rad[@n]);
     5942      }
     5943
     5944      //------------------------------------------------------------------------
     5945      // We leave  the quotientring   K(var(nnp+1),..,var(nva))[..the rest..]
     5946      // back to the polynomialring
     5947      //------------------------------------------------------------------------
     5948      setring @P;
     5949
     5950      collectrad = imap(quring, zero_rad);
     5951      lsau = simplify(imap(quring, hpl), 2);
     5952      @h = imap(quring, @h);
     5953
     5954      kill quring;
     5955
     5956      // Here the intersection with the polynomialring
     5957      // mentioned above is really computed
     5958
     5959      collectrad = sat2(collectrad, lsau)[1];
     5960      if(deg(@h[1])>=0)
     5961      {
     5962         fac = ideal(0);
     5963         for(lauf = 1; lauf <= ncols(@h); lauf++)
     5964         {
     5965            if(deg(@h[lauf]) > 0)
     5966            {
     5967                fac = fac + factorize(@h[lauf], 1);
     5968            }
     5969         }
     5970         fac = simplify(fac, 4);
     5971         @q = 1;
     5972         for(lauf = 1; lauf <= size(fac); lauf++)
     5973         {
     5974            @q = @q * fac[lauf];
     5975         }
     5976         op = option(get);
     5977         option(returnSB);
     5978         option(redSB);
     5979         I = quotient(I + ideal(@q), rad);
     5980         attrib(I, "isSB", 1);
     5981         option(set, op);
     5982      }
     5983      if((deg(rad[1]) > 0) && (deg(collectrad[1]) > 0))
     5984      {
     5985         rad = intersect(rad, collectrad);
     5986         te = intersect(te, collectrad);
     5987         te = simplify(reduce(te, I, 1), 2);
     5988      }
     5989      else
     5990      {
     5991         if(deg(collectrad[1]) > 0)
     5992         {
     5993            rad = collectrad;
     5994            te = intersect(te, collectrad);
     5995            te = simplify(reduce(te, I, 1), 2);
     5996         }
     5997      }
     5998
     5999      if((dim(I) < jdim)||(size(te) == 0))
     6000      {
     6001         break;
     6002      }
     6003      if(homo==1)
     6004      {
     6005         @hilb = hilb(I, 1, @w);
     6006      }
     6007   }
     6008
     6009   // SL 2006.04.11 1 Debug messages
     6010   dbprint (printlevel-voice, "// Part of the Radical already computed:", rad);
     6011   dbprint (printlevel-voice, "// Dimension:", dim(groebner(rad)));
     6012   // SL 2006.04.11 2 Debug messages
     6013
     6014   // SL 2006.04.21 1         New variable "done".
     6015   //                                        It tells if the radical is already computed or
     6016   //                                        if it still has to be computed the radical of the new ideal I
     6017   int done;
     6018   if(((@wr == 1) && (dim(I)<jdim)) || (deg(I[1])==0) || (size(te) == 0))
     6019   {
     6020      done = 1;
     6021   } else {
     6022      done = 0;
     6023   };
     6024   // SL 2006.04.21 2
     6025
     6026   // SL 2006.04.21 1         See details of the output at the beggining of this proc.
     6027   list result = rad, I, done;
     6028   return(result);
     6029   // SL 2006.04.21 2
     6030};
     6031
     6032
     6033
     6034///////////////////////////////////////////////////////////////////////////////
     6035// Given an ideal I and an ideal P (intersection of some minimal prime ideals
     6036// associated to I), it calculates the intersection of new minimal prime ideals
     6037// associated to I which where not used to calculate P.
     6038// This version uses ZD Radical in the zerodimensional case.
     6039static proc newRadicalSLIteration (ideal I, ideal P);
     6040// Input: I, ideal. The ideal from which new prime components will be obtained.
     6041//        P, ideal. Intersection of some prime ideals of I.
     6042// Output: ideal. Intersection of some primes of I different from the ones in P.
     6043{
     6044        int k = 1;                                // Counter
     6045        int good  = 0;                        // Checks if an element of P is in rad(I)
     6046
     6047        dbprint (printlevel-voice, "// We search for an element in P - sqrt(I).");
     6048        while ((k <= size(P)) and (good == 0)) {
     6049                dbprint (printlevel-voice, "// We try with:", P[k]);
     6050                good = 1 - rad_con(P[k], I);
     6051                k++;
     6052        };
     6053        k--;
     6054        if (good == 0) {
     6055                dbprint (printlevel-voice, "// No element was found, P = sqrt(I).");
     6056                list emptyList = list();
     6057                return (emptyList);
     6058        };
     6059        dbprint(printlevel - voice, "// That one was good!");
     6060        dbprint(printlevel - voice, "// We saturate I with respect to this element.");
     6061        if (P[k] != 1) {
     6062                ideal J = sat(I, P[k])[1];
     6063        } else {
     6064                dbprint(printlevel - voice, "// The polynomial is 1, the saturation in not actually computed.");
     6065                ideal J = I;
     6066        };
     6067
     6068        // We now call proc radicalNew;
     6069        dbprint(printlevel - voice, "// We do the reduction to the zerodimensional case, via radical.");
     6070        dbprint(printlevel - voice, "// The ideal is ", J);
     6071        dbprint(printlevel - voice, "// The dimension is ", dim(groebner(J)));
     6072
     6073    int allMaximal = 0;                   // Compute the zerodim reduction for only one indep set.
     6074    ideal re = 1;                           // No reduction is need, there are not redundant components.
     6075    list emptyList = list();   // Look for primes of any dimension, not only of max dimension.
     6076    list result = newRadicalReduction(J, re, allMaximal, emptyList);
     6077
     6078        return(result[1]);
     6079};
     6080
     6081
     6082
     6083///////////////////////////////////////////////////////////////////////////////////
     6084// Based on maxIndependSet
     6085// Added list # as parameter
     6086// If the first element of # is 0, the output is only 1 max indep set.
     6087// If no list is specified or #[1] = 1, the output is all the max indep set of the
     6088// leading terms ideal. This is the original output of maxIndependSet
     6089
     6090// The ordering given in the output has been changed to block dp instead of lp.
     6091
     6092static proc newMaxIndependSet(ideal j, list #)
     6093// #[1]=0 -->                 computes only one max indep set
     6094"USAGE:   maxIndependentSet(i); i ideal
     6095RETURN:  list = #1. new varstring with the maximal independent set at the end,
     6096                #2. ordstring with the corresponding block ordering,
     6097                #3. the number of independent variables
     6098                // SL #3 explanation modified,
     6099                // it was: integer where the independent set starts in the varstring
     6100NOTE:
     6101EXAMPLE: example maxIndependentSet; shows an example
     6102"
     6103{
     6104   int n, k, di;
     6105   list resu, hilf;
     6106   string var1, var2;
     6107   list v = indepSet(j, 0);
     6108
     6109   // SL 2006.04.21 1 Lines modified to use only one independent Set
     6110   int allMaximal;
     6111   if (size(#) > 0) {
     6112           allMaximal = #[1];
     6113   } else {
     6114           allMaximal = 1;
     6115   };
     6116
     6117   int nMax;
     6118   if (allMaximal == 1) {
     6119      nMax = size(v);
     6120   } else {
     6121          nMax = 1;
     6122   };
     6123
     6124   for(n = 1; n <= nMax; n++)
     6125   // SL 2006.04.21 2
     6126   {
     6127      di = 0;
     6128      var1 = "";
     6129      var2 = "";
     6130      for(k = 1; k <= size(v[n]); k++)
     6131      {
     6132         if(v[n][k] != 0)
     6133         {
     6134            di++;
     6135            var2 = var2 + "var(" + string(k) + "), ";
     6136         }
     6137         else
     6138         {
     6139            var1 = var1 + "var(" + string(k) + "), ";
     6140         }
     6141      }
     6142      if(di > 0)
     6143      {
     6144         var1 = var1 + var2;
     6145         var1 = var1[1..size(var1) - 2];                         // The "- 2" removes the trailer comma
     6146         hilf[1] = var1;
     6147         // SL 2006.21.04 1 The order is now block dp instead of lp
     6148         hilf[2] = "dp(" + string(nvars(basering) - di) + "), dp(" + string(di) + ")";
     6149         // SL 2006.21.04 2
     6150         hilf[3] = di;
     6151         resu[n] = hilf;
     6152      }
     6153      else
     6154      {
     6155         resu[n] = varstr(basering), ordstr(basering), 0;
     6156      }
     6157   }
     6158   return(resu);
     6159}
     6160example
     6161{ "EXAMPLE:"; echo = 2;
     6162   ring s1 = (0, x, y), (a, b, c, d, e, f, g), lp;
     6163   ideal i = ea - fbg, fa + be, ec - fdg, fc + de;
     6164   i = std(i);
     6165   list l = newMaxIndependSet(i);
     6166   l;
     6167   i = i, g;
     6168   l = newMaxIndependSet(i);
     6169   l;
     6170
     6171   ring s = 0, (x, y, z), lp;
     6172   ideal i = z, yx;
     6173   list l = newMaxIndependSet(i);
     6174   l;
     6175}
     6176
     6177
     6178///////////////////////////////////////////////////////////////////////////////
     6179// based on prepareQuotientring
     6180// The order returned is now (C, dp) instead of (C, lp)
     6181
     6182static proc newPrepareQuotientRing (int nnp)
     6183"USAGE:   newPrepareQuotientRing(nnp); nnp int
     6184RETURN:  string = to define Kvar(nnp+1),...,var(nvars)[..rest ]
     6185NOTE:
     6186EXAMPLE: example newPrepareQuotientRing; shows an example
     6187"
     6188{
     6189  ideal @ih,@jh;
     6190  int npar=npars(basering);
     6191  int @n;
     6192
     6193  string quotring= "ring quring = ("+charstr(basering);
     6194  for(@n = nnp + 1; @n <= nvars(basering); @n++)
     6195  {
     6196     quotring = quotring + ", var(" + string(@n) + ")";
     6197     @ih = @ih + var(@n);
     6198  }
     6199
     6200  quotring = quotring+"),(var(1)";
     6201  @jh = @jh + var(1);
     6202  for(@n = 2; @n <= nnp; @n++)
     6203  {
     6204    quotring = quotring + ", var(" + string(@n) + ")";
     6205    @jh = @jh + var(@n);
     6206  }
     6207  // SL 2006-04-21 1 The order returned is now (C, dp) instead of (C, lp)
     6208  quotring = quotring + "), (C, dp);";
     6209  // SL 2006-04-21 2
     6210
     6211  return(quotring);
     6212}
     6213example
     6214{ "EXAMPLE:"; echo = 2;
     6215   ring s1=(0,x),(a,b,c,d,e,f,g),lp;
     6216   def @Q=basering;
     6217   list l= newPrepareQuotientRing(3);
     6218   l;
     6219   execute(l[1]);
     6220   execute(l[2]);
     6221   basering;
     6222   phi;
     6223   setring @Q;
     6224
     6225}
     6226
    55746227///////////////////////////////////////////////////////////////////////////////
    55756228proc prepareAss(ideal i)
Note: See TracChangeset for help on using the changeset viewer.