[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.1 and 1.16

version 1.1, 2000/05/03 06:42:07 version 1.16, 2000/06/15 07:38:36
Line 1 
Line 1 
 /* $OpenXM$ */  /* $OpenXM: OpenXM/src/k097/lib/minimal/minimal.k,v 1.15 2000/06/14 07:44:05 takayama Exp $ */
 #define DEBUG 1  #define DEBUG 1
 /* #define ORDINARY 1 */  /* #define ORDINARY 1 */
   /* If you run this program on openxm version 1.1.2 (FreeBSD),
      make a symbolic link by the command
      ln -s /usr/bin/cpp /lib/cpp
   */
   #define OFFSET 0
   #define TOTAL_STRATEGY 1
   /* #define OFFSET 20*/
 /* Test sequences.  /* Test sequences.
    Use load["minimal.k"];;     Use load["minimal.k"];;
   
Line 30  def load_tower() {
Line 37  def load_tower() {
     sm1(" [(parse) (k0-tower.sm1) pushfile ] extension ");      sm1(" [(parse) (k0-tower.sm1) pushfile ] extension ");
     sm1(" /k0-tower.sm1.loaded 1 def ");      sm1(" /k0-tower.sm1.loaded 1 def ");
   }    }
     sm1(" oxNoX ");
 }  }
 load_tower();  load_tower();
 SonAutoReduce = true;  SonAutoReduce = true;
Line 124  sm1(" [(AvoidTheSameRing)] pushEnv 
Line 132  sm1(" [(AvoidTheSameRing)] pushEnv 
       [ [(AvoidTheSameRing) 0] system_variable        [ [(AvoidTheSameRing) 0] system_variable
         [(gbListTower) tower (list) dc] system_variable          [(gbListTower) tower (list) dc] system_variable
       ] pop popEnv ");        ] pop popEnv ");
         /* sm1("(hoge) message show_ring "); */
 }  }
   
 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;          gbasis, nohomog;
     nohomog = false;
     count = -1;
   if (Length(Arglist) >= 2) {    if (Length(Arglist) >= 2) {
     if (IsInteger(opt)) count = opt;      if (IsInteger(opt)) {
         count = opt;
       }else if (IsString(opt)) {
         if (opt == "homogenized") {
            nohomog = true;
         }else{
            Println("Warning: unknown option");
            Println(opt);
         }
       }
   }else{    }else{
     count = -1;      count = -1;
   }    }
