=================================================================== RCS file: /home/cvs/OpenXM/src/k097/lib/minimal/minimal.k,v retrieving revision 1.19 retrieving revision 1.31 diff -u -p -r1.19 -r1.31 --- OpenXM/src/k097/lib/minimal/minimal.k 2000/07/31 01:21:41 1.19 +++ OpenXM/src/k097/lib/minimal/minimal.k 2000/12/10 03:12:20 1.31 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/k097/lib/minimal/minimal.k,v 1.18 2000/07/30 02:26:25 takayama Exp $ */ +/* $OpenXM: OpenXM/src/k097/lib/minimal/minimal.k,v 1.30 2000/11/19 05:50:30 takayama Exp $ */ #define DEBUG 1 Sordinary = false; /* If you run this program on openxm version 1.1.2 (FreeBSD), @@ -7,6 +7,22 @@ Sordinary = false; */ #define OFFSET 0 /* #define OFFSET 20*/ +Sverbose = false; /* Be extreamly verbose */ +Sverbose2 = true; /* Don't be quiet and show minimal information */ +def Sprintln(s) { + if (Sverbose) Println(s); +} +def Sprint(s) { + if (Sverbose) Print(s); +} +def Sprintln2(s) { + if (Sverbose2) Println(s); +} +def Sprint2(s) { + if (Sverbose2) Print(s); + sm1(" [(flush)] extension "); +} + /* Test sequences. Use load["minimal.k"];; @@ -28,12 +44,25 @@ Sordinary = false; */ +/* We cannot use load command in the if statement. */ +load("lib/minimal/cohom.k"); -load("cohom.k"); def load_tower() { + local ppp; if (Boundp("k0-tower.sm1.loaded")) { }else{ - sm1(" [(parse) (k0-tower.sm1) pushfile ] extension "); + if (Tag(GetPathName("k0-tower.sm1")) == 0) { + ppp = GetPathName("lib/minimal/k0-tower.sm1"); + sm1(" [(parse) ppp pushfile ] extension "); + }else{ + sm1(" [(parse) (k0-tower.sm1) pushfile ] extension "); + } + if (Tag(GetPathName("new.sm1")) == 0) { + ppp = GetPathName("lib/minimal/new.sm1"); + sm1(" [(parse) ppp pushfile ] extension "); + }else{ + sm1(" [(parse) (new.sm1) pushfile ] extension "); + } sm1(" /k0-tower.sm1.loaded 1 def "); } sm1(" oxNoX "); @@ -50,7 +79,20 @@ def Sgroebner(f) { 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} map /FunctionValue set "); +} + + def Error(s) { sm1(" s error "); } @@ -83,6 +125,60 @@ def RingOf(f) { return(r); } +def Ord_w_m(f,w,m) { + sm1(" f w m ord_w { (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 /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 t) { t = v[i];} + } + return(t); +} +HelpAdd(["Max", +["Max(v) returns the maximal element in v."]]); + +def Kernel(f) { + sm1(" [f] syz /FunctionValue set "); +} +def Syz(f) { + sm1(" [f] syz /FunctionValue set "); +} +HelpAdd(["Kernel", +["Kernel(f) returns the syzygy of f.", + "Return value [b, c]: b is a set of generators of the syzygies of f", + " : c=[gb, backward transformation, syzygy without", + " dehomogenization", + "Example: Weyl(\"x,y\",[[\"x\",-1,\"Dx\",1]]); ", + " s=Kernel([x*Dx+1,Dx^2+x^5]); s[0]:"]]); +/* cf. sm1_syz in cohom.k */ +def Gb(f) { + sm1(" [f] gb /FunctionValue set "); +} +HelpAdd(["Gb", +["Gb(f) returns the Groebner basis of f.", + "cf. Kernel, Weyl."]]); + + /* End of standard functions that should be moved to standard libraries. */ def test0() { local f; @@ -103,7 +199,6 @@ def test1() { } - def Sweyl(v,w) { /* extern WeightOfSweyl ; */ local ww,i,n; @@ -193,8 +288,11 @@ def SresolutionFrameWithTower(g,opt) { } } } - }else{ + } else if (IsNull(opt)){ + } else { Println("Warning: option should be given by an array."); + Println(opt); + Println("--------------------------------------------"); } } @@ -229,7 +327,7 @@ def SresolutionFrameWithTower(g,opt) { /* -sugar is fine? */ sm1(" setupEnvForResolution "); - Println(g); + Sprintln(g); startingGB = g; /* ans = [ SzeroMap(g) ]; It has not been implemented. see resol1.withZeroMap */ ans = [ ]; @@ -273,16 +371,22 @@ def NewPolynomialVector(size) { def SturnOffHomogenization() { sm1(" [(Homogenize)] system_variable 1 eq - { (Warning: Homogenization and ReduceLowerTerms options are automatically turned off.) message + { Sverbose { + (Warning: Homogenization and ReduceLowerTerms options are automatically turned off.) message } { } ifelse [(Homogenize) 0] system_variable [(ReduceLowerTerms) 0] system_variable } { } ifelse "); } +/* NOTE!!! Be careful these changes of global environmental variables. + We should make a standard set of values and restore these values + after computation and interruption. August 15, 2000. +*/ def SturnOnHomogenization() { sm1(" [(Homogenize)] system_variable 0 eq - { (Warning: Homogenization and ReduceLowerTerms options are automatically turned ON.) message + { Sverbose { + (Warning: Homogenization and ReduceLowerTerms options are automatically turned ON.) message } { } ifelse [(Homogenize) 1] system_variable [(ReduceLowerTerms) 1] system_variable } { } ifelse @@ -330,7 +434,7 @@ def Sres0FrameWithSkelton(g) { si = pair[1,0]; sj = pair[1,1]; /* si g[i] + sj g[j] + \sum tmp[2][k] g[k] = 0 in res0 */ - Print("."); + Sprint("."); t_syz = NewPolynomialVector(gLength); t_syz[i] = si; @@ -338,7 +442,7 @@ def Sres0FrameWithSkelton(g) { syzAll[k] = t_syz; } t_syz = syzAll; - Print("Done. betti="); Println(betti); + Sprint("Done. betti="); Sprintln(betti); /* Println(g); g is in a format such as [e_*x^2 , e_*x*y , 2*x*Dx*h , ...] [e_*x^2 , e_*x*y , 2*x*Dx*h , ...] @@ -358,6 +462,9 @@ def StotalDegree(f) { 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]); */ def Sord_w(f,w) { local neww,i,n; @@ -391,8 +498,10 @@ def test_SinitOfArray() { f = [x^2+y^2+z^2, x*y+x*z+y*z, x*z^2+y*z^2, y^3-x^2*z - x*y*z+y*z^2, -y^2*z^2 + x*z^3 + y*z^3, -z^4]; p=SresolutionFrameWithTower(f); - sm1_pmat(p); - sm1_pmat(SgenerateTable(p[1])); + if (Sverbose) { + sm1_pmat(p); + sm1_pmat(SgenerateTable(p[1])); + } return(p); frame = p[0]; sm1_pmat(p[1]); @@ -418,7 +527,7 @@ def SgenerateTable(tower) { local height, n,i,j, ans, ans_at_each_floor; /* - Print("SgenerateTable: tower=");Println(tower); + Sprint("SgenerateTable: tower=");Sprintln(tower); sm1(" print_switch_status "); */ height = Length(tower); ans = NewArray(height); @@ -503,17 +612,18 @@ def SlaScala(g,opt) { reductionTable_tmp; /* extern WeightOfSweyl; */ ww = WeightOfSweyl; - Print("WeightOfSweyl="); Println(WeightOfSweyl); - rf = SresolutionFrameWithTower(g,opt); - Print("rf="); sm1_pmat(rf); + Sprint("WeightOfSweyl="); Sprintln(WeightOfSweyl); + rf = SresolutionFrameWithTower(g,opt); + Sprint("rf="); if (Sverbose) {sm1_pmat(rf);} redundant_seq = 1; redundant_seq_ordinary = 1; tower = rf[1]; - Println("Generating reduction table which gives an order of reduction."); - Print("WeghtOfSweyl="); Println(WeightOfSweyl); - Print("tower"); Println(tower); + Sprintln("Generating reduction table which gives an order of reduction."); + Sprint("WeghtOfSweyl="); Sprintln(WeightOfSweyl); + Sprint2("tower="); Sprintln2(tower); reductionTable = SgenerateTable(tower); - Print("reductionTable="); sm1_pmat(reductionTable); + Sprint2("reductionTable="); + if (Sverbose || Sverbose2) {sm1_pmat(reductionTable);} skel = rf[2]; redundantTable = SnewArrayOfFormat(rf[1]); @@ -532,11 +642,12 @@ def SlaScala(g,opt) { while (SthereIs(reductionTable_tmp,strategy)) { i = SnextI(reductionTable_tmp,strategy,redundantTable, skel,level,freeRes); - Println([level,i]); + Sprintln([level,i]); reductionTable_tmp[i] = -200000; if (reductionTable[level,i] == strategy) { - Print("Processing [level,i]= "); Print([level,i]); - Print(" Strategy = "); Println(strategy); + Sprint("Processing [level,i]= "); Sprint([level,i]); + Sprint(" Strategy = "); Sprintln(strategy); + Sprint2(strategy); if (level == 0) { if (IsNull(redundantTable[level,i])) { bases = freeRes[level]; @@ -562,9 +673,9 @@ if (Sordinary) { }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]); + Sprint("v-degree of [org,remainder] = "); + Sprintln([f[4],f[5]]); + Sprint("[level,i] = "); Sprintln([level,i]); redundantTable[level-1,place] = 0; }else{ redundantTable[level-1,place] = redundant_seq; @@ -596,6 +707,7 @@ if (Sordinary) { } strategy++; } + Sprintln2(" "); n = Length(freeRes); freeResV = SnewArrayOfFormat(freeRes); for (i=0; i= 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]); + Sprintln(["p and bases ",p,bases]); if (IsNull(bases[i]) || IsNull(bases[j])) { - Println([level,i,j,bases[i],bases[j]]); + Sprintln([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]); + Sprintln(["level=",level]); + Sprintln(["tower2=",tower2]); /** sm1(" show_ring "); */ gi = Stoes_vec(bases[i]); @@ -772,23 +884,23 @@ def SpairAndReduction(skel,level,ii,freeRes,tower,ww) 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]); + Sprintln([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); + Sprint("[gi, gj] = "); Sprintln([gi,gj]); + sm1(" [(Homogenize)] system_variable "); + Sprint("Reduce the element "); Sprintln(si*gi+sj*gj); + Sprint("by "); Sprintln(bases); tmp = Sreduction(si*gi+sj*gj, bases); - Print("result is "); Println(tmp); + Sprint("result is "); Sprintln(tmp); /* 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); + Sprint("vdegree of the original = "); Sprintln(vdeg); + Sprint("vdegree of the remainder = "); Sprintln(vdeg_reduced); t_syz = tmp[2]; si = si*tmp[1]+t_syz[i]; @@ -804,7 +916,7 @@ def SpairAndReduction(skel,level,ii,freeRes,tower,ww) ans = [tmp[0],t_syz,pos,pos2,vdeg,vdeg_reduced]; /* pos is the place to put syzygy at level. */ /* pos2 is the place to put a new GB at level-1. */ - Println(ans); + Sprintln(ans); return(ans); } @@ -896,7 +1008,7 @@ def Sbases_to_vec(bases,size) { HelpAdd(["Sminimal", ["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]]);", @@ -913,7 +1025,7 @@ HelpAdd(["Sminimal", def Sminimal(g,opt) { local r, freeRes, redundantTable, reducer, maxLevel, minRes, seq, maxSeq, level, betti, q, bases, dr, - betti_levelplus, newbases, i, j,qq, tminRes; + betti_levelplus, newbases, i, j,qq, tminRes,bettiTable, ansSminimal; if (Length(Arglist) < 2) { opt = null; } @@ -926,6 +1038,9 @@ def Sminimal(g,opt) { freeRes = r[0]; redundantTable = r[1]; reducer = r[2]; + bettiTable = SbettiTable(redundantTable); + Sprintln2("BettiTable ------"); + if (Sverbose || Sverbose2) {sm1_pmat(bettiTable);} minRes = SnewArrayOfFormat(freeRes); seq = 0; maxSeq = SgetMaxSeq(redundantTable); @@ -935,12 +1050,12 @@ def Sminimal(g,opt) { } seq=maxSeq+1; while (seq > 1) { - seq--; + seq--; Sprint2(seq); for (level = 0; level < maxLevel; level++) { betti = Length(freeRes[level]); for (q = 0; q (homogenized Weyl algebra)", + "cf. ReParse" +]]); + def ReParse(a) { local c; if (IsArray(a)) { @@ -1376,9 +1521,108 @@ def ScheckIfSchreyer(s) { */ sm1(" [(Schreyer)] system_variable (universalNumber) dc /ss set "); if (ss != 1) { - Print("ScheckIfSchreyer: from "); Println(s); + Print("ScheckIfSchreyer: from "); Printl(s); Error("Schreyer order is not set."); } /* More check will be necessary. */ return(true); -} \ No newline at end of file +} + +def SgetShift(mat,w,m) { + local omat; + sm1(" mat { w m ord_w {(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+1); + m0 = NewArray(Length(resmat[0,0])); + ans[0] = m0; + for (i=0; i