[BACK]Return to restall.sm1 CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Doc

Annotation of OpenXM/src/kan96xx/Doc/restall.sm1, Revision 1.1

1.1     ! maekawa     1: %% changed the following names.
        !             2: %% complement ---> complement.oaku
        !             3: %% syz ==> o.syz
        !             4:
        !             5: %%%%%%%%%%%%%%%%%%%%%%% restall.sm1 (Version 19980415) %%%%%%%%%%%%%%%%%%%%%%%
        !             6: (restall.sm1 ... compute all the cohomology groups of the restriction) message-quiet
        !             7: (                of a D-module to tt = (t_1,...,t_d) = (0,...,0).) message-quiet
        !             8: (non-Schreyer Version: 19980415 by T.Oaku) message-quiet
        !             9: (usage: [(P1)...] [(t1)...] bfm --> the b-function) message-quiet
        !            10: (       [(P1)...] [(t1)...] k0 k1 deg restall --> cohomologies of restriction)
        !            11: message-quiet
        !            12: (       [(P1)...] [(t1)...] intbfm --> the b-function for integration) message-quiet
        !            13: (       [(P1)...] [(t1)...] k0 k1 deg intall --> cohomologies of integration)
        !            14: message-quiet
        !            15: % History: Oct.23, Nov.1, Nov.11: bug fix for m2vec, Nov.13: bug fix for psi1
        !            16: % Apr.15,1998 bug fix for truncation from below
        !            17: %%%%%%%%%%%%%%%%%%%%%%%%%%%% Global variables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !            18: /BFvarlist %% Set all the variables (except s and the parameters) here.
        !            19:  [(x) (y) (z)]
        !            20: def
        !            21: /BFparlist %% Set the parameters here if any.
        !            22:  [ ]
        !            23: def
        !            24: /BFs (s) def
        !            25: /BFth (s) def
        !            26: /BFu (u) def
        !            27: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !            28: %% [(P1) ...] [(t1) ...] bfm --> the b-function along t1 = ... = 0.
        !            29: %% the variables and parameters are assumed to be given by the global variables
        !            30: %% BFvarlist and BFparlist
        !            31:
        !            32: /bfm {
        !            33:   /arg2 set
        !            34:   /arg1 set
        !            35:   [ /ff /tt ] pushVariables
        !            36:   [
        !            37:     arg1 /ff set
        !            38:     arg2 /tt set
        !            39:     ff tt bfm1 bfm2 {(string) dc} map /arg1 set
        !            40:   ] pop
        !            41:   popVariables
        !            42:   arg1
        !            43: } def
        !            44:
        !            45: /bfm1 {
        !            46:   /arg2 set
        !            47:   /arg1 set
        !            48:   [
        !            49:     /ff /tt /d /nff /gg /gg0 /xvarlist /n /i /xtvarlist /xtusvarlist
        !            50:     /sxtusvarlist /allvarlist /gg1 /si /gg1 /j /ui /uu /ss /su1
        !            51:     /input /ggpsi0 /ggpsi /dxvarlist /sxvarlist /ggpsi1
        !            52:     /sxallvarlist /sxpoly_weight /hh /bb /us_weight
        !            53:   ] pushVariables
        !            54:   [
        !            55:     arg1 /ff set
        !            56:     arg2 /tt set
        !            57:     tt length /d set
        !            58:     ff length /nff set
        !            59:
        !            60:     ff tt fwd /gg set
        !            61:     gg {fw_symbol (string) dc} map /gg0 set
        !            62:
        !            63:     BFvarlist tt setminus /xvarlist set
        !            64:     xvarlist length /n set
        !            65:
        !            66:     /uu                       %% uu = [u_1,...,u_d]
        !            67:     [  1 1 d {/i set
        !            68:         BFu i toString 2 cat_n
        !            69:       } for
        !            70:     ] def
        !            71:     /ss                       %% ss = [s_1,...,s_d]
        !            72:     [  1 1 d {/i set
        !            73:         BFth i toString 2 cat_n
        !            74:       } for
        !            75:     ] def
        !            76:
        !            77:     tt xvarlist join /xtvarlist set
        !            78:     uu ss join xtvarlist join /xtusvarlist set
        !            79:     [BFth] xtusvarlist join /sxtusvarlist set
        !            80:     sxtusvarlist BFparlist join /allvarlist set
        !            81:
        !            82:     sxtusvarlist setupDring
        !            83:
        !            84:     0 1 d 1 sub { /i set
        !            85:       gg0 {tt i get fw_homogenize} map /gg1 set
        !            86:       ss i get expand /si set
        !            87:       gg1 {expand} map /gg1 set
        !            88:       gg1 {[[BFs expand si]] replace} map /gg1 set
        !            89:       gg1 {(string) dc} map /gg1 set
        !            90:     } for
        !            91:
        !            92:     /us_weight [ [
        !            93:       0 1 d 1 sub { /i set
        !            94:         uu i get 1  ss i get 1
        !            95:       } for ]
        !            96:       [
        !            97:         0 1 d 1 sub { /i set tt i get 1 } for
        !            98:         0 1 n 1 sub { /j set
        !            99:           xvarlist j get xtoDx 1
        !           100:           xvarlist j get 1
        !           101:         } for
        !           102:       ] ] def
        !           103:
        !           104:     [ allvarlist listtostring ring_of_differential_operators
        !           105:       us_weight weight_vector 0 ] define_ring
        !           106:
        !           107:     gg1 {expand} map /gg1 set
        !           108:
        !           109:     /su1 [ 0 1 d 1 sub { /i set  %% [(1-s1*u1).,...]
        !           110:       ss i get expand /si set
        !           111:       uu i get expand /ui set
        !           112:       si ui mul (1). sub
        !           113:       } for ] def
        !           114:
        !           115:     su1 gg1 join /input set
        !           116:     input {[[(h). (1).]] replace homogenize} map /input set
        !           117:     [input] groebner 0 get {[[(h). (1).]] replace} map /gg set
        !           118:     gg uu eliminatev /gg set
        !           119:     gg ss eliminatev /gg set
        !           120:     gg reducedBase /gg set
        !           121:
        !           122:     gg /ggpsi0 set
        !           123:     0 1 d 1 sub { /i set
        !           124:       ggpsi0 {tt i get fw_psi} map /ggpsi0 set
        !           125:       ss i get expand /si set
        !           126:       ggpsi0 {[[BFth expand si]] replace} map /ggpsi0 set
        !           127:     } for
        !           128:     ggpsi0 {(string) dc} map /ggpsi set
        !           129:
        !           130:     xvarlist {xtoDx} map /dxvarlist set
        !           131:     ss xvarlist join /sxvarlist set
        !           132:     sxvarlist setupDring
        !           133:
        !           134:     ggpsi {expand [[(h). (1).]] replace homogenize} map /ggpsi set
        !           135:     [ggpsi] groebner 0 get /ggpsi set
        !           136:     ggpsi dxvarlist eliminatev /ggpsi1 set
        !           137:     ggpsi1 {(string) dc} map /ggpsi1 set
        !           138:
        !           139:     /sxpoly_weight [
        !           140:       [ 0 1 n 1 sub {/i set xvarlist i get 1} for ]
        !           141:       [ 0 1 d 1 sub {/i set ss i get 1} for ]
        !           142:     ] def
        !           143:
        !           144:     sxvarlist BFparlist join /sxallvarlist set
        !           145:     [ sxallvarlist listtostring ring_of_polynomials
        !           146:       sxpoly_weight weight_vector 0 ] define_ring
        !           147:     ggpsi1 {expand} map /ggpsi1 set ;
        !           148:     [ggpsi1] groebner 0 get {[[(h). (1).]] replace} map /hh set
        !           149:     hh xvarlist eliminatev /bb set
        !           150:     [bb {(string) dc} map ss] /arg1 set
        !           151:   ] pop
        !           152:   popVariables
        !           153:   arg1
        !           154: } def
        !           155:
        !           156: /bfm2 {
        !           157:   /arg1 set
        !           158:   [ /ff /ss /d /sspoly_weight /ssallvarlist /si /hh ] pushVariables
        !           159:   [
        !           160:     arg1 0 get /ff set
        !           161:     arg1 1 get /ss set
        !           162:     ss length /d set
        !           163:
        !           164:     /sspoly_weight [
        !           165:       [ 0 1 d 1 sub {/i set ss i get 1} for ]
        !           166:     ] def
        !           167:
        !           168:     [BFth] ss join BFparlist join /ssallvarlist set
        !           169:     [ ssallvarlist listtostring ring_of_polynomials
        !           170:       sspoly_weight weight_vector 0 ] define_ring
        !           171:     ff {expand homogenize} map /ff set ;
        !           172:     BFth expand /si set
        !           173:     1 1 d 1 sub {/i set
        !           174:       si << ss i get expand >> sub /si set
        !           175:     } for
        !           176:     ff {[[ss 0 get expand  si]] replace} map /ff set
        !           177:     [ff] groebner 0 get {[[(h). (1).]] replace} map /hh set
        !           178:     hh ss eliminatev /arg1 set
        !           179:   ] pop
        !           180:   popVariables
        !           181:   arg1
        !           182: } def
        !           183:
        !           184: %% V-Groebner basis by V-filtration (using the variable s)
        !           185: /fwd {
        !           186:  /arg2 set  %% bftt
        !           187:  /arg1 set  %% BFequations
        !           188:  [ /bfs /bftt /bfh /bf1 /ff /n /i /d /GG /gbase /o.syz
        !           189:    /BFDvarlist /BFs_weight ] pushVariables
        !           190:  [
        !           191:   /ff arg1 def
        !           192:   /bftt arg2 def
        !           193:   /BFallvarlist
        !           194:     [ BFs ] BFvarlist join BFparlist join
        !           195:   def
        !           196:   BFvarlist length /n set
        !           197:   BFvarlist {xtoDx} map /BFDvarlist set
        !           198:   /BFs_weight
        !           199:     [ [ BFs 1 ]
        !           200:       [ 0 1 n 1 sub
        !           201:           { /i set BFDvarlist i get 1 }
        !           202:         for
        !           203:         0 1 n 1 sub
        !           204:           { /i set BFvarlist i get 1 }
        !           205:         for ]
        !           206:     ] def
        !           207:
        !           208:   [ BFallvarlist listtostring ring_of_differential_operators
        !           209:     BFs_weight weight_vector
        !           210:   0] define_ring  /BFring set
        !           211:
        !           212:   /bfh  (h) BFring ,, def
        !           213:   /bfs  BFs BFring ,, def
        !           214:   /bf1  (1) BFring ,, def
        !           215:   ff { bftt fwm_homogenize } map /ff set
        !           216:   ff {expand} map /ff set
        !           217:   ff {[[bfh bf1]] replace} map {homogenize} map /ff set
        !           218:   [ff] groebner 0 get reducedBase /gbase set
        !           219:   gbase /arg1 set
        !           220:   ] pop
        !           221:  popVariables
        !           222:  arg1
        !           223: } def
        !           224:
        !           225: %% The "b-function" w.r.t. (Dt1),...
        !           226: %% (for integration w.r.t. (t1),...
        !           227: %% [(P1)...] [(t1)...] intbfm
        !           228:
        !           229: /intbfm {
        !           230:   /arg2 set /arg1 set
        !           231:   [ ] pushVariables
        !           232:   [
        !           233:     arg1 /ff set
        !           234:     arg2 /tt set
        !           235:     BFvarlist setupDring
        !           236:     ff {tt fourier} map /gg set
        !           237:     gg tt bfm /arg1 set
        !           238:   ] pop
        !           239:   popVariables
        !           240:   arg1
        !           241: } def
        !           242:
        !           243: /intall {
        !           244:   /arg5 set %% degmax
        !           245:   /arg4 set %% k1
        !           246:   /arg3 set %% k0
        !           247:   /arg2 set %% [(t1) ... (td)]
        !           248:   /arg1 set %% BFequations
        !           249:   [ /ff /bftt /k0 /k1 /degmax /ffdx ] pushVariables
        !           250:   [
        !           251:     /ff arg1 def  /bftt arg2 def  /k0 arg3 def  /k1 arg4 def
        !           252:     /degmax arg5 def
        !           253:     BFvarlist setupDring
        !           254:     ff {bftt fourier} map /ffdx set
        !           255:     ffdx bftt k0 k1 degmax restall /arg1 set
        !           256:   ] pop
        !           257:   popVariables
        !           258:   arg1
        !           259: } def
        !           260:
        !           261: /intall1 {
        !           262:   /arg5 set %% degmax
        !           263:   /arg4 set %% k1
        !           264:   /arg2 set %% [(t1) ... (td)]
        !           265:   /arg1 set %% BFequations
        !           266:   [ /ff /bftt /k0 /k1 /degmax /ffdx ] pushVariables
        !           267:   [
        !           268:     /ff arg1 def  /bftt arg2 def  /k1 arg4 def
        !           269:     /degmax arg5 def
        !           270:     BFvarlist setupDring
        !           271:     ff {bftt fourier} map /ffdx set
        !           272:     ffdx bftt k1 degmax restall1 /arg1 set
        !           273:   ] pop
        !           274:   popVariables
        !           275:   arg1
        !           276: } def
        !           277:
        !           278: %% (P) [(t_1),...,(t_d)] fourier
        !           279: /fourier {
        !           280:   /arg2 set /arg1 set
        !           281:   [ /P /tt /d /i] pushVariables
        !           282:   [
        !           283:      arg1 /P set
        !           284:      arg2 /tt set
        !           285:      tt length /d set
        !           286:      0 1 d 1 sub {/i set
        !           287:        P << tt i get >> fourier1 /P set
        !           288:      } for
        !           289:      P /arg1 set
        !           290:   ] pop
        !           291:   popVariables
        !           292:   arg1
        !           293: } def
        !           294:
        !           295: %% (P) (t) fourier :  t --> -Dt, Dt --> t
        !           296: /fourier1 {
        !           297:   /arg2 set /arg1 set
        !           298:   [/P /bft /bfDt /P /bftv /bfDtv /Pcoefs /degs /coefs /m /PP /i /ki /ci
        !           299:     ] pushVariables
        !           300:   [
        !           301:     arg1 /P set
        !           302:     arg2 /bft set
        !           303:     bft xtoDx /bfDt set
        !           304:     P expand /P set
        !           305:     bft expand /bftv set
        !           306:     bfDt expand /bfDtv set
        !           307:     P bfDtv coefficients /Pcoefs set
        !           308:     Pcoefs 0 get /degs set
        !           309:     Pcoefs 1 get /coefs set
        !           310:     coefs length /m set
        !           311:     (0). /PP set
        !           312:     0 1 m 1 sub { /i set
        !           313:       degs i get /ki set
        !           314:       coefs i get /ci set
        !           315:       ci [[ bftv << (0). bfDtv sub >> ]] replace /ci set
        !           316:       ci << bftv ki power >> mul /ci set
        !           317:       PP ci add /PP set
        !           318:     } for
        !           319:     PP [[(h). (1).]] replace (string) dc /arg1 set
        !           320:   ] pop
        !           321:   popVariables
        !           322:   arg1
        !           323: } def
        !           324:
        !           325: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           326: %% The cohomology groups of the restriction
        !           327: %% [(P1)...] [(t1)...] k0 k1 degmax restall
        !           328: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
        !           329:
        !           330: /restall {
        !           331:   /arg5 set %% degmax
        !           332:   /arg4 set %% k1
        !           333:   /arg3 set %% k0
        !           334:   /arg2 set %% [(t1) ... (td)]
        !           335:   /arg1 set %% BFequations
        !           336:   [
        !           337:     /ff /bftt /k0 /k1 /degmax /syzlist /mveclist /cohomlist
        !           338:     /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
        !           339:     /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
        !           340:     /psi1 /psi1ker /psi2image
        !           341:     /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
        !           342:     /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
        !           343:   ] pushVariables
        !           344:   [
        !           345:     /ff arg1 def  /bftt arg2 def  /k0 arg3 def  /k1 arg4 def
        !           346:     /degmax arg5 def
        !           347:     bftt length /d set
        !           348:   degmax 0 gt {
        !           349:     (Computing a free resolution ... ) message
        !           350:     ff bftt degmax syzygyV /GG set
        !           351:     (A free resolution obtained.) message
        !           352:   }{
        !           353:     [[ff bftt fwd {[[BFs expand (1).]] replace (string) dc} map ] [ [ 0 ] ]]
        !           354:     /GG set
        !           355:   } ifelse
        !           356:     GG 0 get /syzlist set
        !           357:     GG 1 get /mveclist set
        !           358:
        !           359:     [ ] /cohomlist set
        !           360:
        !           361:   0 1 degmax {/ideg set
        !           362:
        !           363:     ideg 0 eq {
        !           364:       [ (0) ] /gbase set
        !           365:       [ 0 ] /m0vec set
        !           366:       1 /r0 set
        !           367:     }{
        !           368:       syzlist  << ideg 1 sub >> get /gbase set
        !           369:       m1vec /m0vec set
        !           370:       r1 /r0 set
        !           371:     } ifelse
        !           372:     syzlist     ideg          get /o.syz   set
        !           373:     mveclist    ideg          get /m1vec set
        !           374:
        !           375: %%                                       o.syz       gbase
        !           376: %%                                D^{r2} --> D^{r1} --> D^{r0}
        !           377: %% with weight vectors:           m2vec      m1vec      m0vec
        !           378: %% which will induce a complex
        !           379: %%                                     psi2              psi1
        !           380: %%                        D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
        !           381:
        !           382:     gbase length /r1 set
        !           383:     o.syz length /r2 set
        !           384:
        !           385:     ideg 0 eq {
        !           386:       /syz1 [ 0 1 r2 1 sub {/i set
        !           387:         [ o.syz i get ]
        !           388:       } for ] def
        !           389:       syz1 /o.syz set
        !           390:     }{ } ifelse
        !           391:
        !           392: %% Computing the weight vector m2vec from m1vec and syz
        !           393:   ideg degmax eq {
        !           394:     /m2vec [
        !           395:       0 1 r2 1 sub {/i set
        !           396:         o.syz i get /syzi set
        !           397:         0 /nonzero set
        !           398:         0 1 r1 1 sub {/j set
        !           399:           syzi j get expand /syzij set
        !           400:           syzij (0). eq {  }{
        !           401:             syzij bftt fwh_order  m1vec j get  add /maxtmp set
        !           402:             nonzero 0 eq { maxtmp /max0 set }{
        !           403:               maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
        !           404:             } ifelse
        !           405:             1 /nonzero set
        !           406:           } ifelse
        !           407:         } for
        !           408:       max0 } for ] def
        !           409:   }{
        !           410:     mveclist << ideg 1 add >> get /m2vec set
        !           411:   } ifelse
        !           412:
        !           413: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
        !           414:     BFu /estr set
        !           415:     /ee
        !           416:       [ 1 1 d {/i set estr i toString 2 cat_n} for ]
        !           417:     def
        !           418:     [@@@.esymbol] ee join /eee set
        !           419:
        !           420: %% Setting up a ring that represents D_{Y->X}^{r1}
        !           421:     eee length /neee set
        !           422:     /eeemvec [ 1 1 neee {pop 1} for ] def
        !           423:     eee [ ] BFvarlist eeemvec setupDringVshift
        !           424:     bftt {xtoDx expand} map /bfDtt set
        !           425:     [ ] /psi1 set
        !           426:     [ ] /psi1index set
        !           427:     [ ] /zerolist set
        !           428:
        !           429: %% converting gbase to a list of polynomials
        !           430: %% Be careful to the current ring!
        !           431:     ideg 2 lt {
        !           432:       gbase {expand} map /gbase1 set
        !           433:     }{
        !           434:       /gbase1
        !           435:         [ 0 1 r1 1 sub {/i set
        !           436:             gbase i get {expand} map vector_to_poly
        !           437:          } for ] def
        !           438:       } ifelse
        !           439:     gbase1 /gbase set
        !           440:
        !           441: %(ideg =) messagen ideg ::
        !           442: %(Computing psi1) message
        !           443: %%                        psi1
        !           444: %% Computes  D_{Y->X}^{r1} -->  D_{Y->X}^{r0} induced by gbase
        !           445: %% with weight  k0 - m1vec <= k <= k1 - m1vec
        !           446:     0 1 r1 1 sub {/i set
        !           447:       m1vec i get /m1i set
        !           448:       ee {expand} map k0 m1i sub k1 m1i sub monomials /emonoi set
        !           449:       bfDtt k0 m1i sub k1 m1i sub monomials /bfDttmonoi set
        !           450:       emonoi length /nmono set
        !           451:       0 1 nmono 1 sub {/j set
        !           452:         @@@.esymbol expand i npower /eei set
        !           453:         emonoi j get eei mul /eei set
        !           454:         gbase i get /dtp set
        !           455:         bfDttmonoi j get dtp mul /dtp set
        !           456:         0 1 d 1 sub {/k set
        !           457:           dtp [[bftt k get expand (0).]] replace /dtp set
        !           458:           dtp [[bfDtt k get  ee k get expand]] replace /dtp set
        !           459:         } for
        !           460:         dtp [[(h). (1).]] replace /dtp set
        !           461:         dtp << ee {expand} map >> m0vec k0 Vtruncate_below /dtp set
        !           462:         dtp (0). eq {
        !           463:           zerolist [eei] join /zerolist set
        !           464:         }{
        !           465:           psi1index [eei] join /psi1index set
        !           466:           psi1 [dtp] join /psi1 set
        !           467:         } ifelse
        !           468:       } for
        !           469:     } for
        !           470:
        !           471: %(ideg =) messagen ideg ::
        !           472: %(psi1 obtained.) message
        !           473: %(Computing psi1ker) message
        !           474:
        !           475: %% Computing psi1ker := Ker psi1 :
        !           476:     psi1 length 0 eq {
        !           477:       [ ] /psi1ker set
        !           478:     }{
        !           479:       psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
        !           480:       [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
        !           481:       psi1kervec length /pn set
        !           482:       psi1index length /pn0 set
        !           483:       [ ] /psi1ker set
        !           484:       0 1 pn 1 sub {/i set
        !           485:         psi1kervec i get /psi1i set
        !           486:         (0). /psi1keri set
        !           487:         0 1 pn0 1 sub {/j set
        !           488:           psi1index j get psi1i j get mul psi1keri add /psi1keri set
        !           489:         } for
        !           490:         psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
        !           491:       } for
        !           492:     } ifelse
        !           493:     zerolist psi1ker join /psi1ker set
        !           494: % Is it all right to use reducedBase here?
        !           495: %    psi1ker length 0 eq { }{
        !           496: %      psi1ker reducedBase /psi1ker set
        !           497: %    } ifelse
        !           498: %(ideg =) messagen ideg ::
        !           499: %(psi1ker obtained.) message
        !           500: %(Computing psi2image ...) message
        !           501:
        !           502: %%                                     psi2
        !           503: %% Computes the image of  D_{Y->X}^{r2} -->  D_{Y->X}^{r1} induced by syz
        !           504: %% with weight  k0 - m2vec <= k <= k1 - m2vec
        !           505:     /psi2image [
        !           506:       0 1 r2 1 sub {/i set
        !           507:         o.syz i get {expand} map vector_to_poly /syzi set
        !           508:         m2vec i get /m2i set
        !           509:         bfDtt k0 m2i sub k1 m2i sub monomials /bfDttmonoi set
        !           510:         bfDttmonoi length /nmono set
        !           511:         0 1 nmono 1 sub {/j set
        !           512:           bfDttmonoi j get syzi mul /syzij set
        !           513:           0 1 d 1 sub {/k set
        !           514:             syzij [[bftt k get expand (0).]] replace /syzij set
        !           515:             syzij [[bfDtt k get ee k get expand]] replace /syzij set
        !           516:           } for
        !           517:           syzij [[(h). (1).]] replace /syzij set
        !           518:           syzij << ee {expand} map >> m1vec k0 Vtruncate_below /syzij set
        !           519:           syzij (0). eq { }{syzij} ifelse
        !           520:         } for
        !           521:       } for
        !           522:     ] def
        !           523:
        !           524: %(psi2image obtained.) message
        !           525: %(ideg = ) messagen ideg ::
        !           526: %(psi1ker = ) message psi1ker ::
        !           527: %(psi2image =) message psi2image ::
        !           528:
        !           529: %% Computes the quotient module  psi1ker/psi2image
        !           530:     psi1ker length /nker set
        !           531:     nker 0 eq {
        !           532:       [0 [ ]] /cohom set
        !           533:     }{
        !           534:       psi2image length /nim set
        !           535:       psi1ker psi2image join /psiall set
        !           536:       psiall {homogenize} map /psiall set
        !           537:       [psiall [(needSyz)]] groebner 2 get /psisyz set
        !           538:       psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
        !           539:       cohom {remove0} map /cohom set
        !           540:       cohom length 0 eq {
        !           541:         [nker [ ]] /cohom set
        !           542:       }{
        !           543:         cohom {homogenize} map /cohom set
        !           544:         [cohom] groebner 0 get reducedBase /cohom set
        !           545:         cohom {[[(h). (1).]] replace} map /cohom set
        !           546:         [nker cohom] trimModule /cohom set
        !           547:       } ifelse
        !           548:     } ifelse
        !           549:     cohomlist [cohom] join /cohomlist set
        !           550:     0 ideg sub print (-th cohomology:  ) messagen
        !           551:     cohom ::
        !           552:   } for
        !           553:
        !           554:   cohomlist /arg1 set
        !           555:   ] pop
        !           556:   popVariables
        !           557:   arg1
        !           558: } def
        !           559:
        !           560: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           561: %% The cohomology groups of the restriction without truncation from below
        !           562: %% [(P1)...] [(t1)...] k1 degmax restall
        !           563: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
        !           564:
        !           565: /restall1 {
        !           566:   /arg5 set %% degmax
        !           567:   /arg4 set %% k1
        !           568:   /arg2 set %% [(t1) ... (td)]
        !           569:   /arg1 set %% BFequations
        !           570:   [
        !           571:     /ff /bftt /k1 /degmax /syzlist /mveclist /cohomlist
        !           572:     /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
        !           573:     /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
        !           574:     /psi1 /psi1ker /psi2image
        !           575:     /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
        !           576:     /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
        !           577:   ] pushVariables
        !           578:   [
        !           579:     /ff arg1 def  /bftt arg2 def  /k1 arg4 def  /degmax arg5 def
        !           580:     bftt length /d set
        !           581:   degmax 0 gt {
        !           582:     (Computing a free resolution ... ) message
        !           583:     ff bftt degmax syzygyV /GG set
        !           584:     (A free resolution obtained.) message
        !           585:   }{
        !           586:     [[ff bftt fwd {[[BFs expand (1).]] replace (string) dc} map ] [ [ 0 ] ]]
        !           587:     /GG set
        !           588:   } ifelse
        !           589:     GG 0 get /syzlist set
        !           590:     GG 1 get /mveclist set
        !           591:
        !           592:     [ ] /cohomlist set
        !           593:
        !           594:   0 1 degmax {/ideg set
        !           595:
        !           596:     ideg 0 eq {
        !           597:       [ (0) ] /gbase set
        !           598:       [ 0 ] /m0vec set
        !           599:       1 /r0 set
        !           600:     }{
        !           601:       syzlist  << ideg 1 sub >> get /gbase set
        !           602:       m1vec /m0vec set
        !           603:       r1 /r0 set
        !           604:     } ifelse
        !           605:     syzlist     ideg          get /o.syz   set
        !           606:     mveclist    ideg          get /m1vec set
        !           607:
        !           608: %%                                       o.syz       gbase
        !           609: %%                                D^{r2} --> D^{r1} --> D^{r0}
        !           610: %% with weight vectors:           m2vec      m1vec      m0vec
        !           611: %% which will induce a complex
        !           612: %%                                     psi2              psi1
        !           613: %%                        D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
        !           614:
        !           615:     gbase length /r1 set
        !           616:     o.syz length /r2 set
        !           617:
        !           618:     ideg 0 eq {
        !           619:       /syz1 [ 0 1 r2 1 sub {/i set
        !           620:         [ o.syz i get ]
        !           621:       } for ] def
        !           622:       syz1 /o.syz set
        !           623:     }{ } ifelse
        !           624:
        !           625: %% Computing the weight vector m2vec from m1vec and syz
        !           626:   ideg degmax eq {
        !           627:     /m2vec [
        !           628:       0 1 r2 1 sub {/i set
        !           629:         o.syz i get /syzi set
        !           630:         0 /nonzero set
        !           631:         0 1 r1 1 sub {/j set
        !           632:           syzi j get expand /syzij set
        !           633:           syzij (0). eq {  }{
        !           634:             syzij bftt fwh_order  m1vec j get  add /maxtmp set
        !           635:             nonzero 0 eq { maxtmp /max0 set }{
        !           636:               maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
        !           637:             } ifelse
        !           638:             1 /nonzero set
        !           639:           } ifelse
        !           640:         } for
        !           641:       max0 } for ] def
        !           642:   }{
        !           643:     mveclist << ideg 1 add >> get /m2vec set
        !           644:   } ifelse
        !           645:
        !           646: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
        !           647:     BFu /estr set
        !           648:     /ee
        !           649:       [ 1 1 d {/i set estr i toString 2 cat_n} for ]
        !           650:     def
        !           651:     [@@@.esymbol] ee join /eee set
        !           652:
        !           653: %% Setting up a ring that represents D_{Y->X}^{r1}
        !           654:     eee length /neee set
        !           655:     /eeemvec [ 1 1 neee {pop 1} for ] def
        !           656:     eee [ ] BFvarlist eeemvec setupDringVshift
        !           657:     bftt {xtoDx expand} map /bfDtt set
        !           658:     [ ] /psi1 set
        !           659:     [ ] /psi1index set
        !           660:     [ ] /zerolist set
        !           661:
        !           662: %% converting gbase to a list of polynomials
        !           663: %% Be careful to the current ring!
        !           664:     ideg 2 lt {
        !           665:       gbase {expand} map /gbase1 set
        !           666:     }{
        !           667:       /gbase1
        !           668:         [ 0 1 r1 1 sub {/i set
        !           669:             gbase i get {expand} map vector_to_poly
        !           670:          } for ] def
        !           671:       } ifelse
        !           672:     gbase1 /gbase set
        !           673:
        !           674: %(ideg =) messagen ideg ::
        !           675: %(Computing psi1) message
        !           676: %%                        psi1
        !           677: %% Computes  D_{Y->X}^{r1} -->  D_{Y->X}^{r0} induced by gbase
        !           678: %% with weight  k <= k1 - m1vec
        !           679:     0 1 r1 1 sub {/i set
        !           680:       m1vec i get /m1i set
        !           681:       ee {expand} map  0  k1 m1i sub monomials /emonoi set
        !           682:       bfDtt  0  k1 m1i sub monomials /bfDttmonoi set
        !           683:       emonoi length /nmono set
        !           684:       0 1 nmono 1 sub {/j set
        !           685:         @@@.esymbol expand i npower /eei set
        !           686:         emonoi j get eei mul /eei set
        !           687:         gbase i get /dtp set
        !           688:         bfDttmonoi j get dtp mul /dtp set
        !           689:         0 1 d 1 sub {/k set
        !           690:           dtp [[bftt k get expand (0).]] replace /dtp set
        !           691:           dtp [[bfDtt k get  ee k get expand]] replace /dtp set
        !           692:         } for
        !           693:         dtp [[(h). (1).]] replace /dtp set
        !           694:         dtp (0). eq {
        !           695:           zerolist [eei] join /zerolist set
        !           696:         }{
        !           697:           psi1index [eei] join /psi1index set
        !           698:           psi1 [dtp] join /psi1 set
        !           699:         } ifelse
        !           700:       } for
        !           701:     } for
        !           702:
        !           703: %(ideg =) messagen ideg ::
        !           704: %(psi1 obtained.) message
        !           705: %(Computing psi1ker) message
        !           706:
        !           707: %% Computing psi1ker := Ker psi1 :
        !           708:     psi1 length 0 eq {
        !           709:       [ ] /psi1ker set
        !           710:     }{
        !           711:       psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
        !           712:       [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
        !           713:       psi1kervec length /pn set
        !           714:       psi1index length /pn0 set
        !           715:       [ ] /psi1ker set
        !           716:       0 1 pn 1 sub {/i set
        !           717:         psi1kervec i get /psi1i set
        !           718:         (0). /psi1keri set
        !           719:         0 1 pn0 1 sub {/j set
        !           720:           psi1index j get psi1i j get mul psi1keri add /psi1keri set
        !           721:         } for
        !           722:         psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
        !           723:       } for
        !           724:     } ifelse
        !           725:     zerolist psi1ker join /psi1ker set
        !           726: % Is it all right to use reducedBase here?
        !           727: %    psi1ker length 0 eq { }{
        !           728: %      psi1ker reducedBase /psi1ker set
        !           729: %    } ifelse
        !           730: %(ideg =) messagen ideg ::
        !           731: %(psi1ker obtained.) message
        !           732: %(Computing psi2image ...) message
        !           733:
        !           734: %%                                     psi2
        !           735: %% Computes the image of  D_{Y->X}^{r2} -->  D_{Y->X}^{r1} induced by syz
        !           736: %% with weight  m2vec <= k <= k1 - m2vec
        !           737:     /psi2image [
        !           738:       0 1 r2 1 sub {/i set
        !           739:         o.syz i get {expand} map vector_to_poly /syzi set
        !           740:         m2vec i get /m2i set
        !           741:         bfDtt  0  k1 m2i sub monomials /bfDttmonoi set
        !           742:         bfDttmonoi length /nmono set
        !           743:         0 1 nmono 1 sub {/j set
        !           744:           bfDttmonoi j get syzi mul /syzij set
        !           745:           0 1 d 1 sub {/k set
        !           746:             syzij [[bftt k get expand (0).]] replace /syzij set
        !           747:             syzij [[bfDtt k get ee k get expand]] replace /syzij set
        !           748:           } for
        !           749:           syzij [[(h). (1).]] replace /syzij set
        !           750:           syzij (0). eq { }{syzij} ifelse
        !           751:         } for
        !           752:       } for
        !           753:     ] def
        !           754:
        !           755: %(psi2image obtained.) message
        !           756: %(ideg = ) messagen ideg ::
        !           757: %(psi1ker = ) message psi1ker ::
        !           758: %(psi2image =) message psi2image ::
        !           759:
        !           760: %% Computes the quotient module  psi1ker/psi2image
        !           761:     psi1ker length /nker set
        !           762:     nker 0 eq {
        !           763:       [0 [ ]] /cohom set
        !           764:     }{
        !           765:       psi2image length /nim set
        !           766:       psi1ker psi2image join /psiall set
        !           767:       psiall {homogenize} map /psiall set
        !           768:       [psiall [(needSyz)]] groebner 2 get /psisyz set
        !           769:       psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
        !           770:       cohom {remove0} map /cohom set
        !           771:       cohom length 0 eq {
        !           772:         [nker [ ]] /cohom set
        !           773:       }{
        !           774:         cohom {homogenize} map /cohom set
        !           775:         [cohom] groebner 0 get reducedBase /cohom set
        !           776:         cohom {[[(h). (1).]] replace} map /cohom set
        !           777:         [nker cohom] trimModule /cohom set
        !           778:       } ifelse
        !           779:     } ifelse
        !           780:     cohomlist [cohom] join /cohomlist set
        !           781:     0 ideg sub print (-th cohomology:  ) messagen
        !           782:     cohom ::
        !           783:   } for
        !           784:
        !           785:   cohomlist /arg1 set
        !           786:   ] pop
        !           787:   popVariables
        !           788:   arg1
        !           789: } def
        !           790:
        !           791:
        !           792: % Reduce the module representation  A^r/[P_1,...,P_m]
        !           793: % by trimming unnecessary higher degree terms
        !           794: % [r [P1,...,p_m]] reduceModule --> [r1, [Q_1,...,Q_m1]]
        !           795: % The current ring must have @@@.esymbol as the highest degree variable.
        !           796: /trimModule {
        !           797:   /arg1 set
        !           798:   [ /r /ff /ffins /nff /i /ei /j /fj /fjin /qij /fjdeg ] pushVariables
        !           799:   [
        !           800:     arg1 0 get /r set
        !           801:     arg1 1 get /ff set
        !           802:     ff {homogenize} map /ff set
        !           803:     [ff] groebner 0 get reducedBase {[[(h). (1).]] replace} map /ff set
        !           804:     ff {init [[(h). (1).]] replace} map /ffins set
        !           805:     ff length /nff set
        !           806:
        !           807:     r 1 sub -1 0 {/i set
        !           808:       @@@.esymbol . i npower /ei set
        !           809:       0 1 nff 1 sub {/j set
        !           810:         0 /eifound set
        !           811:         ff j get /fj set
        !           812:         ffins j get /fjin set
        !           813:         ei [fjin] reduction 0 get /qij set
        !           814:         qij (0). eq {
        !           815:           1 /eifound set
        !           816:           1 break
        !           817:         }{ } ifelse
        !           818:       } for
        !           819:       eifound 0 eq break
        !           820:     } for
        !           821:     << eifound 1 eq >> << i 0 eq >> and {
        !           822:       0 /r set
        !           823:     }{
        !           824:       i 1 add /r set
        !           825:     } ifelse
        !           826:     /gg [ 0 1 nff 1 sub {/j set
        !           827:       ff j get /fj set
        !           828:       fj @@@.esymbol . coefficients 0 get 0 get (integer) dc /fjdeg set
        !           829:       fjdeg r lt {fj}{ } ifelse
        !           830:     } for ] def
        !           831:     [r gg] /arg1 set
        !           832:   ] pop
        !           833:   popVariables
        !           834:   arg1
        !           835: } def
        !           836:
        !           837: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           838: % syzygyV.sm1 ... free resolution adapted to the V-filtration
        !           839: %                 w.r.t. tt = (t_1,...,t_d) using h-homogenization.
        !           840: % usage:  Equations tt deg syzygyV
        !           841: % Oct. 21, 1997 ---  by T.Oaku
        !           842: % Version 19971021
        !           843: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           844: %% Computing a free resolution compatible with the V-filtration
        !           845: %% w.r.t. tt
        !           846: /syzygyV {
        !           847:   /arg3 set  %% rdegmax
        !           848:   /arg2 set  %% tt
        !           849:   /arg1 set  %% ff
        !           850:   [
        !           851:     /ff /tt /rdegmax /ttxx /aa /d /i /syzlist /rdeg
        !           852:     /nff /mvec /estr /ee /edeg /dffi /r0 /syzpoly
        !           853:     /syzi /syzij /syzpolyi /j
        !           854:     /gbase /o.syz /syzlist /mvecist
        !           855:     /r1 /m1vec /gbi /nonzero /gbijc /gbijd /gbij /maxtmp /max0 /gbase1
        !           856:     /m0vec
        !           857:   ] pushVariables
        !           858:   [
        !           859:     arg1 /ff set
        !           860:     arg2 /tt set
        !           861:     arg3 /rdegmax set
        !           862:
        !           863:     BFvarlist /ttxx set
        !           864:     BFparlist /aa set
        !           865:     tt length /d set
        !           866:
        !           867:     ttxx tt setminus /xx set
        !           868:
        !           869:     [ ] /syzlist set
        !           870:     [ ] /mveclist set
        !           871:
        !           872: %% start the loop (the counter rdeg represents the degree of the resolution)
        !           873:   0 1 rdegmax {/rdeg set
        !           874:     ff length /nff set
        !           875:
        !           876: %%  r is the number of graduation variables;
        !           877: %%  ff is a list of r0-vectors;
        !           878: %%  r = r0 from the 2nd step (i.e. for rdeg >= 1);
        !           879: %%  ee = [(u_1),...,(u_r)] or [@@@.esymbol] (in the 1st step).
        !           880: %%  From
        !           881: %%                     ff
        !           882: %%  ... <--- D_X^{r0} <--- D_X^{nff},
        !           883: %%  computes
        !           884: %%                   gbase          syz
        !           885: %%  ... <--- D_X^{r0} <--- D_X^{r1} <--- D_X^{r2}.
        !           886: %%           m0vec         m1vec         m2vec
        !           887:
        !           888:     rdeg 0 eq {
        !           889:       1 /r set
        !           890:       [@@@.esymbol] /ee set
        !           891:       [ 0 ] /mvec set
        !           892:       [ 0 ] /mvec0 set
        !           893:     }{
        !           894:       r1 /r set
        !           895:       r1 /r0 set
        !           896:       m1vec /mvec set
        !           897:       BFu /estr set
        !           898:       /ee
        !           899:         [ 1 1 r {/i set
        !           900:           estr i toString 2 cat_n} for ]
        !           901:       def
        !           902:     } ifelse
        !           903:
        !           904: %%  (Set up a ring with mvec = ) messagen mvec ::
        !           905:     ee tt xx mvec setupDringVshift
        !           906:
        !           907:     rdeg 0 eq {
        !           908:       0 /edeg set
        !           909:       0 1 nff 1 sub {/i set
        !           910:         ff i get expand /ffi set
        !           911:         ffi @@@.esymbol . coefficients 0 get 0 get (integer) dc /dffi set
        !           912:         dffi edeg gt { dffi /edeg set}{ } ifelse
        !           913:       } for
        !           914:       edeg 1 add /r0 set     %% the input ff is a list of r0-vectors
        !           915:       /m0vec [ 1 1 r0 {pop 0} for ] def
        !           916:     }{
        !           917:       o.syz length /nff set
        !           918:       /syzpoly [ 0 1 nff 1 sub {/i set
        !           919:         o.syz i get /syzi set
        !           920:         (0). /syzpolyi set
        !           921:         0 1 r1 1 sub {/j set
        !           922:           syzi j get (string) dc expand /syzij set
        !           923:           syzij << ee j get expand >> mul /syzij set
        !           924:           syzpolyi syzij add /syzpolyi set
        !           925:         } for
        !           926:         syzpolyi
        !           927:       } for ] def
        !           928:       syzpoly {(string) dc} map /ff set
        !           929:      } ifelse
        !           930:
        !           931:      mveclist [m0vec] join /mveclist set
        !           932:
        !           933:     ff {expand [[(h). (1).]] replace homogenize} map /ff set
        !           934:     [ff] groebner 0 get reducedBase /gbase set
        !           935:     [gbase [(needSyz)]] groebner 2 get /o.syz set
        !           936:
        !           937:     gbase length /r1 set
        !           938:     o.syz length /nff set
        !           939:
        !           940:     0 rdeg eq {
        !           941:       gbase {tt fwh_order} map /m1vec set
        !           942:     }{
        !           943:        /m1vec [
        !           944:         0 1 r1 1 sub {/i set
        !           945:           gbase i get /gbi set
        !           946:           0 /nonzero set
        !           947:           0 1 r0 1 sub {/j set
        !           948:             gbi << ee j get expand >> coefficients /gbijc set
        !           949:             gbijc 0 get 0 get (integer) dc /gbijd set
        !           950:             gbijd 0 eq {  }{
        !           951:               gbijc 1 get 0 get /gbij set
        !           952:               gbij tt fwh_order  m0vec j get  add /maxtmp set
        !           953:               nonzero 0 eq { maxtmp /max0 set }{
        !           954:                 maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
        !           955:               } ifelse
        !           956:               1 /nonzero set
        !           957:             } ifelse
        !           958:           } for
        !           959:         max0 } for ] def
        !           960:     } ifelse
        !           961:
        !           962:     rdeg 0 eq {
        !           963:       gbase {[[(h). (1).]] replace (string) dc} map /gbase1 set
        !           964:     }{
        !           965:       /gbase1 [ 0 1 r1 1 sub {/i set
        !           966:         gbase i get /gbi set
        !           967:         [ 0 1 r0 1 sub {/j set
        !           968:           gbi << ee j get expand >> coefficients /gbijc set
        !           969:           gbijc 0 get 0 get (integer) dc /gbijd set
        !           970:           gbijd 0 eq { (0) }{
        !           971:             gbijc 1 get 0 get [[(h). (1).]] replace (string) dc
        !           972:           } ifelse
        !           973:         } for ]
        !           974:       } for ] def
        !           975:     } ifelse
        !           976:
        !           977:     syzlist [gbase1] join /syzlist set
        !           978:     m1vec /m0vec set
        !           979:
        !           980:     o.syz length 0 eq {
        !           981:       syzlist [o.syz] join /syzlist set
        !           982:       mveclist [m1vec] join /mveclist set
        !           983:       1 break
        !           984:     }{ } ifelse
        !           985:   } for
        !           986:   [syzlist mveclist] /arg1 set
        !           987:   ] pop
        !           988:   popVariables
        !           989:   arg1
        !           990: } def
        !           991: %%%%%%%%%%%%%%%%%%%%%%%%% Libraries %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           992: %% set up a ring for the shifted V-weight given by mvec:
        !           993: %% ee tt xx mvec setupDringVshift
        !           994: %% ee = [e_1,...,e_r], tt = [t_1,...,t_d], xx = [x_1,...,x_n]
        !           995: %% BFparlist = [a_1,...,a_m] (global variable)
        !           996:
        !           997: /setupDringVshift {
        !           998:   /arg4 set /arg3 set /arg2 set /arg1 set
        !           999:   [
        !          1000:     /ee /xx /tt /aa /mvec /allvarlist /allDvarlist /r /n /m /d /i /j /k
        !          1001: %    /Dee /Dxx /Dtt /Daa /dnm /rdnm /mat1 /mat2 /mat3 /mat4
        !          1002:   ] pushVariables
        !          1003:   [
        !          1004:     arg1 /ee set
        !          1005:     arg2 /tt set
        !          1006:     arg3 /xx set
        !          1007:     arg4 /mvec set
        !          1008:     BFparlist /aa set
        !          1009:
        !          1010:     /allvarlist
        !          1011:       ee tt join xx join aa join [(H)] join
        !          1012:     def
        !          1013:
        !          1014:     ee length /r set
        !          1015:     tt length /d set
        !          1016:     xx length /n set
        !          1017:     aa length /m set
        !          1018:
        !          1019:     d n add m add /dnm set
        !          1020:     r dnm add /rdnm set
        !          1021:
        !          1022:     ee {xtoDx} map /Dee set
        !          1023:     tt {xtoDx} map /Dtt set
        !          1024:     xx {xtoDx} map /Dxx set
        !          1025:     aa {xtoDx} map /Daa set
        !          1026:
        !          1027:     /allDvarlist
        !          1028:       Dee Dtt join Dxx join Daa join [(h)] join
        !          1029:     def
        !          1030:
        !          1031:     allvarlist reverse  /mat1 set allDvarlist reverse /mat2 set
        !          1032:     [0 1 1 1  rdnm 1 add  1 1 1  dnm 1 add]                /mat3 set
        !          1033:     [
        !          1034:       [ 0 1 r 1 sub {/i set mvec i get} for %%[(e_1) mvec_1...(e_r) mvec_r
        !          1035:         1 1 d {pop -1} for                  %% (t_1) -1 ...   (t_d) -1
        !          1036:         1 1 n {pop 0 } for                  %% (x_1) 0  ...   (x_n) 0
        !          1037:         1 1 m {pop 0 } for                  %% (a_1) 0  ...   (a_m) 0
        !          1038:                    0                        %% (H) 0
        !          1039:         1 1 r {pop 0 } for                  %% (E_1) 0  ...   (E_d) 0
        !          1040:         1 1 d {pop 1 } for                  %% (Dt_1) 1 ...   (Dt_d) 1
        !          1041:         1 1 n {pop 0 } for                  %% (Dx_1) 0 ...   (Dx_n) 0
        !          1042:         1 1 m {pop 0 } for                  %% (Da_1) 0 ...   (Da_m) 0
        !          1043:                    0                        %% (h) 0 ]
        !          1044:       ]
        !          1045:       [ 1 1 r {pop 1 } for                  %%[(e_1) 1  ...   (e_r) 1
        !          1046:         1 1 d {pop 1 } for                  %% (t_1) 1  ...   (t_d) 1
        !          1047:         1 1 n {pop 1 } for                  %% (x_1) 1  ...   (x_n) 1
        !          1048:         1 1 m {pop 0 } for                  %% (a_1) 0  ...   (a_m) 0
        !          1049:                    0                        %% (H) 0
        !          1050:         1 1 r {pop 0 } for                  %% (E_1) 0  ...   (E_d) 0
        !          1051:         1 1 d {pop 1 } for                  %% (Dt_1) 1 ...   (Dt_d) 1
        !          1052:         1 1 n {pop 1 } for                  %% (Dx_1) 1 ...   (Dx_n) 1
        !          1053:         1 1 m {pop 0 } for                  %% (Da_1) 0 ...   (Da_m) 0
        !          1054:                    0                        %% (h) 0 ]
        !          1055:       ]
        !          1056:       [ 1 1 r {pop 0 } for                  %%[(e_1) 0  ...   (e_r) 0
        !          1057:         1 1 d {pop 0 } for                  %% (t_1) 0  ...   (t_d) 0
        !          1058:         1 1 n {pop 0 } for                  %% (x_1) 0  ...   (x_n) 0
        !          1059:         1 1 m {pop 1 } for                  %% (a_1) 1  ...   (a_m) 1
        !          1060:                    0                        %% (H) 0
        !          1061:         1 1 r {pop 0 } for                  %% (E_1) 0  ...   (E_d) 0
        !          1062:         1 1 d {pop 0 } for                  %% (Dt_1) 0 ...   (Dt_d) 0
        !          1063:         1 1 n {pop 0 } for                  %% (Dx_1) 0 ...   (Dx_n) 0
        !          1064:         1 1 m {pop 0 } for                  %% (Da_1) 0 ...   (Da_m) 0
        !          1065:                    0                        %% (h) 0 ]
        !          1066:       ]
        !          1067:       rdnm 1 sub -1 0 {/i set
        !          1068:         [
        !          1069:           0 1 rdnm {pop 0} for
        !          1070:           0 1 rdnm 1 sub {/j set
        !          1071:             i j eq { -1 }{ 0 } ifelse
        !          1072:           } for
        !          1073:           0
        !          1074:         ]
        !          1075:       } for
        !          1076:       rdnm 1 sub -1 0 {/i set
        !          1077:         [
        !          1078:           0 1 rdnm 1 sub {/j set
        !          1079:             i j eq { -1 }{ 0 } ifelse
        !          1080:           } for
        !          1081:           0
        !          1082:           0 1 rdnm {pop 0} for
        !          1083:         ]
        !          1084:       } for
        !          1085:       [ 0 1 rdnm {pop 0} for
        !          1086:         0 1 rdnm 1 sub {pop 0} for
        !          1087:         1
        !          1088:       ]
        !          1089:     ]                                                          /mat4 set
        !          1090:     mat1 mat2 mat3 mat4 [(mpMult) (diff)] set_up_ring@
        !          1091:     (red@) (module1) switch_function
        !          1092:     (grade) (module1) switch_function
        !          1093:   ] pop
        !          1094:   popVariables
        !          1095: } def
        !          1096:
        !          1097: /remove0 {
        !          1098:   /arg1 set
        !          1099:   arg1 (0). eq
        !          1100:   { } {arg1} ifelse
        !          1101: } def
        !          1102:
        !          1103: %% return a list of monomials of degree m with m0 <= m <= m1
        !          1104: %% usage: [(t1) ... (td)] m monomials
        !          1105: /monomials {
        !          1106:   /arg3 set  %% m1 (integer)
        !          1107:   /arg2 set  %% m0 (integer)
        !          1108:   /arg1 set  %% [(t1)., ... ,(td).] (polynonmial list)
        !          1109:   [/bftt /m /m0 /m1 /d /i /mns0 /j /n /Mn /k ] pushVariables
        !          1110:   [
        !          1111:     arg1 /bftt set
        !          1112:     arg2 /m0 set
        !          1113:     arg3 /m1 set
        !          1114:
        !          1115:     bftt length /d set
        !          1116:     d 0 eq { /mns [ ] def}{
        !          1117:     d 1 eq {
        !          1118:      /mns [ m0 1 m1 { /i set
        !          1119:         i -1 gt {bftt 0 get i npower}{ } ifelse
        !          1120:      } for ] def
        !          1121:     }
        !          1122:     {
        !          1123:      /mns [ 0 1 m1 { /i set
        !          1124:       bftt rest i i monomials /mns0 set
        !          1125:       mns0 length /n set
        !          1126:       0 1 n 1 sub { /j set
        !          1127:         mns0 j get /Mn set
        !          1128:           m0 i sub /m set
        !          1129:           m 0 lt { 0 /m set }{ } ifelse
        !          1130:           m 1 m1 i sub { /k set
        !          1131:             << bftt 0 get k npower >> Mn mul
        !          1132:           } for
        !          1133:       } for
        !          1134:      } for ] def
        !          1135:     } ifelse } ifelse
        !          1136:     mns /arg1 set
        !          1137:   ] pop
        !          1138:   popVariables
        !          1139:   arg1
        !          1140: } def
        !          1141:
        !          1142: %% projection to the first m componets of a vector
        !          1143: %% [P1,...,Pm,...] m proj ---> [P1,...,Pm]
        !          1144: /proj {
        !          1145:   /arg2 set
        !          1146:   /arg1 set
        !          1147:   [/n /m /vec /projvec] pushVariables
        !          1148:   [
        !          1149:     arg2 /m set
        !          1150:     arg1 /vec set
        !          1151:     vec length /n set
        !          1152:
        !          1153:     /projvec [
        !          1154:       vec aload
        !          1155:       0 1 << n m sub >> { pop pop } for
        !          1156:     ] def
        !          1157:
        !          1158:     projvec /arg1 set
        !          1159:   ] pop
        !          1160:   popVariables
        !          1161:   arg1
        !          1162: } def
        !          1163:
        !          1164: /notidentical {
        !          1165:   /arg2 set
        !          1166:   /arg1 set
        !          1167:   arg1 arg2 eq
        !          1168:   { } {arg1} ifelse
        !          1169: } def
        !          1170:
        !          1171: %% [u1,...] [v1,...] setminus --> [u1,...] \setminus [v1,...]
        !          1172: /setminus {
        !          1173:   /arg2 set /arg1 set
        !          1174:   [ /Set1 /Set2 /n2 /i ] pushVariables
        !          1175:   [
        !          1176:     arg1 /Set1 set  arg2 /Set2 set
        !          1177:     Set2 length /n2 set
        !          1178:     0 1 n2 1 sub {/i set
        !          1179:        Set1  Set2 i get  complement.oaku /Set1 set
        !          1180:     } for
        !          1181:     Set1 /arg1 set
        !          1182:   ] pop
        !          1183:   popVariables
        !          1184:   arg1
        !          1185: } def
        !          1186:
        !          1187: %% (list arg1) \setminus {(an element arg2)}
        !          1188: /complement.oaku {
        !          1189:   /arg2 set /arg1 set
        !          1190:   arg1 { arg2 notidentical } map
        !          1191: } def
        !          1192:
        !          1193: %% convert a polynomial to one in the current ring
        !          1194: /reexpand {
        !          1195:   /arg1 set
        !          1196:   arg1 {(string) dc expand} map
        !          1197: } def
        !          1198:
        !          1199: %% Op (poly) [(t1) (t2) ...] fwh_order ---> FW-ord(Op) (integer)
        !          1200: %% The current ring must be adapted to the V-filtration!
        !          1201: /fwh_order {
        !          1202:  /arg2 set  %% bftt (string list)
        !          1203:  /arg1 set  %% Op (poly)
        !          1204:  [/Op /bftt /fws /m /fwsDt /k /d /i /tt /dtt] pushVariables
        !          1205:  [
        !          1206:   arg1 /Op set
        !          1207:   arg2 /bftt set
        !          1208:   Op init /fws set
        !          1209:   bftt length /d set
        !          1210:   0 /k set
        !          1211:   0 /m set
        !          1212:   0 1 d 1 sub { /i set
        !          1213:     /tt bftt i get expand def
        !          1214:     /dtt bftt i get xtoDx expand def
        !          1215:     fws dtt coefficients 0 get 0 get (integer) dc m add /m set
        !          1216:     fws tt  coefficients 0 get 0 get (integer) dc k add /k set
        !          1217:   } for
        !          1218:   m k sub (integer) data_conversion /arg1 set
        !          1219:  ] pop
        !          1220:  popVariables
        !          1221:  arg1
        !          1222: } def
        !          1223:
        !          1224: %% FW-homogenization
        !          1225: %% Op (string) [(t1) (t2) ...] fw_homogenize ---> h(Op) (string)
        !          1226: /fwm_homogenize {
        !          1227:   /arg2 set  %% bft (string list)
        !          1228:   /arg1 set  %% an operator (string)
        !          1229:   [ /bftt /bft /bfDt /bfht /bfhDt /Op /degs /m /mn /d /i ] pushVariables
        !          1230:   [
        !          1231:     /Op arg1 expand def
        !          1232:     /bftt arg2 def
        !          1233:     bftt length /d set
        !          1234:
        !          1235:     0 1 d 1 sub { /i set
        !          1236:       bftt i get /bft set
        !          1237:       bft xtoDx /bfDt set
        !          1238:       BFs (^(-1)*) bft 3 cat_n /bfht set
        !          1239:       BFs (*) bfDt 3 cat_n /bfhDt set
        !          1240:       Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
        !          1241:         /Op set
        !          1242:     } for
        !          1243:     Op BFs expand coefficients 0 get
        !          1244:         {(integer) data_conversion} map /degs set
        !          1245:     degs << degs length 1 sub >> get /m set
        !          1246:     0 m sub /mn set
        !          1247:     << BFs expand mn powerZ >> Op mul /Op set
        !          1248:     Op (string) data_conversion /arg1 set
        !          1249:   ] pop
        !          1250:   popVariables
        !          1251:   arg1
        !          1252: } def
        !          1253:
        !          1254: %% FW-principal part of an operator (FW-homogeneous)
        !          1255: %%  fw_psi  from bfunc.sm1
        !          1256: %%  Op (poly) fw_symbol --->  FW-symbol(Op)  (poly)
        !          1257: /fw_symbol {
        !          1258:   [[(h). (1).]] replace (s). coefficients 1 get 0 get
        !          1259: } def
        !          1260:
        !          1261: %% FW-homogenization
        !          1262: %% Op (string) (t) fw_homogenize ---> h(Op) (string)
        !          1263: /fw_homogenize {
        !          1264:   /arg2 set  %% bft (string)
        !          1265:   /arg1 set  %% an operator (string)
        !          1266:   [ /bft /bfDt /bfht /bfhDt /Op /degs /m /mn ] pushVariables
        !          1267:   [
        !          1268:     /Op arg1 expand def
        !          1269:     /bft arg2 def
        !          1270:     bft xtoDx /bfDt set
        !          1271:     BFs (^(-1)*) bft 3 cat_n /bfht set
        !          1272:     BFs (*) bfDt 3 cat_n /bfhDt set
        !          1273:     Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
        !          1274:       /Op set
        !          1275:     Op BFs expand coefficients 0 get
        !          1276:       {(integer) data_conversion} map /degs set
        !          1277:     degs << degs length 1 sub >> get /m set
        !          1278:     0 m sub /mn set
        !          1279:     << BFs expand mn powerZ >> Op mul /Op set
        !          1280:     Op (string) data_conversion /arg1 set
        !          1281:   ] pop
        !          1282:   popVariables
        !          1283:   arg1
        !          1284: } def
        !          1285:
        !          1286: %% get the FW-order
        !          1287: %% Op (poly) (t) fw_order ---> FW-ord(Op) (integer)
        !          1288: %% Op should be FW-homogenized.
        !          1289: /fw_order {
        !          1290:  /arg2 set  %% bft (string)
        !          1291:  /arg1 set  %% Op (poly)
        !          1292:  [/Op /bft /fws /m /fwsDt /k /tt /dtt] pushVariables
        !          1293:  [
        !          1294:   arg1 /Op set
        !          1295:   arg2 /bft set
        !          1296:   Op fw_symbol /fws set
        !          1297:   /tt bft expand def
        !          1298:   /dtt bft xtoDx  expand def
        !          1299:   fws [[BFs expand  (1).]] replace /fws set
        !          1300:   fws dtt coefficients 0 get 0 get /m set
        !          1301:   fws dtt coefficients 1 get 0 get /fwsDt set
        !          1302:   fwsDt tt coefficients 0 get 0 get /k set
        !          1303:   m k sub (integer) data_conversion /arg1 set
        !          1304:  ] pop
        !          1305:  popVariables
        !          1306:  arg1
        !          1307: } def
        !          1308:
        !          1309: %% psi(P)(s)
        !          1310: %% Op (poly) (t) (string) fw_psi ---> psi(P) (poly)
        !          1311: %% Op should be FW-homogeneous.
        !          1312: /fw_psi {
        !          1313:  /arg2 set  %% bft (string)
        !          1314:  /arg1 set  %% Op  (polynomial)
        !          1315:  [/bft /bfDt /P /tt /dtt /k /Q /i /m /kk /PPt /PPC /kk /Ss] pushVariables
        !          1316:  [
        !          1317:   arg2 /bft set
        !          1318:   arg1 fw_symbol /P set
        !          1319:   /bfDt bft xtoDx def
        !          1320:   /tt bft expand def  /dtt bfDt expand def
        !          1321:   P bft fw_order /k set
        !          1322:     << 1 1 k >>
        !          1323:     {pop tt P mul /P set }
        !          1324:     for
        !          1325:     << -1 -1 k >>
        !          1326:     {pop dtt P mul /P set }
        !          1327:     for
        !          1328:   (0) expand /Q set
        !          1329:   P dtt coefficients 0 get length /m set
        !          1330:   0 1 << m 1 sub >>
        !          1331:   {
        !          1332:     /i set
        !          1333:     P dtt coefficients 0 get i get /kk set
        !          1334:     kk (integer) data_conversion /kk set
        !          1335:     P dtt coefficients 1 get i get /PPt set
        !          1336:     PPt tt coefficients 1 get 0 get /PPC set
        !          1337:     BFth expand /Ss set
        !          1338:     0 1 << kk 1 sub >> {
        !          1339:       pop
        !          1340:       PPC Ss mul /PPC set
        !          1341:       Ss (1) expand sub /Ss set
        !          1342:     } for
        !          1343:     Q PPC add /Q set
        !          1344:   } for
        !          1345:   Q  /arg1 set
        !          1346:  ] pop
        !          1347:  popVariables
        !          1348:  arg1
        !          1349: } def
        !          1350:
        !          1351: %% get the FW-order
        !          1352: %% Op (poly) [(t1) (t2) ...] fwm_order ---> FW-ord(Op) (integer)
        !          1353: %% Op should be FW-homogenized.
        !          1354: /fwm_order {
        !          1355:  /arg2 set  %% bftt (string list)
        !          1356:  /arg1 set  %% Op (poly)
        !          1357:  [/Op /bftt /fws /m /fwsDt /k /d /i /tt /dtt] pushVariables
        !          1358:  [
        !          1359:   arg1 /Op set
        !          1360:   arg2 /bftt set
        !          1361:   Op fw_symbol /fws set
        !          1362:   fws init /fws set
        !          1363:   fws [[BFs expand  (1).]] replace /fws set
        !          1364:   bftt length /d set
        !          1365:   0 /k set
        !          1366:   0 /m set
        !          1367:   0 1 d 1 sub { /i set
        !          1368:     /tt bftt i get expand def
        !          1369:     /dtt bftt i get xtoDx expand def
        !          1370:     fws dtt coefficients 0 get 0 get (integer) dc m add /m set
        !          1371:     fws tt  coefficients 0 get 0 get (integer) dc k add /k set
        !          1372:   } for
        !          1373:   m k sub (integer) data_conversion /arg1 set
        !          1374:  ] pop
        !          1375:  popVariables
        !          1376:  arg1
        !          1377: } def
        !          1378:
        !          1379: %% (x1) --> (Dx1)
        !          1380: /xtoDx {
        !          1381:   /arg1 set
        !          1382:   @@@.Dsymbol arg1 2 cat_n
        !          1383: } def
        !          1384:
        !          1385: %% [(x1) (x2) (x3)] ---> (x1,x2,x3)
        !          1386: /listtostring {
        !          1387:   /arg1 set
        !          1388:   [/n /j /ary /str] pushVariables
        !          1389:   [
        !          1390:     /ary arg1 def
        !          1391:     /n ary length def
        !          1392:     arg1 0 get /str set
        !          1393:     n 1 gt
        !          1394:       { str (,) 2 cat_n /str set }{ }
        !          1395:     ifelse
        !          1396:     1 1 n 1 sub {
        !          1397:       /j set
        !          1398:       j n 1 sub eq
        !          1399:         {str << ary j get >>  2 cat_n /str set}
        !          1400:         {str << ary j get >>  (,) 3 cat_n /str set}
        !          1401:       ifelse
        !          1402:     } for
        !          1403:     /arg1 str def
        !          1404:   ] pop
        !          1405:   popVariables
        !          1406:   arg1
        !          1407: } def
        !          1408:
        !          1409: %% converting a vector of polynomials [P1 P2 ...] to P1 + P2*e +...
        !          1410: /vector_to_poly {
        !          1411:   /arg1 set
        !          1412:   [/aVec /nVec /eForm /j /aVecj ] pushVariables
        !          1413:   [
        !          1414:     arg1 /aVec set
        !          1415:     aVec length /nVec set
        !          1416:     (0). /eForm  set
        !          1417:     0 1 nVec 1 sub {
        !          1418:       /j set
        !          1419:       aVec j get /aVecj set
        !          1420:       @@@.esymbol . j npower aVecj mul eForm add /eForm set
        !          1421:     } for
        !          1422:   eForm /arg1 set
        !          1423:   ] pop
        !          1424:   popVariables
        !          1425:   arg1
        !          1426: } def
        !          1427:
        !          1428: %% setup the ring of differential operators with the variables varlist
        !          1429: %% and parameters BFparlist
        !          1430: %% varlist setupBFring
        !          1431: /setupDring {
        !          1432:   /arg1 set
        !          1433:   [ /varlist /bft /allvarlist /n /dvarlist /D_weight /i
        !          1434:   ] pushVariables
        !          1435:   [
        !          1436:     arg1 /varlist set
        !          1437:     /allvarlist
        !          1438:       varlist BFparlist join
        !          1439:     def
        !          1440:     varlist length /n set
        !          1441:     varlist {xtoDx} map /dvarlist set
        !          1442:     /D_weight
        !          1443:     [ [ 0 1 n 1 sub
        !          1444:           { /i set dvarlist i get 1 }
        !          1445:         for ]
        !          1446:       [
        !          1447:         0 1 n 1 sub
        !          1448:           { /i set varlist i get 1 }
        !          1449:         for ]
        !          1450:     ] def
        !          1451:
        !          1452:     [ allvarlist listtostring ring_of_differential_operators
        !          1453:       D_weight weight_vector
        !          1454:     0] define_ring
        !          1455:
        !          1456:   ] pop
        !          1457:   popVariables
        !          1458: } def
        !          1459:
        !          1460: %% var (poly) m (integer) ---> var^m (poly)
        !          1461: /powerZ {
        !          1462:   /arg2 set %% m
        !          1463:   /arg1 set %% Var
        !          1464:   [ /m /var /varstr /pow /nvar] pushVariables
        !          1465:   [
        !          1466:     arg1 /var set
        !          1467:     arg2 /m set
        !          1468:     var (string) data_conversion /varstr set
        !          1469:     m -1 gt
        !          1470:       { var m npower /pow set}
        !          1471:       { varstr (^(-1)) 2 cat_n expand /nvar set
        !          1472:         nvar << 0 m sub >> npower /pow set
        !          1473:        }
        !          1474:     ifelse
        !          1475:     pow /arg1 set
        !          1476:   ] pop
        !          1477:   popVariables
        !          1478:   arg1
        !          1479: } def
        !          1480:
        !          1481:
        !          1482: %% added on April 14, 1998:
        !          1483: %% P [(Dt1). (Dt2). ...] mvec k Vtruncate_below
        !          1484: %% --> the part of P of degree >= mvec - k w.r.t. [(Dt1). ..]
        !          1485:
        !          1486: /Vtruncate_below {
        !          1487:   /arg4 set /arg3 set /arg2 set /arg1 set
        !          1488:   [/P /bftt /k /Q /InP /DegP /edegP /mvec /i] pushVariables
        !          1489:   [
        !          1490:     arg1 /P set
        !          1491:     arg2 /bftt set
        !          1492:     arg3 /mvec set
        !          1493:     arg4 /k set
        !          1494:     (0). /Q set
        !          1495:     {
        !          1496:       P (0). eq {exit} {  } ifelse
        !          1497:       P init /InP set
        !          1498:       InP bftt total_degree /DegP set
        !          1499:       InP @@@.esymbol . coefficients 0 get 0 get (integer) dc /i set
        !          1500:       DegP << k mvec i get sub >> lt {  } {InP Q add /Q set } ifelse
        !          1501:       P InP sub /P set
        !          1502:     } loop
        !          1503:     Q /arg1 set
        !          1504:   ] pop
        !          1505:   popVariables
        !          1506:   arg1
        !          1507: } def
        !          1508:
        !          1509: %% P (monomial) [(t1). ,...] total_deg
        !          1510: %% --> the total degree (integer) of P w.r.t. [(t1).,..]
        !          1511: /total_degree {
        !          1512:   /arg2 set /arg1 set
        !          1513:   [/P /bftt /d /j /PC /tdeg ] pushVariables
        !          1514:   [
        !          1515:     arg1 /P set
        !          1516:     arg2 /bftt set
        !          1517:     bftt length /d set
        !          1518:     0 /tdeg set
        !          1519:     0 1 d 1 sub {/j set
        !          1520:       P << bftt j get >> coefficients /PC set
        !          1521:       PC 0 get 0 get (integer) dc  tdeg add /tdeg set
        !          1522:       PC 1 get 0 get /P set
        !          1523:     } for
        !          1524:     tdeg /arg1 set
        !          1525:   ] pop
        !          1526:   popVariables
        !          1527:   arg1
        !          1528: } def
        !          1529:

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