version 1.19, 2000/07/31 01:21:41 |
version 1.26, 2000/08/10 02:59:08 |
|
|
/* $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.25 2000/08/02 05:14:31 takayama Exp $ */ |
#define DEBUG 1 |
#define DEBUG 1 |
Sordinary = false; |
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), |
Line 34 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 Sgroebner(f) { |
|
Line 51 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) { |
def Error(s) { |
sm1(" s error "); |
sm1(" s error "); |
} |
} |
|
|
return(r); |
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. */ |
/* End of standard functions that should be moved to standard libraries. */ |
def test0() { |
def test0() { |
local f; |
local f; |
Line 193 def SresolutionFrameWithTower(g,opt) { |
|
Line 239 def SresolutionFrameWithTower(g,opt) { |
|
} |
} |
} |
} |
} |
} |
}else{ |
} else if (IsNull(opt)){ |
|
} else { |
Println("Warning: option should be given by an array."); |
Println("Warning: option should be given by an array."); |
|
Println(opt); |
|
Println("--------------------------------------------"); |
} |
} |
} |
} |
|
|
Line 358 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 913 HelpAdd(["Sminimal", |
|
Line 965 HelpAdd(["Sminimal", |
|
def Sminimal(g,opt) { |
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, tminRes; |
betti_levelplus, newbases, i, j,qq, tminRes,bettiTable, ansSminimal; |
if (Length(Arglist) < 2) { |
if (Length(Arglist) < 2) { |
opt = null; |
opt = null; |
} |
} |
Line 926 def Sminimal(g,opt) { |
|
Line 978 def Sminimal(g,opt) { |
|
freeRes = r[0]; |
freeRes = r[0]; |
redundantTable = r[1]; |
redundantTable = r[1]; |
reducer = r[2]; |
reducer = r[2]; |
|
bettiTable = SbettiTable(redundantTable); |
|
Println("Betti numbers are ------"); |
|
sm1_pmat(bettiTable); |
minRes = SnewArrayOfFormat(freeRes); |
minRes = SnewArrayOfFormat(freeRes); |
seq = 0; |
seq = 0; |
maxSeq = SgetMaxSeq(redundantTable); |
maxSeq = SgetMaxSeq(redundantTable); |
Line 979 def Sminimal(g,opt) { |
|
Line 1034 def Sminimal(g,opt) { |
|
} |
} |
} |
} |
tminRes = Stetris(minRes,redundantTable); |
tminRes = Stetris(minRes,redundantTable); |
return([SpruneZeroRow(tminRes), tminRes, |
ansSminimal = [SpruneZeroRow(tminRes), tminRes, |
[ minRes, redundantTable, reducer,r[3],r[4]],r[0],r[5]]); |
[ minRes, redundantTable, reducer,r[3],r[4]],r[0],r[5]]; |
|
Println("------------ Note -----------------------------"); |
|
Println("To get shift vectors, use Reparse and SgetShifts(resmat,w)"); |
|
Println("To get initial of the complex, use Reparse and Sinit_w(resmat,w)"); |
|
Println("0: minimal resolution, 3: Schreyer resolution "); |
|
Println("------------ Resolution Summary --------------"); |
|
Print("Betti numbers : "); |
|
Println(Map(ansSminimal[0],"Length")); |
|
Print("Betti numbers of the Schreyer frame: "); |
|
Println(Map(ansSminimal[3],"Length")); |
|
Println("-----------------------------------------------"); |
|
|
|
sm1(" restoreEnvAfterResolution "); |
|
Sordinary = false; |
|
|
|
return(ansSminimal); |
/* r[4] is the redundantTable_ordinary */ |
/* r[4] is the redundantTable_ordinary */ |
/* r[0] is the freeResolution */ |
/* r[0] is the freeResolution */ |
/* r[5] is the skelton */ |
/* r[5] is the skelton */ |
Line 1342 HelpAdd(["IsExact_h", |
|
Line 1412 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 1381 def ScheckIfSchreyer(s) { |
|
Line 1463 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:" |
|
]]); |
|
|
|
/* This method does not work, because we have zero rows. |
|
Think about it later. */ |
|
def SbettiTable(rtable) { |
|
local ans,i,j,pp; |
|
ans = SnewArrayOfFormat(rtable); |
|
for (i=0; i<Length(rtable); i++) { |
|
pp = 0; |
|
for (j=0; j<Length(rtable[i]); j++) { |
|
if (rtable[i,j] != 0) {pp = pp+1;} |
|
} |
|
ans[i] = pp; |
|
} |
|
return(ans); |
} |
} |
|
|