Line 144  def SresolutionFrameWithTower(g,opt) {
Line 164  def SresolutionFrameWithTower(g,opt) {
   */    */
   
   sm1(" (mmLarger) (matrix) switch_function ");    sm1(" (mmLarger) (matrix) switch_function ");
   g = Map(g,"Shomogenize");    if (! nohomog) {
       Println("Automatic homogenization.");
       g = Map(g,"Shomogenize");
     }else{
       Println("No automatic homogenization.");
     }
   if (SonAutoReduce) {    if (SonAutoReduce) {
     sm1("[ (AutoReduce) ] system_variable /autof set ");      sm1("[ (AutoReduce) ] system_variable /autof set ");
     sm1("[ (AutoReduce) 1 ] system_variable ");      sm1("[ (AutoReduce) 1 ] system_variable ");
Line 184  def SresolutionFrameWithTower(g,opt) {
Line 209  def SresolutionFrameWithTower(g,opt) {
 }  }
 HelpAdd(["SresolutionFrameWithTower",  HelpAdd(["SresolutionFrameWithTower",
 ["It returs [resolution of the initial, gbTower, skelton, gbasis]",  ["It returs [resolution of the initial, gbTower, skelton, gbasis]",
    "option: \"homogenized\" (no automatic homogenization) ",
  "Example: Sweyl(\"x,y\");",   "Example: Sweyl(\"x,y\");",
  "         a=SresolutionFrameWithTower([x^3,x*y,y^3-1]);"]]);   "         a=SresolutionFrameWithTower([x^3,x*y,y^3-1]);"]]);
   
 def SresolutionFrame(f,opt) {  def SresolutionFrame(f,opt) {
   local ans;    local ans;
   ans = SresolutionFrameWithTower(f);    ans = SresolutionFrameWithTower(f,opt);
   return(ans[0]);    return(ans[0]);
 }  }
 /* ---------------------------- */  /* ---------------------------- */
Line 283  def Sres0FrameWithSkelton(g) {
Line 309  def Sres0FrameWithSkelton(g) {
   
   
 def StotalDegree(f) {  def StotalDegree(f) {
   sm1(" [(grade) f] gbext (universalNumber) dc /FunctionValue set ");    local d0;
     sm1(" [(grade) f] gbext (universalNumber) dc /d0 set ");
     /* Print("degree of "); Print(f); Print(" is "); Println(d0); */
     return(d0);
 }  }
   
 /* Sord_w(x^2*Dx*Dy,[x,-1,Dx,1]); */  /* Sord_w(x^2*Dx*Dy,[x,-1,Dx,1]); */
Line 332  def test_SinitOfArray() {
Line 361  def test_SinitOfArray() {
   
 /* f is assumed to be a monomial with toes. */  /* f is assumed to be a monomial with toes. */
 def Sdegree(f,tower,level) {  def Sdegree(f,tower,level) {
   local i;    local i,ww, wd;
     /* extern WeightOfSweyl; */
     ww = WeightOfSweyl;
     f = Init(f);
   if (level <= 1) return(StotalDegree(f));    if (level <= 1) return(StotalDegree(f));
   i = Degree(f,es);    i = Degree(f,es);
   return(StotalDegree(f)+Sdegree(tower[level-2,i],tower,level-1));  #ifdef TOTAL_STRATEGY
     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));
   
 }  }
   
 def SgenerateTable(tower) {  def SgenerateTable(tower) {
   local height, n,i,j, ans, ans_at_each_floor;    local height, n,i,j, ans, ans_at_each_floor;
   
     /*
     Print("SgenerateTable: tower=");Println(tower);
     sm1(" print_switch_status "); */
   height = Length(tower);    height = Length(tower);
   ans = NewArray(height);    ans = NewArray(height);
   for (i=0; i<height; i++) {    for (i=0; i<height; i++) {
     n = Length(tower[i]);      n = Length(tower[i]);
     ans_at_each_floor=NewArray(n);      ans_at_each_floor=NewArray(n);
     for (j=0; j<n; j++) {      for (j=0; j<n; j++) {
       ans_at_each_floor[j] = Sdegree(tower[i,j],tower,i+1)-(i+1);        ans_at_each_floor[j] = Sdegree(tower[i,j],tower,i+1)-(i+1)
                               + OFFSET;
       /* Println([i,j,ans_at_each_floor[j]]); */        /* Println([i,j,ans_at_each_floor[j]]); */
     }      }
     ans[i] = ans_at_each_floor;      ans[i] = ans_at_each_floor;
Line 367  def SnewArrayOfFormat(p) {
Line 412  def SnewArrayOfFormat(p) {
      return(null);       return(null);
   }    }
 }  }
   def ScopyArray(a) {
     local n, i,ans;
     n = Length(a);
     ans = NewArray(n);
     for (i=0; i<n; i++) {
       ans[i] = a[i];
     }
     return(ans);
   }
 def SminOfStrategy(a) {  def SminOfStrategy(a) {
   local n,i,ans,tt;    local n,i,ans,tt;
   ans = 100000; /* very big number */    ans = 100000; /* very big number */
Line 405  def SmaxOfStrategy(a) {
Line 459  def SmaxOfStrategy(a) {
 }  }
   
   
 def SlaScala(g) {  def SlaScala(g,opt) {
   local rf, tower, reductionTable, skel, redundantTable, bases,    local rf, tower, reductionTable, skel, redundantTable, bases,
         strategy, maxOfStrategy, height, level, n, i,          strategy, maxOfStrategy, height, level, n, i,
         freeRes,place, f, reducer,pos, redundant_seq,bettiTable,freeResV,ww,          freeRes,place, f, reducer,pos, redundant_seq,bettiTable,freeResV,ww,
         redundantTable_ordinary, redundant_seq_ordinary;          redundantTable_ordinary, redundant_seq_ordinary,
           reductionTable_tmp;
   /* extern WeightOfSweyl; */    /* extern WeightOfSweyl; */
   ww = WeightOfSweyl;    ww = WeightOfSweyl;
   Print("WeghtOfSweyl="); Println(WeightOfSweyl);    Print("WeightOfSweyl="); Println(WeightOfSweyl);
   rf = SresolutionFrameWithTower(g);    rf = SresolutionFrameWithTower(g,opt);
     Print("rf="); sm1_pmat(rf);
   redundant_seq = 1;   redundant_seq_ordinary = 1;    redundant_seq = 1;   redundant_seq_ordinary = 1;
   tower = rf[1];    tower = rf[1];
   
     Println("Generating reduction table which gives an order of reduction.");
     Print("WeghtOfSweyl="); Println(WeightOfSweyl);
     Print("tower"); Println(tower);
   reductionTable = SgenerateTable(tower);    reductionTable = SgenerateTable(tower);
     Print("reductionTable="); sm1_pmat(reductionTable);
   
   skel = rf[2];    skel = rf[2];
   redundantTable = SnewArrayOfFormat(rf[1]);    redundantTable = SnewArrayOfFormat(rf[1]);
   redundantTable_ordinary = SnewArrayOfFormat(rf[1]);    redundantTable_ordinary = SnewArrayOfFormat(rf[1]);
Line 430  def SlaScala(g) {
Line 492  def SlaScala(g) {
   while (strategy <= maxOfStrategy) {    while (strategy <= maxOfStrategy) {
     for (level = 0; level < height; level++) {      for (level = 0; level < height; level++) {
       n = Length(reductionTable[level]);        n = Length(reductionTable[level]);
       for (i=0; i<n; i++) {        reductionTable_tmp = ScopyArray(reductionTable[level]);
         while (SthereIs(reductionTable_tmp,strategy)) {
           i = SnextI(reductionTable_tmp,strategy,redundantTable,
                      skel,level,freeRes);
           Println([level,i]);
           reductionTable_tmp[i] = -200000;
         if (reductionTable[level,i] == strategy) {          if (reductionTable[level,i] == strategy) {
            Print("Processing "); Print([level,i]);             Print("Processing [level,i]= "); Print([level,i]);
            Print("   Strategy = "); Println(strategy);             Print("   Strategy = "); Println(strategy);
            if (level == 0) {             if (level == 0) {
              if (IsNull(redundantTable[level,i])) {               if (IsNull(redundantTable[level,i])) {
Line 503  def SlaScala(g) {
Line 570  def SlaScala(g) {
   return([freeResV, redundantTable,reducer,bettiTable,redundantTable_ordinary]);    return([freeResV, redundantTable,reducer,bettiTable,redundantTable_ordinary]);
 }  }
   
   def SthereIs(reductionTable_tmp,strategy) {
     local n,i;
     n = Length(reductionTable_tmp);
     for (i=0; i<n; i++) {
       if (reductionTable_tmp[i] == strategy) {
         return(true);
       }
     }
     return(false);
   }
   
   def SnextI(reductionTable_tmp,strategy,redundantTable,
                                     skel,level,freeRes)
   {
      local ii,n,p,myindex,i,j,bases;
      n = Length(reductionTable_tmp);
      if (level == 0) {
        for (ii=0; ii<n; ii++) {
          if (reductionTable_tmp[ii] == strategy) {
             return(ii);
           }
         }
      }else{
        for (ii=0; ii<n; ii++) {
          if (reductionTable_tmp[ii] == strategy) {
            p = skel[level,ii];
            myindex = p[0];
            i = myindex[0]; j = myindex[1];
            bases = freeRes[level-1];
            if (IsNull(bases[i]) || IsNull(bases[j])) {
   
            }else{
              return(ii);
            }
          }
        }
      }
      Print("reductionTable_tmp=");
      Println(reductionTable_tmp);
      Println("See also reductionTable, strategy, level,i");
      Error("SnextI: bases[i] or bases[j] is null for all combinations.");
   }
   
   
   
 def SsetBettiTable(freeRes,g) {  def SsetBettiTable(freeRes,g) {
   local level,i, n,bases,ans;    local level,i, n,bases,ans;
   ans = NewArray(Length(freeRes)+1);    ans = NewArray(Length(freeRes)+1);
Line 581  def MonomialPart(f) {
Line 693  def MonomialPart(f) {
   sm1(" [(lmonom) f] gbext /FunctionValue set ");    sm1(" [(lmonom) f] gbext /FunctionValue set ");
 }  }
   
   /* WARNING:
     When you use SwhereInTower, you have to change gbList
     as below. Ofcourse, you should restrore the gbList
     SsetTower(StowerOf(tower,level));
     pos = SwhereInTower(syzHead,tower[level]);
   */
 def SwhereInTower(f,tower) {  def SwhereInTower(f,tower) {
   local i,n,p,q;    local i,n,p,q;
   if (f == Poly("0")) return(-1);    if (f == Poly("0")) return(-1);
Line 617  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
Line 735  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
   
   tower2 = StowerOf(tower,level-1);    tower2 = StowerOf(tower,level-1);
   SsetTower(tower2);    SsetTower(tower2);
     Println(["level=",level]);
     Println(["tower2=",tower2]);
   /** sm1(" show_ring ");   */    /** sm1(" show_ring ");   */
   
   gi = Stoes_vec(bases[i]);    gi = Stoes_vec(bases[i]);
Line 638  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
Line 758  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
   
   Print("result is "); Println(tmp);    Print("result is "); Println(tmp);
   
   vdeg = SvDegree(si*gi+sj*gj,tower,level-1,ww);    /* 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);    vdeg_reduced = SvDegree(tmp[0],tower,level-1,ww);
   Print("vdegree of the original = "); Println(vdeg);    Print("vdegree of the original = "); Println(vdeg);
   Print("vdegree of the remainder = "); Println(vdeg_reduced);    Print("vdegree of the remainder = "); Println(vdeg_reduced);
Line 648  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
Line 770  def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 
   sj = sj*tmp[1]+t_syz[j];    sj = sj*tmp[1]+t_syz[j];
   t_syz[i] = si;    t_syz[i] = si;
   t_syz[j] = sj;    t_syz[j] = sj;
   
     SsetTower(StowerOf(tower,level));
   pos = SwhereInTower(syzHead,tower[level]);    pos = SwhereInTower(syzHead,tower[level]);
   
     SsetTower(StowerOf(tower,level-1));
   pos2 = SwhereInTower(tmp[0],tower[level-1]);    pos2 = SwhereInTower(tmp[0],tower[level-1]);
   ans = [tmp[0],t_syz,pos,pos2,vdeg,vdeg_reduced];    ans = [tmp[0],t_syz,pos,pos2,vdeg,vdeg_reduced];
   /* pos is the place to put syzygy at level. */    /* pos is the place to put syzygy at level. */
Line 761  def Sbases_to_vec(bases,size) {
Line 887  def Sbases_to_vec(bases,size) {
   return(newbases);    return(newbases);
 }  }
   
 def Sminimal(g) {  HelpAdd(["Sminimal",
   ["It constructs the V-minimal free resolution by LaScala-Stillman's algorithm",
    "option: \"homogenized\" (no automatic homogenization ",
    "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);",
    "         Sweyl(\"x,y\",[[\"x\",-1,\"y\",-1,\"Dx\",1,\"Dy\",1]]);",
    "         b = ReParse(a[0]); sm1_pmat(b); ",
    "         IsExact_h(b,[x,y]):",
    "Note:  a[0] is the V-minimal resolution. a[3] is the Schreyer resolution."]]);
   
   def Sminimal(g,opt) {
   local r, freeRes, redundantTable, reducer, maxLevel,    local r, freeRes, redundantTable, reducer, maxLevel,
         minRes, seq, maxSeq, level, betti, q, bases, dr,          minRes, seq, maxSeq, level, betti, q, bases, dr,
         betti_levelplus, newbases, i, j,qq;          betti_levelplus, newbases, i, j,qq, tminRes;
   r = SlaScala(g);    if (Length(Arglist) < 2) {
        opt = null;
     }
     ScheckIfSchreyer("Sminimal:0");
     r = SlaScala(g,opt);
   /* Should I turn off the tower?? */    /* Should I turn off the tower?? */
     ScheckIfSchreyer("Sminimal:1");
   freeRes = r[0];    freeRes = r[0];
   redundantTable = r[1];    redundantTable = r[1];
   reducer = r[2];    reducer = r[2];
Line 822  def Sminimal(g) {
Line 967  def Sminimal(g) {
       }        }
     }      }
    }     }
    return([Stetris(minRes,redundantTable),     tminRes = Stetris(minRes,redundantTable);
           [ minRes, redundantTable, reducer,r[3],r[4]]]);     return([SpruneZeroRow(tminRes), tminRes,
             [ minRes, redundantTable, reducer,r[3],r[4]],r[0]]);
   /* r[4] is the redundantTable_ordinary */    /* r[4] is the redundantTable_ordinary */
     /* r[0] is the freeResolution */
 }  }
   
   
Line 933  In(20)=SvDegree(x,tt,2,ww):
Line 1080  In(20)=SvDegree(x,tt,2,ww):
 def SvDegree(f,tower,level,w) {  def SvDegree(f,tower,level,w) {
   local i,ans;    local i,ans;
   if (IsZero(f)) return(null);    if (IsZero(f)) return(null);
     f = Init(f);
   if (level <= 0) {    if (level <= 0) {
     return(Sord_w(f,w));      return(Sord_w(f,w));
   }    }
Line 942  def SvDegree(f,tower,level,w) {
Line 1090  def SvDegree(f,tower,level,w) {
   return(ans);    return(ans);
 }  }
   
   def Sannfs(f,v) {
     local f2;
     f2 = ToString(f);
     if (IsArray(v)) {
        v = Map(v,"ToString");
     }
     sm1(" [f2 v] annfs /FunctionValue set ");
   }
   
   /* Sannfs2("x^3-y^2"); */
   def Sannfs2(f) {
     local p,pp;
     p = Sannfs(f,"x,y");
     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]]);
     pp = Map(p,"Spoly");
     return(Sminimal_v(pp));
     /* return(Sminimal(pp)); */
   }
   
   HelpAdd(["Sannfs2",
   ["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.",
    "See also Sminimal_v, Sannfs3.",
    "Example: a=Sannfs2(\"x^3-y^2\");",
    "         b=a[0]; sm1_pmat(b);",
    "         b[1]*b[0]:",
    "Example: a=Sannfs2(\"x*y*(x-y)*(x+y)\");",
    "         b=a[0]; sm1_pmat(b);",
    "         b[1]*b[0]:"
   ]]);
   
   /* 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) {
     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]]);
     pp = Map(p,"Spoly");
     return(Sminimal_v(pp));
   }
   
   HelpAdd(["Sannfs3",
   ["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.",
    "See also Sminimal_v, Sannfs2.",
    "Example: a=Sannfs3(\"x^3-y^2*z^2\");",
    "         b=a[0]; sm1_pmat(b);",
    "         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 */
   /* 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
     contains 1.
   */
   
   def CopyArray(m) {
     local ans,i,n;
     if (IsArray(m)) {
        n = Length(m);
        ans = NewArray(n);
        for (i=0; i<n; i++) {
          ans[i] = CopyArray(m[i]);
        }
        return(ans);
     }else{
        return(m);
     }
   }
   HelpAdd(["CopyArray",
   ["It duplicates the argument array recursively.",
    "Example: m=[1,[2,3]];",
    "         a=CopyArray(m); a[1] = \"Hello\";",
    "         Println(m); Println(a);"]]);
   
   def IsZeroVector(m) {
     local n,i;
     n = Length(m);
     for (i=0; i<n; i++) {
       if (!IsZero(m[i])) {
         return(false);
       }
     }
     return(true);
   }
   
   def SpruneZeroRow(res) {
     local minRes, n,i,j,m, base,base2,newbase,newbase2, newMinRes;
   
     minRes = CopyArray(res);
     n = Length(minRes);
     for (i=0; i<n; i++) {
       base = minRes[i];
       m = Length(base);
       if (i != n-1) {
         base2 = minRes[i+1];
         base2 = Transpose(base2);
       }
       newbase = [ ];
       newbase2 = [ ];
       for (j=0; j<m; j++) {
         if (!IsZeroVector(base[j])) {
           newbase = Append(newbase,base[j]);
           if (i != n-1) {
             newbase2 = Append(newbase2,base2[j]);
           }
         }
       }
       minRes[i] = newbase;
       if (i != n-1) {
         if (newbase2 == [ ]) {
           minRes[i+1] = [ ];
         }else{
           minRes[i+1] = Transpose(newbase2);
         }
       }
     }
   
     newMinRes = [ ];
     n = Length(minRes);
     i = 0;
     while (i < n ) {
       base = minRes[i];
       if (base == [ ]) {
         i = n; /* break; */
       }else{
         newMinRes = Append(newMinRes,base);
       }
       i++;
     }
     return(newMinRes);
   }
   
   def testAnnfs2(f) {
     local a,i,n;
     a = Sannfs2(f);
     b=a[0];
     n = Length(b);
     Println("------ V-minimal free resolution -----");
     sm1_pmat(b);
     Println("----- Is it complex?  ---------------");
     for (i=0; i<n-1; i++) {
       Println(b[i+1]*b[i]);
     }
     return(a);
   }
   def testAnnfs3(f) {
     local a,i,n;
     a = Sannfs3(f);
     b=a[0];
     n = Length(b);
     Println("------ V-minimal free resolution -----");
     sm1_pmat(b);
     Println("----- Is it complex?  ---------------");
     for (i=0; i<n-1; i++) {
       Println(b[i+1]*b[i]);
     }
     return(a);
   }
   
   def ToString_array(p) {
     local ans;
     if (IsArray(p)) {
       ans = Map(p,"ToString_array");
     }else{
       ans = ToString(p);
     }
     return(ans);
   }
   
   /* sm1_res_div([[x],[y]],[[x^2],[x*y],[y^2]],[x,y]): */
   
   def sm1_res_div(I,J,V) {
     I = ToString_array(I);
     J = ToString_array(J);
     V = ToString_array(V);
     sm1(" [[ I J]  V ] res*div /FunctionValue set ");
   }
   
   /* It has not yet been working */
   def sm1_res_kernel_image(m,n,v) {
     m = ToString_array(m);
     n = ToString_array(n);
     v = ToString_array(v);
     sm1(" [m n v] res-kernel-image /FunctionValue set ");
   }
   def Skernel(m,v) {
     m = ToString_array(m);
     v = ToString_array(v);
     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) {
     f =ToString_array(f);
     v = ToString_array(v);
     sm1(" [f v] gb /FunctionValue set ");
   }
   
   
   def SisComplex(a) {
     local n,i,j,k,b,p,q;
     n = Length(a);
     for (i=0; i<n-1; i++) {
       if (Length(a[i+1]) != 0) {
         b = a[i+1]*a[i];
         p = Length(b); q = Length(b[0]);
         for (j=0; j<p; j++) {
           for (k=0; k<q; k++) {
             if (!IsZero(b[j,k])) {
                Print("Is is not complex at ");
                Println([i,j,k]);
                return(false);
             }
           }
         }
       }
     }
     return(true);
   }
   
   def IsExact_h(c,v) {
     local a;
     v = ToString_array(v);
     a = [c,v];
     sm1(a," isExact_h /FunctionValue set ");
   }
   HelpAdd(["IsExact_h",
   ["IsExact_h(complex,var): bool",
    "It checks the given complex is exact or not in D<h> (homogenized Weyl algebra)",
    "cf. ReParse"
   ]]);
   
   def ReParse(a) {
     local c;
     if (IsArray(a)) {
       c = Map(a,"ReParse");
     }else{
       sm1(a," toString . /c set");
     }
     return(c);
   }
   HelpAdd(["ReParse",
   ["Reparse(obj): obj",
    "It parses the given object in the current ring.",
    "Outputs from SlaScala, Sschreyer may cause a trouble in other functions,",
    "because it uses the Schreyer order.",
    "In this case, ReParse the outputs from these functions.",
    "cf. IsExaxt_h"
   ]]);
   
   def ScheckIfSchreyer(s) {
     local ss;
     sm1(" (report) (grade) switch_function /ss set ");
     if (ss != "module1v") {
        Print("ScheckIfSchreyer: from "); Println(s);
        Error("grade is not module1v");
     }
     /*
     sm1(" (report) (mmLarger) switch_function /ss set ");
     if (ss != "tower") {
        Print("ScheckIfSchreyer: from "); Println(s);
        Error("mmLarger is not tower");
     }
     */
     sm1(" [(Schreyer)] system_variable (universalNumber) dc /ss set ");
     if (ss != 1) {
        Print("ScheckIfSchreyer: from "); Println(s);
        Error("Schreyer order is not set.");
     }
     /* More check will be necessary. */
     return(true);
   }
   

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.16

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