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

Annotation of OpenXM/src/kan96xx/Doc/restall_s.sm1.org, Revision 1.1.1.1

1.1       maekawa     1: %%changed the following symbols.
                      2: %% complement ==> oaku.complement
                      3: %% syz ==> o.syz
                      4:
                      5: %%%%%%%%%%%%%%%%%%%%%%% restall.sm1 (Version 19980415) %%%%%%%%%%%%%%%%%%%%%%%
                      6: (restall_s.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: (Schreyer Version: 19980415 by N.Takayama & T.Oaku) message-quiet
                      9: (usage: [(P1)...] [(t1)...] k0 k1 deg restall_s -> cohomologies of restriction)
                     10: message-quiet
                     11: (       [(P1)...] [(t1)...] k0 k1 deg intall_s --> cohomologies of integration)
                     12: message-quiet
                     13: % History: Nov.10, 1997, Apr.15,1998
                     14: %%%%%%%%%%%%%%%%%%%%%%%%%%%% Global variables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                     15: %/BFvarlist %% Set all the variables (except s and the parameters) here.
                     16: /BFs (s) def
                     17: /BFth (s) def
                     18: /BFu (u) def
                     19:
                     20: [(x) (y)] /BFvarlist set
                     21: [ ] /BFparlist set
                     22:
                     23: /BFff
                     24:   [    $x^3-y^2$ , $2*x*Dx + 3*y*Dy + 6$ , $2*y*Dx + 3*x^2*Dy$ ]
                     25: def
                     26:
                     27: 0 /Schreyer set
                     28: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                     29: %% The cohomology groups of the restriction
                     30: %% [(P1)...] [(t1)...] k0 k1 degmax restall
                     31: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
                     32:
                     33: /restall_s {
                     34:   /arg5 set %% degmax
                     35:   /arg4 set %% k1
                     36:   /arg3 set %% k0
                     37:   /arg2 set %% [(t1) ... (td)]
                     38:   /arg1 set %% BFequations
                     39:   [
                     40:      /ff /bftt /k0 /k1 /degmax /syzlist /mveclist /cohomlist
                     41:      /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
                     42:      /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
                     43:      /psi1 /psi1ker /psi2image
                     44:      /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
                     45:      /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
                     46:   ] pushVariables
                     47:   [
                     48:     /ff arg1 def  /bftt arg2 def  /k0 arg3 def  /k1 arg4 def
                     49:     /degmax arg5 def
                     50:     bftt length /d set
                     51:
                     52:     (Computing a free resolution ... ) message
                     53:     Schreyer 2 eq {ff bftt degmax resolution_Sh /syzlist set}{ } ifelse
                     54:     Schreyer 1 eq {ff bftt degmax resolution_SV /syzlist set}{ } ifelse
                     55:     Schreyer 0 eq {ff bftt degmax resolution_nsV /syzlist set}{ } ifelse
                     56:
                     57:     syzlist /BFresolution set
                     58:     (A free resolution obtained.) message
                     59:
                     60:     BFvarlist /ttxx set
                     61:     BFparlist /aa set
                     62:     [BFs] ttxx join aa join /allvarlist set
                     63:     ttxx length /dn set
                     64:     ttxx {xtoDx} map /Dttxx set
                     65:
                     66:     /BFs_weight
                     67:       [ [ BFs 1 ]
                     68:         [ 0 1 dn 1 sub
                     69:             { /i set Dttxx i get 1 }
                     70:           for
                     71:           0 1 dn 1 sub
                     72:             { /i set ttxx i get 1 }
                     73:           for ]
                     74:       ] def
                     75:
                     76:     [ allvarlist listtostring ring_of_differential_operators
                     77:       BFs_weight weight_vector 0 ] define_ring
                     78:
                     79: %% Reformatting the free resolution:
                     80: %%  [[f1,f2,..],[syz1,...]] --> [[[f1],[f2],...],[syz,...]] (strings)
                     81: %% (to be modified for the case with more than one unknowns.)
                     82:
                     83:     Schreyer 0 gt {
                     84:       /syzlist1 [
                     85:         syzlist 0 get /syz0 set
                     86:         [ 0 1 syz0 length 1 sub {/i set
                     87:           [ syz0 i get (string) dc ]
                     88:         } for ]
                     89:         1 1 degmax {/i set
                     90:           syzlist 1 get i 1 sub get {toStrings} map
                     91:         } for
                     92:       ] def
                     93:       syzlist1 /syzlist set
                     94:     }{
                     95:       /syzlist1 [
                     96:         syzlist 0 get /syz0 set
                     97:         [ 0 1 syz0 length 1 sub {/i set
                     98:           [ syz0 i get (string) dc ]
                     99:         } for ]
                    100:         1 1 degmax {/i set
                    101:           syzlist i get {toStrings} map
                    102:         } for
                    103:       ] def
                    104:       syzlist1 /syzlist set
                    105:     } ifelse
                    106:
                    107:     [ ] /cohomlist set
                    108:
                    109: %% Start the loop:
                    110:   0 1 degmax {/ideg set
                    111:
                    112: %(new loop: ) messagen ideg ::
                    113:
                    114:     ideg 0 eq {
                    115:        1 /r0 set
                    116:        1 /r1 set
                    117:       [ [ (0) ] ] /gbase set
                    118:       [ 0 ] /m0vec set
                    119:       [ 0 ] /m1vec set
                    120:     }{
                    121:       syzlist  << ideg 1 sub >> get /gbase set
                    122:       r0 /r1 set
                    123:     } ifelse
                    124:     syzlist     ideg          get /o.syz   set
                    125:
                    126: %%                                       o.syz       gbase
                    127: %%                                D^{r2} --> D^{r1} --> D^{r0}
                    128: %% with weight vectors:           m2vec      m1vec      m0vec
                    129: %% which will induce a complex
                    130: %%                                     psi2              psi1
                    131: %%                        D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
                    132:
                    133:     gbase length /r1 set
                    134:     o.syz length /r2 set
                    135:
                    136: %% (Computing the weight vector m2vec from m1vec and syz) message
                    137:       /m2vec [
                    138:         0 1 r2 1 sub {/i set
                    139:           o.syz i get /syzi set
                    140:           0 /nonzero set
                    141:           0 1 r1 1 sub {/j set
                    142:             syzi j get expand /syzij set
                    143:             syzij (0). eq {  }{
                    144:               syzij bftt fwh_order  m1vec j get  add /maxtmp set
                    145:               nonzero 0 eq { maxtmp /max0 set }{
                    146:                 maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
                    147:               } ifelse
                    148:             1 /nonzero set
                    149:             } ifelse
                    150:           } for
                    151:         max0 } for ] def
                    152:
                    153: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
                    154:     BFu /estr set
                    155:     /ee
                    156:       [ 1 1 d {/i set estr i toString 2 cat_n} for ]
                    157:     def
                    158:     [@@@.esymbol ] ee join /eee set
                    159:
                    160: %%(Setting up a ring that represents D_{Y->X}^{r1}) message
                    161:     eee length /neee set
                    162:     /eeemvec [ 1 1 neee {pop 1} for ] def
                    163:     eee [ ] [BFs] BFvarlist join eeemvec setupDringVshift
                    164:     bftt {xtoDx expand} map /bfDtt set
                    165:     [ ] /psi1 set
                    166:     [ ] /psi1index set
                    167:     [ ] /zerolist set
                    168:
                    169: %%(converting gbase to a list of polynomials) message
                    170:     /gbase1
                    171:       [ 0 1 r1 1 sub {/i set
                    172:           gbase i get {expand [[BFs expand (1).]] replace} map vector_to_poly
                    173:        } for ] def
                    174:
                    175:     gbase1 /gbase set
                    176:
                    177: %%(ideg =) messagen ideg ::
                    178: %%(Computing psi1) message
                    179: %%                        psi1
                    180: %% Computes  D_{Y->X}^{r1} -->  D_{Y->X}^{r0} induced by gbase
                    181: %% with weight  k0 - m1vec <= k <= k1 - m1vec
                    182:     0 1 r1 1 sub {/i set
                    183:       m1vec i get /m1i set
                    184:       ee {expand} map k0 m1i sub k1 m1i sub monomials /emonoi set
                    185:       bfDtt k0 m1i sub k1 m1i sub monomials /bfDttmonoi set
                    186:       emonoi length /nmono set
                    187:       0 1 nmono 1 sub {/j set
                    188:         @@@.esymbol  expand i npower /eei set
                    189:         emonoi j get eei mul /eei set
                    190:         gbase i get /dtp set
                    191:         bfDttmonoi j get dtp mul /dtp set
                    192:         0 1 d 1 sub {/k set
                    193:           dtp [[bftt k get expand (0).]] replace /dtp set
                    194:           dtp [[bfDtt k get  ee k get expand]] replace /dtp set
                    195:         } for
                    196:         dtp [[(h). (1).]] replace /dtp set
                    197:         dtp << ee {expand} map >> m0vec k0 Vtruncate_below /dtp set
                    198:         dtp (0). eq {
                    199:           zerolist [eei] join /zerolist set
                    200:         }{
                    201:           psi1index [eei] join /psi1index set
                    202:           psi1 [dtp] join /psi1 set
                    203:         } ifelse
                    204:       } for
                    205:     } for
                    206:
                    207: %%(ideg =) messagen ideg ::
                    208: %%(psi1 obtained.) message
                    209: %%(Computing psi1ker) message
                    210:
                    211: %% Computing psi1ker := Ker psi1 :
                    212:     psi1 length 0 eq {
                    213:       [ ] /psi1ker set
                    214:     }{
                    215:       psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
                    216:       [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
                    217:       psi1kervec length /pn set
                    218:       psi1index length /pn0 set
                    219:       [ ] /psi1ker set
                    220:       0 1 pn 1 sub {/i set
                    221:         psi1kervec i get /psi1i set
                    222:         (0). /psi1keri set
                    223:         0 1 pn0 1 sub {/j set
                    224:           psi1index j get psi1i j get mul psi1keri add /psi1keri set
                    225:         } for
                    226:         psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
                    227:       } for
                    228:     } ifelse
                    229:     zerolist psi1ker join /psi1ker set
                    230: % Is it all right to use reducedBase here?
                    231: %    psi1ker length 0 eq { }{
                    232: %      psi1ker reducedBase /psi1ker set
                    233: %    } ifelse
                    234: %%(ideg =) messagen ideg ::
                    235: %%(psi1ker obtained.) message
                    236: %%(Computing psi2image ...) message
                    237:
                    238: %%                                     psi2
                    239: %% Computes the image of  D_{Y->X}^{r2} -->  D_{Y->X}^{r1} induced by syz
                    240: %% with weight  k0 - m2vec <= k <= k1 - m2vec
                    241:     /psi2image [
                    242:       0 1 r2 1 sub {/i set
                    243:         o.syz i get {expand [[BFs expand (1).]] replace} map /syzi set
                    244:         syzi vector_to_poly /syzi set
                    245:         m2vec i get /m2i set
                    246:         bfDtt k0 m2i sub k1 m2i sub monomials /bfDttmonoi set
                    247:         bfDttmonoi length /nmono set
                    248:         0 1 nmono 1 sub {/j set
                    249:           bfDttmonoi j get syzi mul /syzij set
                    250:           0 1 d 1 sub {/k set
                    251:             syzij [[bftt k get expand (0).]] replace /syzij set
                    252:             syzij [[bfDtt k get ee k get expand]] replace /syzij set
                    253:           } for
                    254:           syzij [[(h). (1).]] replace /syzij set
                    255:           syzij << ee {expand} map >> m1vec k0 Vtruncate_below /syzij set
                    256:           syzij (0). eq { }{syzij} ifelse
                    257:         } for
                    258:       } for
                    259:     ] def
                    260:
                    261: %(psi2image obtained.) message
                    262: %(ideg = ) messagen ideg ::
                    263: %(psi1ker = ) message psi1ker ::
                    264: %(psi2image =) message psi2image ::
                    265:
                    266: %% Computes the quotient module  psi1ker/psi2image
                    267:     psi1ker length /nker set
                    268:     nker 0 eq {
                    269:       [0 [ ]] /cohom set
                    270:     }{
                    271:       psi2image length /nim set
                    272:       psi1ker psi2image join /psiall set
                    273:       psiall {homogenize} map /psiall set
                    274:       [psiall [(needSyz)]] groebner 2 get /psisyz set
                    275:       psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
                    276:       cohom {remove0} map /cohom set
                    277:       cohom length 0 eq {
                    278:         [nker [ ]] /cohom set
                    279:       }{
                    280:         cohom {homogenize} map /cohom set
                    281:         [cohom] groebner 0 get reducedBase /cohom set
                    282:         cohom {[[(h). (1).]] replace} map /cohom set
                    283:         [nker cohom] trimModule /cohom set
                    284:       } ifelse
                    285:     } ifelse
                    286:     cohomlist [cohom] join /cohomlist set
                    287:     0 ideg sub print (-th cohomology:  ) messagen
                    288:     cohom ::
                    289:     r1 /r0 set
                    290:     r2 /r1 set
                    291:     m1vec /m0vec set
                    292:     m2vec /m1vec set
                    293:   } for
                    294:
                    295:   cohomlist /arg1 set
                    296:   ] pop
                    297:   popVariables
                    298:   arg1
                    299: } def
                    300:
                    301: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    302: %% The cohomology groups of the restriction without truncation from below
                    303: %% [(P1)...] [(t1)...] k1 degmax restall
                    304: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
                    305:
                    306: /restall1_s {
                    307:   /arg5 set %% degmax
                    308:   /arg4 set %% k1
                    309:   /arg2 set %% [(t1) ... (td)]
                    310:   /arg1 set %% BFequations
                    311:   [
                    312:      /ff /bftt /k1 /degmax /syzlist /mveclist /cohomlist
                    313:      /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
                    314:      /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
                    315:      /psi1 /psi1ker /psi2image
                    316:      /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
                    317:      /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
                    318:   ] pushVariables
                    319:   [
                    320:     /ff arg1 def  /bftt arg2 def  /k1 arg4 def
                    321:     /degmax arg5 def
                    322:     bftt length /d set
                    323:
                    324:     (Computing a free resolution ... ) message
                    325:     Schreyer 2 eq {ff bftt degmax resolution_Sh /syzlist set}{ } ifelse
                    326:     Schreyer 1 eq {ff bftt degmax resolution_SV /syzlist set}{ } ifelse
                    327:     Schreyer 0 eq {ff bftt degmax resolution_nsV /syzlist set}{ } ifelse
                    328:
                    329:     (A free resolution obtained.) message
                    330:
                    331:     BFvarlist /ttxx set
                    332:     BFparlist /aa set
                    333:     [BFs] ttxx join aa join /allvarlist set
                    334:     ttxx length /dn set
                    335:     ttxx {xtoDx} map /Dttxx set
                    336:
                    337:     /BFs_weight
                    338:       [ [ BFs 1 ]
                    339:         [ 0 1 dn 1 sub
                    340:             { /i set Dttxx i get 1 }
                    341:           for
                    342:           0 1 dn 1 sub
                    343:             { /i set ttxx i get 1 }
                    344:           for ]
                    345:       ] def
                    346:
                    347:     [ allvarlist listtostring ring_of_differential_operators
                    348:       BFs_weight weight_vector 0 ] define_ring
                    349:
                    350: %% Reformatting the free resolution:
                    351: %%  [[f1,f2,..],[syz1,...]] --> [[[f1],[f2],...],[syz,...]] (strings)
                    352: %% (to be modified for the case with more than one unknowns.)
                    353:
                    354:     Schreyer 0 gt {
                    355:       /syzlist1 [
                    356:         syzlist 0 get /syz0 set
                    357:         [ 0 1 syz0 length 1 sub {/i set
                    358:           [ syz0 i get (string) dc ]
                    359:         } for ]
                    360:         1 1 degmax {/i set
                    361:           syzlist 1 get i 1 sub get {toStrings} map
                    362:         } for
                    363:       ] def
                    364:       syzlist1 /syzlist set
                    365:     }{
                    366:       /syzlist1 [
                    367:         syzlist 0 get /syz0 set
                    368:         [ 0 1 syz0 length 1 sub {/i set
                    369:           [ syz0 i get (string) dc ]
                    370:         } for ]
                    371:         1 1 degmax {/i set
                    372:           syzlist i get {toStrings} map
                    373:         } for
                    374:       ] def
                    375:       syzlist1 /syzlist set
                    376:     } ifelse
                    377:
                    378:     [ ] /cohomlist set
                    379:
                    380: %% Start the loop:
                    381:   0 1 degmax {/ideg set
                    382:
                    383: %(new loop: ) messagen ideg ::
                    384:
                    385:     ideg 0 eq {
                    386:        1 /r0 set
                    387:        1 /r1 set
                    388:       [ [ (0) ] ] /gbase set
                    389:       [ 0 ] /m0vec set
                    390:       [ 0 ] /m1vec set
                    391:     }{
                    392:       syzlist  << ideg 1 sub >> get /gbase set
                    393:       r0 /r1 set
                    394:     } ifelse
                    395:     syzlist     ideg          get /o.syz   set
                    396:
                    397: %%                                       o.syz       gbase
                    398: %%                                D^{r2} --> D^{r1} --> D^{r0}
                    399: %% with weight vectors:           m2vec      m1vec      m0vec
                    400: %% which will induce a complex
                    401: %%                                     psi2              psi1
                    402: %%                        D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
                    403:
                    404:     gbase length /r1 set
                    405:     o.syz length /r2 set
                    406:
                    407: %% (Computing the weight vector m2vec from m1vec and syz) message
                    408:       /m2vec [
                    409:         0 1 r2 1 sub {/i set
                    410:           o.syz i get /syzi set
                    411:           0 /nonzero set
                    412:           0 1 r1 1 sub {/j set
                    413:             syzi j get expand /syzij set
                    414:             syzij (0). eq {  }{
                    415:               syzij bftt fwh_order  m1vec j get  add /maxtmp set
                    416:               nonzero 0 eq { maxtmp /max0 set }{
                    417:                 maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
                    418:               } ifelse
                    419:             1 /nonzero set
                    420:             } ifelse
                    421:           } for
                    422:         max0 } for ] def
                    423:
                    424: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
                    425:     BFu /estr set
                    426:     /ee
                    427:       [ 1 1 d {/i set estr i toString 2 cat_n} for ]
                    428:     def
                    429:     [@@@.esymbol ] ee join /eee set
                    430:
                    431: %%(Setting up a ring that represents D_{Y->X}^{r1}) message
                    432:     eee length /neee set
                    433:     /eeemvec [ 1 1 neee {pop 1} for ] def
                    434:     eee [ ] [BFs] BFvarlist join eeemvec setupDringVshift
                    435:     bftt {xtoDx expand} map /bfDtt set
                    436:     [ ] /psi1 set
                    437:     [ ] /psi1index set
                    438:     [ ] /zerolist set
                    439:
                    440: %%(converting gbase to a list of polynomials) message
                    441:     /gbase1
                    442:       [ 0 1 r1 1 sub {/i set
                    443:           gbase i get {expand [[BFs expand (1).]] replace} map vector_to_poly
                    444:        } for ] def
                    445:
                    446:     gbase1 /gbase set
                    447:
                    448: %%(ideg =) messagen ideg ::
                    449: %%(Computing psi1) message
                    450: %%                        psi1
                    451: %% Computes  D_{Y->X}^{r1} -->  D_{Y->X}^{r0} induced by gbase
                    452: %% with weight  = k <= k1 - m1vec
                    453:     0 1 r1 1 sub {/i set
                    454:       m1vec i get /m1i set
                    455:       ee {expand} map  0  k1 m1i sub monomials /emonoi set
                    456:       bfDtt  0  k1 m1i sub monomials /bfDttmonoi set
                    457:       emonoi length /nmono set
                    458:       0 1 nmono 1 sub {/j set
                    459:         @@@.esymbol  expand i npower /eei set
                    460:         emonoi j get eei mul /eei set
                    461:         gbase i get /dtp set
                    462:         bfDttmonoi j get dtp mul /dtp set
                    463:         0 1 d 1 sub {/k set
                    464:           dtp [[bftt k get expand (0).]] replace /dtp set
                    465:           dtp [[bfDtt k get  ee k get expand]] replace /dtp set
                    466:         } for
                    467:         dtp [[(h). (1).]] replace /dtp set
                    468:         dtp (0). eq {
                    469:           zerolist [eei] join /zerolist set
                    470:         }{
                    471:           psi1index [eei] join /psi1index set
                    472:           psi1 [dtp] join /psi1 set
                    473:         } ifelse
                    474:       } for
                    475:     } for
                    476:
                    477: %%(ideg =) messagen ideg ::
                    478: %%(psi1 obtained.) message
                    479: %%(Computing psi1ker) message
                    480:
                    481: %% Computing psi1ker := Ker psi1 :
                    482:     psi1 length 0 eq {
                    483:       [ ] /psi1ker set
                    484:     }{
                    485:       psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
                    486:       [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
                    487:       psi1kervec length /pn set
                    488:       psi1index length /pn0 set
                    489:       [ ] /psi1ker set
                    490:       0 1 pn 1 sub {/i set
                    491:         psi1kervec i get /psi1i set
                    492:         (0). /psi1keri set
                    493:         0 1 pn0 1 sub {/j set
                    494:           psi1index j get psi1i j get mul psi1keri add /psi1keri set
                    495:         } for
                    496:         psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
                    497:       } for
                    498:     } ifelse
                    499:     zerolist psi1ker join /psi1ker set
                    500: % Is it all right to use reducedBase here?
                    501: %    psi1ker length 0 eq { }{
                    502: %      psi1ker reducedBase /psi1ker set
                    503: %    } ifelse
                    504: %%(ideg =) messagen ideg ::
                    505: %%(psi1ker obtained.) message
                    506: %%(Computing psi2image ...) message
                    507:
                    508: %%                                     psi2
                    509: %% Computes the image of  D_{Y->X}^{r2} -->  D_{Y->X}^{r1} induced by syz
                    510: %% with weight  m2vec <= k <= k1 - m2vec
                    511:     /psi2image [
                    512:       0 1 r2 1 sub {/i set
                    513:         o.syz i get {expand [[BFs expand (1).]] replace} map /syzi set
                    514:         syzi vector_to_poly /syzi set
                    515:         m2vec i get /m2i set
                    516:         bfDtt  0  k1 m2i sub monomials /bfDttmonoi set
                    517:         bfDttmonoi length /nmono set
                    518:         0 1 nmono 1 sub {/j set
                    519:           bfDttmonoi j get syzi mul /syzij set
                    520:           0 1 d 1 sub {/k set
                    521:             syzij [[bftt k get expand (0).]] replace /syzij set
                    522:             syzij [[bfDtt k get ee k get expand]] replace /syzij set
                    523:           } for
                    524:           syzij [[(h). (1).]] replace /syzij set
                    525:           syzij (0). eq { }{syzij} ifelse
                    526:         } for
                    527:       } for
                    528:     ] def
                    529:
                    530: %(psi2image obtained.) message
                    531: %(ideg = ) messagen ideg ::
                    532: %(psi1ker = ) message psi1ker ::
                    533: %(psi2image =) message psi2image ::
                    534:
                    535: %% Computes the quotient module  psi1ker/psi2image
                    536:     psi1ker length /nker set
                    537:     nker 0 eq {
                    538:       [0 [ ]] /cohom set
                    539:     }{
                    540:       psi2image length /nim set
                    541:       psi1ker psi2image join /psiall set
                    542:       psiall {homogenize} map /psiall set
                    543:       [psiall [(needSyz)]] groebner 2 get /psisyz set
                    544:       psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
                    545:       cohom {remove0} map /cohom set
                    546:       cohom length 0 eq {
                    547:         [nker [ ]] /cohom set
                    548:       }{
                    549:         cohom {homogenize} map /cohom set
                    550:         [cohom] groebner 0 get reducedBase /cohom set
                    551:         cohom {[[(h). (1).]] replace} map /cohom set
                    552:         [nker cohom] trimModule /cohom set
                    553:       } ifelse
                    554:     } ifelse
                    555:     cohomlist [cohom] join /cohomlist set
                    556:     0 ideg sub print (-th cohomology:  ) messagen
                    557:     cohom ::
                    558:     r1 /r0 set
                    559:     r2 /r1 set
                    560:     m1vec /m0vec set
                    561:     m2vec /m1vec set
                    562:   } for
                    563:
                    564:   cohomlist /arg1 set
                    565:   ] pop
                    566:   popVariables
                    567:   arg1
                    568: } def
                    569:
                    570: /intall_s {
                    571:   /arg5 set %% degmax
                    572:   /arg4 set %% k1
                    573:   /arg3 set %% k0
                    574:   /arg2 set %% [(t1) ... (td)]
                    575:   /arg1 set %% BFequations
                    576:   [ /ff /bftt /k0 /k1 /degmax /ffdx ] pushVariables
                    577:   [
                    578:     /ff arg1 def  /bftt arg2 def  /k0 arg3 def  /k1 arg4 def
                    579:    /degmax arg5 def
                    580:     BFvarlist setupDring
                    581:     ff {bftt fourier} map /ffdx set
                    582:     ffdx bftt k0 k1 degmax restall_s /arg1 set
                    583:   ] pop
                    584:   popVariables
                    585:   arg1
                    586: } def
                    587:
                    588: /intall1_s {
                    589:   /arg5 set %% degmax
                    590:   /arg4 set %% k1
                    591:   /arg2 set %% [(t1) ... (td)]
                    592:   /arg1 set %% BFequations
                    593:   [ /ff /bftt /k1 /degmax /ffdx ] pushVariables
                    594:   [
                    595:     /ff arg1 def  /bftt arg2 def  /k0 arg3 def  /k1 arg4 def
                    596:    /degmax arg5 def
                    597:     BFvarlist setupDring
                    598:     ff {bftt fourier} map /ffdx set
                    599:     ffdx bftt k1 degmax restall1_s /arg1 set
                    600:   ] pop
                    601:   popVariables
                    602:   arg1
                    603: } def
                    604:
                    605: /resolution_Sh {
                    606:   /arg3 set /arg2 set /arg1 set
                    607:   [ /tt /ff /deg /ttxx /aa /allvarlist /d /n /m /Dtt /Dxx /xx
                    608:     /i /V_weight /G
                    609:   ] pushVariables
                    610:   [
                    611:     arg1 /ff set  arg2 /tt set  arg3 /deg set
                    612:     BFvarlist /ttxx set
                    613:     BFparlist /aa set
                    614:     ttxx aa join /allvarlist set
                    615:     tt length /d set
                    616:     ttxx tt setminus /xx set
                    617:     xx length /n set
                    618:     aa length /m set
                    619:     tt {xtoDx} map /Dtt set
                    620:     xx {xtoDx} map /Dxx set
                    621:
                    622:     /V_weight [
                    623:       [ 0 1 d 1 sub {/i set Dtt i get 1} for
                    624:         0 1 d 1 sub {/i set tt i get -1} for ]
                    625:       [ 0 1 n 1 sub {/i set Dxx i get 1} for
                    626:         0 1 n 1 sub {/i set xx i get 1} for ]
                    627:     ] def
                    628:
                    629:     ttxx aa join /allvarlist set
                    630:     [ allvarlist listtostring s_ring_of_differential_operators
                    631:       V_weight s_weight_vector 0 [(schreyer) 1]] define_ring
                    632:
                    633:     deg ff {tparse} map sResolution /G set
                    634:     G /arg1 set
                    635:    ] pop
                    636:    popVariables
                    637:    arg1
                    638: } def
                    639:
                    640: /resolution_SV {
                    641:   /arg3 set /arg2 set /arg1 set
                    642:   [ /ff /tt /deg /ttxx /aa /allvarlist /xx /dn /Dttxx /BFs_weight /i /G
                    643:   ] pushVariables
                    644:   [
                    645:     arg1 /ff set  arg2 /tt set  arg3 /deg set
                    646:     BFvarlist /ttxx set
                    647:     BFparlist /aa set
                    648:     [BFs] ttxx join aa join /allvarlist set
                    649:     ttxx tt setminus /xx set
                    650:     ttxx length /dn set
                    651:     ttxx {xtoDx} map /Dttxx set
                    652:
                    653:     /BFs_weight
                    654:       [ [ BFs 1 ]
                    655:         [ 0 1 dn 1 sub
                    656:             { /i set Dttxx i get 1 }
                    657:           for
                    658:           0 1 dn 1 sub
                    659:             { /i set ttxx i get 1 }
                    660:           for ]
                    661:       ] def
                    662:
                    663:     [ allvarlist listtostring s_ring_of_differential_operators
                    664:       BFs_weight s_weight_vector 0 [(schreyer) 1]] define_ring
                    665:
                    666:     ff {tt fwm_homogenize} map /ff set
                    667:     deg ff {tparse [[(h).(1).]] replace } map sResolution /G set
                    668:     G /arg1 set
                    669:    ] pop
                    670:    popVariables
                    671:    arg1
                    672: } def
                    673:
                    674: %% Computing a free resolution compatible with the V-filtration
                    675: %% w.r.t. tt
                    676: /resolution_nsV {
                    677:   /arg3 set  %% rdegmax
                    678:   /arg2 set  %% tt
                    679:   /arg1 set  %% ff
                    680:   [
                    681:     /ff /tt /rdegmax /ttxx /xx /aa /dn /d /Dttxx /i /syzlist /rdeg
                    682:     /allvarlist /gbase /o.syz /gbase1 /syz2 /syz3 /nsyz /syz2i /syz2ij
                    683:   ] pushVariables
                    684:   [
                    685:     arg1 /ff set
                    686:     arg2 /tt set
                    687:     arg3 /rdegmax set
                    688:     BFvarlist /ttxx set
                    689:     BFparlist /aa set
                    690:     ttxx tt setminus /xx set
                    691:     ttxx length /dn set
                    692:     /allvarlist
                    693:       [ BFs ] ttxx join aa join
                    694:     def
                    695:     ttxx {xtoDx} map /Dttxx set
                    696:     /BFs_weight
                    697:       [ [ BFs 1 ]
                    698:         [ 0 1 dn 1 sub
                    699:             { /i set Dttxx i get 1 }
                    700:           for
                    701:           0 1 dn 1 sub
                    702:             { /i set ttxx i get 1 }
                    703:           for ]
                    704:       ] def
                    705:     [ allvarlist listtostring ring_of_differential_operators
                    706:       BFs_weight weight_vector
                    707:     0] define_ring
                    708:     BFs expand /bfs set
                    709:     [ ] /syzlist set
                    710:
                    711: %% start the loop (the counter rdeg represents the degree of the resolution)
                    712:     0 1 rdegmax {/rdeg set
                    713: %%  From
                    714: %%                   ff=syz
                    715: %%  ... <--- D_X^{r0} <--- D_X^{#ff},
                    716: %%  computes
                    717: %%                    gbase          syz
                    718: %%  ... <--- D_X^{r0} <--- D_X^{r1} <--- D_X^{#syz}.
                    719:
                    720:       rdeg 0 eq {
                    721:         1 /r0 set
                    722:         ff {tt fwm_homogenize expand} map /ff set
                    723:       }{
                    724:         r1 /r0 set
                    725:         o.syz {vector_to_poly} map /ff set
                    726:       } ifelse
                    727:
                    728:       ff {[[(h). (1).]] replace homogenize} map /ff set
                    729: %% Is it OK to use reducedBase here?
                    730:       [ff] groebner 0 get {[[(h). (1).]] replace} map /gbase set
                    731:       gbase reducedBase {homogenize} map /gbase set
                    732:       [gbase [(needSyz)]] groebner 2 get /o.syz set
                    733:       gbase length /r1 set
                    734:
                    735: %% V-homogenize syz:
                    736:       gbase {bfs coefficients 0 get 0 get} map /msvec set
                    737:       o.syz length /nsyz set
                    738:       o.syz /syz2 set
                    739:       /syz3 [ 0 1 nsyz 1 sub {/i set
                    740:         syz2 i get /syz2i set
                    741:         [ 0 1 r1 1 sub {/j set
                    742:           syz2i j get /syz2ij set
                    743:           msvec j get /msj set
                    744:           syz2ij << bfs msj npower >> mul
                    745:         } for ]
                    746:       } for ] def
                    747:       syz3 /o.syz set
                    748:
                    749: %% Comment out % if you want the output to be string lists
                    750:       gbase {[[(h). (1).]] replace} map /gbase set
                    751:       rdeg 0 eq {
                    752: %       gbase toStrings /gbase1 set
                    753:         gbase /gbase1 set
                    754:       }{
                    755: %       gbase r0 n_toVectors {toStrings} map /gbase1 set
                    756:         gbase r0 n_toVectors /gbase1 set
                    757:       } ifelse
                    758:       syzlist [gbase1] join /syzlist set
                    759:       o.syz length 0 eq {
                    760:         syzlist [o.syz] join /syzlist set
                    761:         1 break
                    762:       }{ } ifelse
                    763:     } for
                    764:
                    765:     syzlist /arg1 set
                    766:   ] pop
                    767:   popVariables
                    768:   arg1
                    769: } def
                    770: %%%%%%%%%%%%%%%%%%%%% Utilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    771: %% [u1,...] [v1,...] setminus --> [u1,...] \setminus [v1,...]
                    772: /setminus {
                    773:   /arg2 set /arg1 set
                    774:   [ /Set1 /Set2 /n2 /i ] pushVariables
                    775:   [
                    776:     arg1 /Set1 set  arg2 /Set2 set
                    777:     Set2 length /n2 set
                    778:     0 1 n2 1 sub {/i set
                    779:        Set1  Set2 i get  complement.oaku /Set1 set
                    780:     } for
                    781:     Set1 /arg1 set
                    782:   ] pop
                    783:   popVariables
                    784:   arg1
                    785: } def
                    786:
                    787: %% (list arg1) \setminus {(an element arg2)}
                    788: /complement.oaku {
                    789:   /arg2 set /arg1 set
                    790:   arg1 { arg2 notidentical } map
                    791: } def
                    792:
                    793: /notidentical {
                    794:   /arg2 set
                    795:   /arg1 set
                    796:   arg1 arg2 eq
                    797:   { } {arg1} ifelse
                    798: } def
                    799:
                    800: %% Convert a polynomial list to a list of vectors of length r
                    801: %% [(P1).,,,,] r n_toVectors
                    802: /n_toVectors {
                    803:   /arg2 set  /arg1 set
                    804:   [   ] pushVariables
                    805:   [
                    806:     arg1 /Ps set
                    807:     arg2 /r set
                    808:     Ps length /n set
                    809:     Ps toVectors /Vecs set
                    810:     /Vecs1 [ 0 1 n 1 sub {/i set
                    811:       Vecs i get /Veci set
                    812:       Veci length /ri set
                    813:       1 1 r ri sub {pop Veci [(0).] join /Veci set} for
                    814:       Veci
                    815:     } for ] def
                    816:     Vecs1 /arg1 set
                    817:   ] pop
                    818:   popVariables
                    819:   arg1
                    820: } def
                    821:
                    822: /toStrings {
                    823:   /arg1 set
                    824:   arg1 {(string) dc} map /arg1 set
                    825:   arg1
                    826: } def
                    827:
                    828: %% (x1) --> (Dx1)
                    829: /xtoDx {
                    830:   /arg1 set
                    831:   @@@.Dsymbol arg1 2 cat_n
                    832: } def
                    833:
                    834: %% [(x1) (x2) (x3)] ---> (x1,x2,x3)
                    835: /listtostring {
                    836:   /arg1 set
                    837:   [/n /j /ary /str] pushVariables
                    838:   [
                    839:     /ary arg1 def
                    840:     /n ary length def
                    841:     arg1 0 get /str set
                    842:     n 1 gt
                    843:       { str (,) 2 cat_n /str set }{ }
                    844:     ifelse
                    845:     1 1 n 1 sub {
                    846:       /j set
                    847:       j n 1 sub eq
                    848:         {str << ary j get >>  2 cat_n /str set}
                    849:         {str << ary j get >>  (,) 3 cat_n /str set}
                    850:       ifelse
                    851:     } for
                    852:     /arg1 str def
                    853:   ] pop
                    854:   popVariables
                    855:   arg1
                    856: } def
                    857:
                    858: %% FW-homogenization
                    859: %% Op (string) [(t1) (t2) ...] fw_homogenize ---> h(Op) (string)
                    860: /fwm_homogenize {
                    861:   /arg2 set  %% bft (string list)
                    862:   /arg1 set  %% an operator (string)
                    863:   [ /bftt /bft /bfDt /bfht /bfhDt /Op /degs /m /mn /d /i ] pushVariables
                    864:   [
                    865:     /Op arg1 expand def
                    866:     /bftt arg2 def
                    867:     bftt length /d set
                    868:
                    869:     0 1 d 1 sub { /i set
                    870:       bftt i get /bft set
                    871:       bft xtoDx /bfDt set
                    872:       BFs (^(-1)*) bft 3 cat_n /bfht set
                    873:       BFs (*) bfDt 3 cat_n /bfhDt set
                    874:       Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
                    875:         /Op set
                    876:     } for
                    877:     Op BFs expand coefficients 0 get
                    878:         {(integer) data_conversion} map /degs set
                    879:     degs << degs length 1 sub >> get /m set
                    880:     0 m sub /mn set
                    881:     << BFs expand mn powerZ >> Op mul /Op set
                    882:     Op (string) data_conversion /arg1 set
                    883:   ] pop
                    884:   popVariables
                    885:   arg1
                    886: } def
                    887:
                    888: %% var (poly) m (integer) ---> var^m (poly)
                    889: /powerZ {
                    890:   /arg2 set %% m
                    891:   /arg1 set %% Var
                    892:   [ /m /var /varstr /pow /nvar] pushVariables
                    893:   [
                    894:     arg1 /var set
                    895:     arg2 /m set
                    896:     var (string) data_conversion /varstr set
                    897:     m -1 gt
                    898:       { var m npower /pow set}
                    899:       { varstr (^(-1)) 2 cat_n expand /nvar set
                    900:         nvar << 0 m sub >> npower /pow set
                    901:        }
                    902:     ifelse
                    903:     pow /arg1 set
                    904:   ] pop
                    905:   popVariables
                    906:   arg1
                    907: } def
                    908:
                    909: %% added on June 20, 1997 by N. Takayama for sm1 Release 2.970417 or later.
                    910: /npower {
                    911:   /arg2 set
                    912:   /arg1 set
                    913:   [/f /k /i /ans] pushVariables
                    914:   [
                    915:      /f arg1 def   /k arg2 ..int def
                    916:      f tag PolyP eq {
                    917:        /ans (1). def
                    918:      } {
                    919:        /ans (1).. def
                    920:      } ifelse
                    921:      k 0 lt {
                    922:        1 1 << 0 k sub >> {
                    923:          /ans f ans {mul} sendmsg2 def
                    924:        } for
                    925:        /ans (1).. ans {div} sendmsg2 def
                    926:      }
                    927:      {
                    928:        1 1 k {
                    929:          /ans f ans {mul} sendmsg2 def
                    930:        } for
                    931:      } ifelse
                    932:      /arg1 ans def
                    933:   ] pop
                    934:   popVariables
                    935:   arg1
                    936: } def

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