[BACK]Return to minimal.k CVS log [TXT][DIR] Up to [local] / OpenXM / src / k097 / lib / minimal

Diff for /OpenXM/src/k097/lib/minimal/minimal.k between version 1.17 and 1.22

version 1.17, 2000/07/26 12:56:36 version 1.22, 2000/08/01 06:26:11
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/k097/lib/minimal/minimal.k,v 1.16 2000/06/15 07:38:36 takayama Exp $ */  /* $OpenXM: OpenXM/src/k097/lib/minimal/minimal.k,v 1.21 2000/08/01 03:42:35 takayama Exp $ */
 #define DEBUG 1  #define DEBUG 1
 /* #define ORDINARY 1 */  Sordinary = false;
 /* If you run this program on openxm version 1.1.2 (FreeBSD),  /* If you run this program on openxm version 1.1.2 (FreeBSD),
    make a symbolic link by the command     make a symbolic link by the command
    ln -s /usr/bin/cpp /lib/cpp     ln -s /usr/bin/cpp /lib/cpp
 */  */
 #define OFFSET 0  #define OFFSET 0
 #define TOTAL_STRATEGY 1  
 /* #define OFFSET 20*/  /* #define OFFSET 20*/
 /* Test sequences.  /* Test sequences.
    Use load["minimal.k"];;     Use load["minimal.k"];;
Line 35  def load_tower() {
Line 34  def load_tower() {
   if (Boundp("k0-tower.sm1.loaded")) {    if (Boundp("k0-tower.sm1.loaded")) {
   }else{    }else{
     sm1(" [(parse) (k0-tower.sm1) pushfile ] extension ");      sm1(" [(parse) (k0-tower.sm1) pushfile ] extension ");
       sm1(" [(parse) (new.sm1) pushfile ] extension ");
     sm1(" /k0-tower.sm1.loaded 1 def ");      sm1(" /k0-tower.sm1.loaded 1 def ");
   }    }
   sm1(" oxNoX ");    sm1(" oxNoX ");
Line 50  def Reverse(f) {
Line 50  def Reverse(f) {
 def Sgroebner(f) {  def Sgroebner(f) {
    sm1(" [f] groebner /FunctionValue set");     sm1(" [f] groebner /FunctionValue set");
 }  }
   
   def Sinvolutive(f,w) {
     local g,m;
     if (IsArray(f[0])) {
       m = NewArray(Length(f[0]));
     }else{
       m = [0];
     }
     g = Sgroebner(f);
     /* This is a temporary code. */
     sm1(" g 0 get { w m init_w<m>} map /FunctionValue set ");
   }
   
   
   
   def Error(s) {
     sm1(" s error ");
   }
   
   def IsNull(s) {
     if (Stag(s) == 0) return(true);
     else return(false);
   }
   
   def MonomialPart(f) {
     sm1(" [(lmonom) f] gbext /FunctionValue set ");
   }
   
   def Warning(s) {
     Print("Warning: ");
     Println(s);
   }
   def RingOf(f) {
     local r;
     if (IsPolynomial(f)) {
       if (f != Poly("0")) {
         sm1(f," (ring) dc /r set ");
       }else{
         sm1(" [(CurrentRingp)] system_variable /r set ");
       }
     }else{
       Warning("RingOf(f): the argument f must be a polynomial. Return the current ring.");
       sm1(" [(CurrentRingp)] system_variable /r set ");
     }
     return(r);
   }
   
   def Ord_w_m(f,w,m) {
     sm1(" f  w  m ord_w<m> { (universalNumber) dc } map /FunctionValue set ");
   }
   HelpAdd(["Ord_w_m",
   ["Ord_w_m(f,w,m) returns the order of f with respect to w with the shift m.",
    "Note that the order of the ring and the weight w must be the same.",
    "When f is zero, it returns -intInfinity = -999999999.",
    "Example:  Sweyl(\"x,y\",[[\"x\",-1,\"Dx\",1]]); ",
    "          Ord_w_m([x*Dx+1,Dx^2+x^5],[\"x\",-1,\"Dx\",1],[2,0]):"]]);
   
   def Init_w_m(f,w,m) {
     sm1(" f w m init_w<m> /FunctionValue set ");
   }
   HelpAdd(["Init_w_m",
   ["Init_w_m(f,w,m) returns the initial of f with respect to w with the shift m.",
    "Note that the order of the ring and the weight w must be the same.",
    "Example:  Sweyl(\"x,y\",[[\"x\",-1,\"Dx\",1]]); ",
    "          Init_w_m([x*Dx+1,Dx^2+x^5],[\"x\",-1,\"Dx\",1],[2,0]):"]]);
   
   def Max(v) {
     local i,t,n;
     n = Length(v);
     if (n == 0) return(null);
     t = v[0];
     for (i=0; i<n; i++) {
       if (v[i] > t) { t = v[i];}
     }
     return(t);
   }
   HelpAdd(["Max",
   ["Max(v) returns the maximal element in v."]]);
   
   /*  End of standard functions that should be moved to standard libraries. */
 def test0() {  def test0() {
   local f;    local f;
   Sweyl("x,y,z");    Sweyl("x,y,z");
Line 137  sm1(" [(AvoidTheSameRing)] pushEnv 
Line 217  sm1(" [(AvoidTheSameRing)] pushEnv 
   
 def SresolutionFrameWithTower(g,opt) {  def SresolutionFrameWithTower(g,opt) {
   local gbTower, ans, ff, count, startingGB, opts, skelton,withSkel, autof,    local gbTower, ans, ff, count, startingGB, opts, skelton,withSkel, autof,
         gbasis, nohomog;          gbasis, nohomog,i,n;
     /* extern Sordinary */
   nohomog = false;    nohomog = false;
   count = -1;    count = -1;  Sordinary = false; /* default value for options. */
   if (Length(Arglist) >= 2) {    if (Length(Arglist) >= 2) {
     if (IsInteger(opt)) {      if (IsArray(opt)) {
       count = opt;        n = Length(opt);
     }else if (IsString(opt)) {        for (i=0; i<n; i++) {
       if (opt == "homogenized") {          if (IsInteger(opt[i])) {
          nohomog = true;            count = opt[i];
       }else{          }
          Println("Warning: unknown option");          if (IsString(opt[i])) {
          Println(opt);            if (opt[i] == "homogenized") {
               nohomog = true;
             }else if (opt[i] == "Sordinary") {
               Sordinary = true;
             }else{
               Println("Warning: unknown option");
               Println(opt);
             }
           }
       }        }
       } else if (IsNull(opt)){
       } else {
         Println("Warning: option should be given by an array.");
         Println(opt);
         Println("--------------------------------------------");
     }      }
   }else{  
     count = -1;  
   }    }
   
   sm1(" setupEnvForResolution ");    sm1(" setupEnvForResolution ");
Line 315  def StotalDegree(f) {
Line 407  def StotalDegree(f) {
   return(d0);    return(d0);
 }  }
   
   HelpAdd(["Sord_w",
   ["Sord_w(f,w) returns the w-order of f",
    "Example: Sord_w(x^2*Dx*Dy,[x,-1,Dx,1]):"]]);
 /* Sord_w(x^2*Dx*Dy,[x,-1,Dx,1]); */  /* Sord_w(x^2*Dx*Dy,[x,-1,Dx,1]); */
 def Sord_w(f,w) {  def Sord_w(f,w) {
   local neww,i,n;    local neww,i,n;
Line 367  def Sdegree(f,tower,level) {
Line 462  def Sdegree(f,tower,level) {
   f = Init(f);    f = Init(f);
   if (level <= 1) return(StotalDegree(f));    if (level <= 1) return(StotalDegree(f));
   i = Degree(f,es);    i = Degree(f,es);
 #ifdef TOTAL_STRATEGY  
   return(StotalDegree(f)+Sdegree(tower[level-2,i],tower,level-1));    return(StotalDegree(f)+Sdegree(tower[level-2,i],tower,level-1));
 #endif  
   /* Strategy must be compatible with ordering.  */  
   /* Weight vector must be non-negative, too.  */  
   /* See Sdegree, SgenerateTable, reductionTable. */  
   wd = Sord_w(f,ww);  
   return(wd+Sdegree(tower[level-2,i],tower,level-1));  
   
 }  }
   
Line 520  def SlaScala(g,opt) {
Line 608  def SlaScala(g,opt) {
                   place = f[3];                    place = f[3];
                   /* (level-1, place) is the place for f[0],                    /* (level-1, place) is the place for f[0],
                      which is a newly obtained  GB. */                       which is a newly obtained  GB. */
 #ifdef ORDINARY  if (Sordinary) {
                   redundantTable[level-1,place] = redundant_seq;                    redundantTable[level-1,place] = redundant_seq;
                   redundant_seq++;                    redundant_seq++;
 #else  }else{
                   if (f[4] > f[5]) {                    if (f[4] > f[5]) {
                     /* Zero in the gr-module */                      /* Zero in the gr-module */
                     Print("v-degree of [org,remainder] = ");                      Print("v-degree of [org,remainder] = ");
Line 534  def SlaScala(g,opt) {
Line 622  def SlaScala(g,opt) {
                     redundantTable[level-1,place] = redundant_seq;                      redundantTable[level-1,place] = redundant_seq;
                     redundant_seq++;                      redundant_seq++;
                   }                    }
 #endif  }
                   redundantTable_ordinary[level-1,place]                    redundantTable_ordinary[level-1,place]
                      =redundant_seq_ordinary;                       =redundant_seq_ordinary;
                   redundant_seq_ordinary++;                    redundant_seq_ordinary++;
Line 660  def SunitOfFormat(pos,forms) {
Line 748  def SunitOfFormat(pos,forms) {
   return(ans);    return(ans);
 }  }
   
 def Error(s) {  
   sm1(" s error ");  
 }  
   
 def IsNull(s) {  
   if (Stag(s) == 0) return(true);  
   else return(false);  
 }  
   
 def StowerOf(tower,level) {  def StowerOf(tower,level) {
   local ans,i;    local ans,i;
   ans = [ ];    ans = [ ];
Line 689  def Sspolynomial(f,g) {
Line 769  def Sspolynomial(f,g) {
   sm1("f g spol /FunctionValue set");    sm1("f g spol /FunctionValue set");
 }  }
   
 def MonomialPart(f) {  
   sm1(" [(lmonom) f] gbext /FunctionValue set ");  
 }  
   
 /* WARNING:  /* WARNING:
   When you use SwhereInTower, you have to change gbList    When you use SwhereInTower, you have to change gbList
Line 812  def Sreduction(f,myset) {
Line 889  def Sreduction(f,myset) {
   return([tmp[0],tmp[1],t_syz]);    return([tmp[0],tmp[1],t_syz]);
 }  }
   
 def Warning(s) {  
   Print("Warning: ");  
   Println(s);  
 }  
 def RingOf(f) {  
   local r;  
   if (IsPolynomial(f)) {  
     if (f != Poly("0")) {  
       sm1(f," (ring) dc /r set ");  
     }else{  
       sm1(" [(CurrentRingp)] system_variable /r set ");  
     }  
   }else{  
     Warning("RingOf(f): the argument f must be a polynomial. Return the current ring.");  
     sm1(" [(CurrentRingp)] system_variable /r set ");  
   }  
   return(r);  
 }  
   
 def Sfrom_es(f,size) {  def Sfrom_es(f,size) {
   local c,ans, i, d, myes, myee, j,n,r,ans2;    local c,ans, i, d, myes, myee, j,n,r,ans2;
Line 888  def Sbases_to_vec(bases,size) {
Line 947  def Sbases_to_vec(bases,size) {
 }  }
   
 HelpAdd(["Sminimal",  HelpAdd(["Sminimal",
 ["It constructs the V-minimal free resolution by LaScala-Stillman's algorithm",  ["It constructs the V-minimal free resolution by LaScala's algorithm",
  "option: \"homogenized\" (no automatic homogenization ",   "option: \"homogenized\" (no automatic homogenization ",
    "      : \"Sordinary\"   (no (u,v)-minimal resolution)",
    "Options should be given as an array.",
  "Example:  Sweyl(\"x,y\",[[\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1]]);",   "Example:  Sweyl(\"x,y\",[[\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1]]);",
  "          v=[[2*x*Dx + 3*y*Dy+6, 0],",   "          v=[[2*x*Dx + 3*y*Dy+6, 0],",
  "             [3*x^2*Dy + 2*y*Dx, 0],",   "             [3*x^2*Dy + 2*y*Dx, 0],",
Line 908  def Sminimal(g,opt) {
Line 969  def Sminimal(g,opt) {
   if (Length(Arglist) < 2) {    if (Length(Arglist) < 2) {
      opt = null;       opt = null;
   }    }
     /* Sordinary is set in SlaScala(g,opt) --> SresolutionFrameWithTower */
   
   ScheckIfSchreyer("Sminimal:0");    ScheckIfSchreyer("Sminimal:0");
   r = SlaScala(g,opt);    r = SlaScala(g,opt);
   /* Should I turn off the tower?? */    /* Should I turn off the tower?? */
Line 1105  def Sannfs2(f) {
Line 1168  def Sannfs2(f) {
   local p,pp;    local p,pp;
   p = Sannfs(f,"x,y");    p = Sannfs(f,"x,y");
   sm1(" p 0 get { [(x) (y) (Dx) (Dy)] laplace0 } map /p set ");    sm1(" p 0 get { [(x) (y) (Dx) (Dy)] laplace0 } map /p set ");
 /*  
   Sweyl("x,y",[["x",1,"y",1,"Dx",1,"Dy",1,"h",1],  
                ["x",-1,"y",-1,"Dx",1,"Dy",1]]); */  
   /* Sweyl("x,y",[["x",1,"y",1,"Dx",1,"Dy",1,"h",1]]); */  
   
   Sweyl("x,y",[["x",-1,"y",-1,"Dx",1,"Dy",1]]);    Sweyl("x,y",[["x",-1,"y",-1,"Dx",1,"Dy",1]]);
   pp = Map(p,"Spoly");    pp = Map(p,"Spoly");
   return(Sminimal_v(pp));    return(Sminimal(pp));
   /* return(Sminimal(pp)); */  
 }  }
   
 HelpAdd(["Sannfs2",  HelpAdd(["Sannfs2",
 ["Sannfs2(f) constructs the V-minimal free resolution for the weight (-1,1)",  ["Sannfs2(f) constructs the V-minimal free resolution for the weight (-1,1)",
  "of the Laplace transform of the annihilating ideal of the polynomial f in x,y.",   "of the Laplace transform of the annihilating ideal of the polynomial f in x,y.",
  "See also Sminimal_v, Sannfs3.",   "See also Sminimal, Sannfs3.",
  "Example: a=Sannfs2(\"x^3-y^2\");",   "Example: a=Sannfs2(\"x^3-y^2\");",
  "         b=a[0]; sm1_pmat(b);",   "         b=a[0]; sm1_pmat(b);",
  "         b[1]*b[0]:",   "         b[1]*b[0]:",
Line 1127  HelpAdd(["Sannfs2",
Line 1184  HelpAdd(["Sannfs2",
  "         b=a[0]; sm1_pmat(b);",   "         b=a[0]; sm1_pmat(b);",
  "         b[1]*b[0]:"   "         b[1]*b[0]:"
 ]]);  ]]);
   /* Some samples.
     The betti numbers of most examples are 2,1. (0-th and 1-th).
     a=Sannfs2("x*y*(x+y-1)"); ==> The betti numbers are 3, 2.
     a=Sannfs2("x^3-y^2-x");
     a=Sannfs2("x*y*(x-y)");
   */
   
 /* Do not forget to turn on TOTAL_STRATEGY */  
 def Sannfs2_laScala(f) {  
   local p,pp;  
   p = Sannfs(f,"x,y");  
   /*   Do not make laplace transform.  
     sm1(" p 0 get { [(x) (y) (Dx) (Dy)] laplace0 } map /p set ");  
     p = [p];  
   */  
   Sweyl("x,y",[["x",-1,"y",-1,"Dx",1,"Dy",1]]);  
   pp = Map(p[0],"Spoly");  
   return(Sminimal(pp));  
 }  
   
 def Sannfs2_laScala2(f) {  
   local p,pp;  
   p = Sannfs(f,"x,y");  
   sm1(" p 0 get { [(x) (y) (Dx) (Dy)] laplace0 } map /p set ");  
   p = [p];  
   Sweyl("x,y",[["x",1,"y",1,"Dx",1,"Dy",1,"h",1],  
                ["x",-1,"y",-1,"Dx",1,"Dy",1]]);  
   pp = Map(p[0],"Spoly");  
   return(Sminimal(pp));  
 }  
   
 def Sannfs3(f) {  def Sannfs3(f) {
   local p,pp;    local p,pp;
   p = Sannfs(f,"x,y,z");    p = Sannfs(f,"x,y,z");
   sm1(" p 0 get { [(x) (y) (z) (Dx) (Dy) (Dz)] laplace0 } map /p set ");    sm1(" p 0 get { [(x) (y) (z) (Dx) (Dy) (Dz)] laplace0 } map /p set ");
   Sweyl("x,y,z",[["x",-1,"y",-1,"z",-1,"Dx",1,"Dy",1,"Dz",1]]);    Sweyl("x,y,z",[["x",-1,"y",-1,"z",-1,"Dx",1,"Dy",1,"Dz",1]]);
   pp = Map(p,"Spoly");    pp = Map(p,"Spoly");
   return(Sminimal_v(pp));    return(Sminimal(pp));
 }  }
   
 HelpAdd(["Sannfs3",  HelpAdd(["Sannfs3",
 ["Sannfs3(f) constructs the V-minimal free resolution for the weight (-1,1)",  ["Sannfs3(f) constructs the V-minimal free resolution for the weight (-1,1)",
  "of the Laplace transform of the annihilating ideal of the polynomial f in x,y,z.",   "of the Laplace transform of the annihilating ideal of the polynomial f in x,y,z.",
  "See also Sminimal_v, Sannfs2.",   "See also Sminimal, Sannfs2.",
  "Example: a=Sannfs3(\"x^3-y^2*z^2\");",   "Example: a=Sannfs3(\"x^3-y^2*z^2\");",
  "         b=a[0]; sm1_pmat(b);",   "         b=a[0]; sm1_pmat(b);",
  "         b[1]*b[0]: b[2]*b[1]:"]]);   "         b[1]*b[0]: b[2]*b[1]:"]]);
   
 /*  
   The betti numbers of most examples are 2,1. (0-th and 1-th).  
   a=Sannfs2("x*y*(x+y-1)"); ==> The betti numbers are 3, 2.  
   a=Sannfs2("x^3-y^2-x");    : it causes an error. It should be fixed.  
   a=Sannfs2("x*y*(x-y)");    : it causes an error. It should be fixed.  
   
 */  
   
 def Sannfs3_laScala2(f) {  
   local p,pp;  
   p = Sannfs(f,"x,y,z");  
   sm1(" p 0 get { [(x) (y) (z) (Dx) (Dy) (Dz)] laplace0 } map /p set ");  
   Sweyl("x,y,z",[["x",1,"y",1,"z",1,"Dx",1,"Dy",1,"Dz",1,"h",1],  
                  ["x",-1,"y",-1,"z",-1,"Dx",1,"Dy",1,"Dz",1]]);  
   pp = Map(p,"Spoly");  
   return(Sminimal(pp));  
 }  
   
   
 /*  The below does not use LaScala-Stillman's algorithm. */  
 def Sschreyer(g) {  
   local rf, tower, reductionTable, skel, redundantTable, bases,  
         strategy, maxOfStrategy, height, level, n, i,  
         freeRes,place, f, reducer,pos, redundant_seq,bettiTable,freeResV,ww,  
         redundantTable_ordinary, redundant_seq_ordinary,  
         reductionTable_tmp,c2,ii,nn, m,ii, jj, reducerBase;  
   /* extern WeightOfSweyl; */  
   ww = WeightOfSweyl;  
   Print("WeghtOfSweyl="); Println(WeightOfSweyl);  
   rf = SresolutionFrameWithTower(g);  
   redundant_seq = 1;   redundant_seq_ordinary = 1;  
   tower = rf[1];  
   Println("Generating reduction table which gives an order of reduction.");  
   Println("But, you are in Sschreyer...., you may not use LaScala-Stillman");  
   Print("WeghtOfSweyl="); Println(WeightOfSweyl);  
   Print("tower"); Println(tower);  
   reductionTable = SgenerateTable(tower);  
   skel = rf[2];  
   redundantTable = SnewArrayOfFormat(rf[1]);  
   redundantTable_ordinary = SnewArrayOfFormat(rf[1]);  
   reducer = SnewArrayOfFormat(rf[1]);  
   freeRes = SnewArrayOfFormat(rf[1]);  
   bettiTable = SsetBettiTable(rf[1],g);  
   
   height = Length(reductionTable);  
   for (level = 0; level < height; level++) {  
       n = Length(reductionTable[level]);  
       for (i=0; i<n; i++) {  
            Println([level,i]);  
            Print("Processing "); Print([level,i]);  
            if (level == 0) {  
              if (IsNull(redundantTable[level,i])) {  
                bases = freeRes[level];  
                /* Println(["At floor : GB=",i,bases,tower[0,i]]); */  
                pos = SwhereInGB(tower[0,i],rf[3,0]);  
                bases[i] = rf[3,0,pos];  
                /* redundantTable[level,i] = 0;  
                redundantTable_ordinary[level,i] = 0; */  
                freeRes[level] = bases;  
                /* Println(["GB=",i,bases,tower[0,i]]); */  
              }  
            }else{ /* level >= 1 */  
              if (IsNull(redundantTable[level,i])) {  
                bases = freeRes[level];  
                f = SpairAndReduction2(skel,level,i,freeRes,tower,  
                                       ww,redundantTable);  
                if (f[0] != Poly("0")) {  
                   place = f[3];  
                   /* (level-1, place) is the place for f[0],  
                      which is a newly obtained  GB. */  
 #ifdef ORDINARY  
                   redundantTable[level-1,place] = redundant_seq;  
                   redundant_seq++;  
 #else  
                   if (f[4] > f[5]) {  
                     /* Zero in the gr-module */  
                     Print("v-degree of [org,remainder] = ");  
                     Println([f[4],f[5]]);  
                     Print("[level,i] = "); Println([level,i]);  
                     redundantTable[level-1,place] = 0;  
                   }else{  
                     redundantTable[level-1,place] = redundant_seq;  
                     redundant_seq++;  
                   }  
 #endif  
                   redundantTable_ordinary[level-1,place]  
                      =redundant_seq_ordinary;  
                   redundant_seq_ordinary++;  
                   bases[i] = SunitOfFormat(place,f[1])-f[1];  /* syzygy */  
                   /* redundantTable[level,i] = 0;  
                   redundantTable_ordinary[level,i] = 0; */  
                   /* i must be equal to f[2], I think. Double check. */  
   
                   /* Correction Of Constant */  
                   /* Correction of syzygy */  
                   c2 = f[6];  /* or -f[6]?  Double check. */  
                   Print("c2="); Println(c2);  
                   nn = Length(bases);  
                   for (ii=0; ii<nn;ii++) {  
                      if ((ii != i) && (! IsNull(bases[ii]))) {  
                        m = Length(bases[ii]);  
                        for (jj=0; jj<m; jj++) {  
                          if (jj != place) {  
                            bases[ii,jj] = bases[ii,jj]*c2;  
                          }  
                        }  
                      }  
                   }  
   
                   Print("Old freeRes[level] = "); sm1_pmat(freeRes[level]);  
                   freeRes[level] = bases;  
                   Print("New freeRes[level] = "); sm1_pmat(freeRes[level]);  
   
                  /* Update the freeRes[level-1] */  
                   Print("Old freeRes[level-1] = "); sm1_pmat(freeRes[level-1]);  
                   bases = freeRes[level-1];  
                   bases[place] = f[0];  
                   freeRes[level-1] = bases;  
                   Print("New freeRes[level-1] = "); sm1_pmat(freeRes[level-1]);  
   
                   reducer[level-1,place] = f[1]-SunitOfFormat(place,f[1]);  
                    /* This reducer is different from that of SlaScala(). */  
   
                   reducerBasis = reducer[level-1];  
                   nn = Length(reducerBasis);  
                   for (ii=0; ii<nn;ii++) {  
                      if ((ii != place) && (! IsNull(reducerBasis[ii]))) {  
                        m = Length(reducerBasis[ii]);  
                        for (jj=0; jj<m; jj++) {  
                          if (jj != place) {  
                            reducerBasis[ii,jj] = reducerBasis[ii,jj]*c2;  
                          }  
                        }  
                      }  
                   }  
                   reducer[level-1] = reducerBasis;  
   
                }else{  
                   /* redundantTable[level,i] = 0; */  
                   bases = freeRes[level];  
                   bases[i] = f[1];  /* Put the syzygy. */  
                   freeRes[level] = bases;  
                }  
              }  /* end of level >= 1 */  
           }  
     } /* i loop */  
   
     /* Triangulate reducer */  
     if (level >= 1) {  
       Println(" ");  
       Print("Triangulating reducer at level "); Println(level-1);  
       Println("freeRes[level]="); sm1_pmat(freeRes[level]);  
       reducerBase = reducer[level-1];  
       Print("reducerBase=");  Println(reducerBase);  
       Println("Compare freeRes[level] and reducerBase (put -1)");  
       m = Length(reducerBase);  
       for (ii=m-1; ii>=0; ii--) {  
         if (!IsNull(reducerBase[ii])) {  
            for (jj=ii-1; jj>=0; jj--) {  
              if (!IsNull(reducerBase[jj])) {  
               if (!IsZero(reducerBase[jj,ii])) {  
                 /* reducerBase[ii,ii] should be always constant. */  
                 reducerBase[jj] = reducerBase[ii,ii]*reducerBase[jj]-reducerBase[jj,ii]*reducerBase[ii];  
               }  
              }  
            }  
          }  
        }  
        Println("New reducer");  
        sm1_pmat(reducerBase);  
        reducer[level-1] = reducerBase;  
     }  
   
   } /* level loop */  
   n = Length(freeRes);  
   freeResV = SnewArrayOfFormat(freeRes);  
   for (i=0; i<n; i++) {  
     bases = freeRes[i];  
     bases = Sbases_to_vec(bases,bettiTable[i]);  
     freeResV[i] = bases;  
   }  
   
   /* Mark the non-redundant elements. */  
   for (i=0; i<n; i++) {  
     m = Length(redundantTable[i]);  
     for (jj=0; jj<m; jj++) {  
       if (IsNull(redundantTable[i,jj])) {  
         redundantTable[i,jj] = 0;  
       }  
     }  
   }  
   
   
   return([freeResV, redundantTable,reducer,bettiTable,redundantTable_ordinary]);  
 }  
   
 def SpairAndReduction2(skel,level,ii,freeRes,tower,ww,redundantTable) {  
   local i, j, myindex, p, bases, tower2, gi, gj,  
        si, sj, tmp, t_syz, pos, ans, ssp, syzHead,pos2,  
        vdeg,vdeg_reduced,n,c2;  
   Println("SpairAndReduction2 : -------------------------");  
   
   if (level < 1) Error("level should be >= 1 in SpairAndReduction.");  
   p = skel[level,ii];  
   myindex = p[0];  
   i = myindex[0]; j = myindex[1];  
   bases = freeRes[level-1];  
   Println(["p and bases ",p,bases]);  
   if (IsNull(bases[i]) || IsNull(bases[j])) {  
     Println([level,i,j,bases[i],bases[j]]);  
     Error("level, i, j : bases[i], bases[j]  must not be NULL.");  
   }  
   
   tower2 = StowerOf(tower,level-1);  
   SsetTower(tower2);  
   Println(["level=",level]);  
   Println(["tower2=",tower2]);  
   /** sm1(" show_ring ");   */  
   
   gi = Stoes_vec(bases[i]);  
   gj = Stoes_vec(bases[j]);  
   
   ssp = Sspolynomial(gi,gj);  
   si = ssp[0,0];  
   sj = ssp[0,1];  
   syzHead = si*es^i;  
   /* This will be the head term, I think. But, double check. */  
   Println([si*es^i,sj*es^j]);  
   
   Print("[gi, gj] = "); Println([gi,gj]);  
   sm1(" [(Homogenize)] system_variable message ");  
   Print("Reduce the element "); Println(si*gi+sj*gj);  
   Print("by  "); Println(bases);  
   
   tmp = Sreduction(si*gi+sj*gj, bases);  
   
   Print("result is "); Println(tmp);  
   if (!IsZero(tmp[0])) {  
     Print("Error: base = ");  
     Println(Map(bases,"Stoes_vec"));  
     Error("SpairAndReduction2: the remainder should be zero. See tmp. tower2. show_ring.");  
   }  
   t_syz = tmp[2];  
   si = si*tmp[1]+t_syz[i];  
   sj = sj*tmp[1]+t_syz[j];  
   t_syz[i] = si;  
   t_syz[j] = sj;  
   
   c2 = null;  
   /* tmp[0] must be zero */  
   n = Length(t_syz);  
   for (i=0; i<n; i++) {  
      if (IsConstant(t_syz[i])){  
       if (!IsZero(t_syz[i])) {  
        if (IsNull(redundantTable[level-1,i])) {  
          /* i must equal to pos2 below. */  
          c2 = -t_syz[i];  
          tmp[0] = c2*Stoes_vec(freeRes[level-1,i]);  
          t_syz[i] = 0;  
          /* tmp[0] = t_syz . g */  
          /* break; does not work. Use */  
          i = n;  
        }  
       }  
      }  
   }  
   
   /* This is essential part for V-minimal resolution. */  
   /* vdeg = SvDegree(si*gi+sj*gj,tower,level-1,ww); */  
   vdeg = SvDegree(si*gi,tower,level-1,ww);  
   vdeg_reduced = SvDegree(tmp[0],tower,level-1,ww);  
   Print("vdegree of the original = "); Println(vdeg);  
   Print("vdegree of the remainder = "); Println(vdeg_reduced);  
   
   if (!IsNull(vdeg_reduced)) {  
     if (vdeg_reduced < vdeg) {  
       Println("--- Special in V-minimal!");  
       Println(tmp[0]);  
       Println("syzygy="); sm1_pmat(t_syz);  
       Print("[vdeg, vdeg_reduced] = "); Println([vdeg,vdeg_reduced]);  
     }  
   }  
   
   SsetTower(StowerOf(tower,level));  
   pos = SwhereInTower(syzHead,tower[level]);  
   
   SsetTower(StowerOf(tower,level-1));  
   pos2 = SwhereInTower(tmp[0],tower[level-1]);  
   ans = [tmp[0],t_syz,pos,pos2,vdeg,vdeg_reduced,c2];  
   /* pos is the place to put syzygy at level. */  
   /* pos2 is the place to put a new GB at level-1. */  
   Println(ans);  
   Println("--- end of SpairAndReduction2  ");  
   return(ans);  
 }  
   
 HelpAdd(["Sminimal_v",  
 ["It constructs the V-minimal free resolution from the Schreyer resolution",  
  "step by step.",  
  "This code still contains bugs. It sometimes outputs wrong answer.",  
  "Example:   Sweyl(\"x,y\",[[\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1]]);",  
  "          v=[[2*x*Dx + 3*y*Dy+6, 0],",  
  "             [3*x^2*Dy + 2*y*Dx, 0],",  
  "             [0,  x^2+y^2],",  
  "             [0,  x*y]];",  
  "         a=Sminimal_v(v);",  
  "         sm1_pmat(a[0]); b=a[0]; b[1]*b[0]:",  
  "Note:  a[0] is the V-minimal resolution. a[3] is the Schreyer resolution."]]);  
   
 /* This code still contains bugs. It sometimes outputs wrong answer. */  
 /* See test12() in minimal-test.k.  */  
 /* There may be remaining 1, too */  
 def Sminimal_v(g) {  
   local r, freeRes, redundantTable, reducer, maxLevel,  
         minRes, seq, maxSeq, level, betti, q, bases, dr,  
         betti_levelplus, newbases, i, j,qq,tminRes;  
   r = Sschreyer(g);  
   sm1_pmat(r);  
   Debug_Sminimal_v = r;  
   Println(" Return value of Schreyer(g) is set to Debug_Sminimal_v");  
   /* Should I turn off the tower?? */  
   freeRes = r[0];  
   redundantTable = r[1];  
   reducer = r[2];  
   minRes = SnewArrayOfFormat(freeRes);  
   seq = 0;  
   maxSeq = SgetMaxSeq(redundantTable);  
   maxLevel = Length(freeRes);  
   for (level = 0; level < maxLevel; level++) {  
     minRes[level] = freeRes[level];  
   }  
   for (level = 0; level < maxLevel; level++) {  
       betti = Length(freeRes[level]);  
       for (q = betti-1; q>=0; q--) {  
         if (redundantTable[level,q] > 0) {  
           Print("[seq,level,q]="); Println([seq,level,q]);  
           if (level < maxLevel-1) {  
             bases = freeRes[level+1];  
             dr = reducer[level,q];  
             /* dr[q] = -1;  We do not need this in our reducer format. */  
             /* dr[q] should be a non-zero constant. */  
             newbases = SnewArrayOfFormat(bases);  
             betti_levelplus = Length(bases);  
             /*  
                bases[i,j] ---> bases[i,j]+bases[i,q]*dr[j]  
             */  
             for (i=0; i<betti_levelplus; i++) {  
               newbases[i] = dr[q]*bases[i] - bases[i,q]*dr;  
             }  
             Println(["level, q =", level,q]);  
             Println("bases="); sm1_pmat(bases);  
             Println("dr="); sm1_pmat(dr);  
             Println("newbases="); sm1_pmat(newbases);  
             minRes[level+1] = newbases;  
             freeRes = minRes;  
 #ifdef DEBUG  
             for (qq=q; qq<betti; qq++) {  
                 for (i=0; i<betti_levelplus; i++) {  
                   if ((!IsZero(newbases[i,qq])) && (redundantTable[level,qq] >0)) {  
                     Println(["[i,qq]=",[i,qq]," is not zero in newbases."]);  
                     Print("redundantTable ="); sm1_pmat(redundantTable[level]);  
                     Error("Stop in Sminimal for debugging.");  
                   }  
                 }  
             }  
 #endif  
           }  
         }  
       }  
    }  
    tminRes = Stetris(minRes,redundantTable);  
    return([SpruneZeroRow(tminRes), tminRes,  
           [ minRes, redundantTable, reducer,r[3],r[4]],r[0]]);  
   /* r[4] is the redundantTable_ordinary */  
   /* r[0] is the freeResolution */  
 }  
   
 /* Sannfs2("x*y*(x-y)*(x+y)"); is a test problem */  /* Sannfs2("x*y*(x-y)*(x+y)"); is a test problem */
 /* x y (x+y-1)(x-2),  x^3-y^2, x^3 - y^2 z^2,  /* x y (x+y-1)(x-2),  x^3-y^2, x^3 - y^2 z^2,
    x y z (x+y+z-1) seems to be interesting, because the first syzygy     x y z (x+y+z-1) seems to be interesting, because the first syzygy
Line 1688  def Skernel(m,v) {
Line 1353  def Skernel(m,v) {
   sm1(" [ m v ] syz /FunctionValue set ");    sm1(" [ m v ] syz /FunctionValue set ");
 }  }
   
 def test3() {  
   local a1,a2,b1,b2;  
   a1 = Sannfs3("x^3-y^2*z^2");  
   a1 = a1[0];  
   a2 = Sannfs3_laScala2("x^3-y^2*z^2");  
   a2 = a2[0];  
   b1 = a1[1];  
   b2 = a2[1];  
   sm1_pmat(b2);  
   Println("  OVER ");  
   sm1_pmat(b1);  
   return([sm1_res_div(b2,b1,["x","y","z"]),b2,b1,a2,a1]);  
 }  
   
 def test4() {  
   local a,b;  
   a = Sannfs3_laScala2("x^3-y^2*z^2");  
   b = a[0];  
   sm1_pmat( sm1_res_kernel_image(b[0],b[1],[x,y,z]));  
   sm1_pmat( sm1_res_kernel_image(b[1],b[2],[x,y,z]));  
   return(a);  
 }  
   
 def sm1_gb(f,v) {  def sm1_gb(f,v) {
   f =ToString_array(f);    f =ToString_array(f);
   v = ToString_array(v);    v = ToString_array(v);
Line 1751  HelpAdd(["IsExact_h",
Line 1394  HelpAdd(["IsExact_h",
  "cf. ReParse"   "cf. ReParse"
 ]]);  ]]);
   
   def IsSameIdeal_h(ii,jj,v) {
     local a;
     v = ToString_array(v);
     a = [ii,jj,v];
     sm1(a," isSameIdeal_h /FunctionValue set ");
   }
   HelpAdd(["IsSameIdeal_h",
   ["IsSameIdeal_h(ii,jj,var): bool",
    "It checks the given ideals are the same or not in D<h> (homogenized Weyl algebra)",
    "cf. ReParse"
   ]]);
   
 def ReParse(a) {  def ReParse(a) {
   local c;    local c;
   if (IsArray(a)) {    if (IsArray(a)) {
Line 1790  def ScheckIfSchreyer(s) {
Line 1445  def ScheckIfSchreyer(s) {
   }    }
   /* More check will be necessary. */    /* More check will be necessary. */
   return(true);    return(true);
 }  
   
   }
   
   def SgetShift(mat,w,m) {
     local omat;
     sm1(" mat { w m ord_w<m> {(universalNumber) dc}map } map /omat set");
     return(Map(omat,"Max"));
   }
   HelpAdd(["SgetShift",
   ["SgetShift(mat,w,m) returns the shift vector of mat with respect to w with the shift m.",
    "Note that the order of the ring and the weight w must be the same.",
    "Example:  Sweyl(\"x,y\",[[\"x\",-1,\"Dx\",1]]); ",
    "          SgetShift([[x*Dx+1,Dx^2+x^5],[Poly(\"0\"),x],[x,x]],[\"x\",-1,\"Dx\",1],[2,0]):"]]);
   
   def SgetShifts(resmat,w) {
     local i,n,ans,m0;
     n = Length(resmat);
     ans = NewArray(n);
     m0 = NewArray(Length(resmat[0,0]));
     ans[0] = m0;
     for (i=0; i<n-1; i++) {
       ans[i+1] = SgetShift(resmat[i],w,m0);
       m0 = ans[i+1];
     }
     return(ans);
   }
   HelpAdd(["SgetShifts",
   ["SgetShifts(resmat,w) returns the shift vectors of the resolution resmat",
    " with respect to w with the shift m.",
    "Note that the order of the ring and the weight w must be the same.",
    "Zero row is not allowed.",
    "Example:   a=Sannfs2(\"x^3-y^2\");",
    "           b=a[0]; w = [\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1];",
    "           Sweyl(\"x,y\",[w]); b = Reparse(b);",
    "           SgetShifts(b,w):"]]);
   
   def Sinit_w(resmat,w) {
     local shifts,ans,n,i,m,mat,j;
     shifts = SgetShifts(resmat,w);
     n = Length(resmat);
     ans = NewArray(n);
     for (i=0; i<n; i++) {
       m = shifts[i];
       mat = ScopyArray(resmat[i]);
       for (j=0; j<Length(mat); j++) {
         mat[j] = Init_w_m(mat[j],w,m);
       }
       ans[i] = mat;
     }
     return(ans);
   }
   HelpAdd(["Sinit_w",
   ["Sinit_w(resmat,w) returns the initial of the complex resmat with respect to the weight w.",
    "Example:   a=Sannfs2(\"x^3-y^2\");",
    "           b=a[0]; w = [\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1];",
    "           Sweyl(\"x,y\",[w]); b = Reparse(b);",
    "           c=Sinit_w(b,w); c:"
   ]]);
   

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.22

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>