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

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

1.1     ! maekawa     1: %% lib/complex.sm1  [ functions for complex ], 1999, 9/9
        !             2: %% cf.  yama:1999/Int/uli.sm1
        !             3: %%%%%%%%%%%%%%%%%%%   commands %%%%%%%%%%%%%%%%%%%%%%%%%
        !             4: %%%  res-div, res-solv, res-kernel-image, res-dual
        !             5: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !             6: [(complex.sm1 : 1999, 9/28, res-div, res-solv, res-kernel-image, res-dual )
        !             7:  (In this package, complex is expressed in terms of matrices.)
        !             8: ] {message} map
        !             9: /uli.verbose 0 def
        !            10: /uli.weight [(x) -1 (y) -1 (Dx) 1 (Dy) 1] def
        !            11:
        !            12: %%% M = [M_1, ..., M_p],  M_i has the length q
        !            13: %%%    D^p (row vector) --- M ---> D^q (row vector),   v --> v M
        !            14: %%% In this package (res-***), all data are expressed by matrices.
        !            15: /res-nextShift {
        !            16:   /arg1 set
        !            17:   [/in-nextShift /f /mm /m /p /q /i /fi] pushVariables
        !            18:   [
        !            19:       /f arg1 0  get def
        !            20:       /mm arg1 1 get def
        !            21:       %%  D^p[m] ---f---> D^q[mm]   [f mm] nextShift m
        !            22:       /p f length def
        !            23:       [1 1 p { pop 0 } for] /m set
        !            24:       0 1 p 1 sub {
        !            25:         /i set
        !            26:         /fi f i get def
        !            27:         m i  <<  mm  fi { uli.weight ord_w } map add maxInArray >>  put
        !            28:       } for
        !            29:       /arg1 m def
        !            30:   ] pop
        !            31:   popVariables
        !            32:   arg1
        !            33: } def
        !            34:
        !            35: [(res-nextShift)
        !            36: [([f mm] nextShift m)
        !            37:  $Example: [(x,y) ring_of_differential_operators 0] define_ring$
        !            38:  $ [ [ [ (x). (x^2). (x^3). ] $
        !            39:  $     [ (Dx). (Dx^2). (Dx^3).]] [5 6 7]] res-nextShift :: $
        !            40: ]] putUsages
        !            41:
        !            42:
        !            43: %% Input must be a matrix.
        !            44: /res-init {
        !            45:    /arg1 set
        !            46:    [/in-initv /v /n] pushVariables
        !            47:    [
        !            48:      /v arg1 def
        !            49:      /n v length def
        !            50:      [n [v] fromVectors {init} map] toVectors2
        !            51:      /arg1 set
        !            52:    ] pop
        !            53:    popVariables
        !            54:    arg1
        !            55: } def
        !            56:
        !            57:
        !            58: /res-isVadapted {
        !            59:   /arg1 set
        !            60:   [/in-res-isVstrict /f /m /mm /ans] pushVariables
        !            61:   [
        !            62:     /f arg1 0 get def
        !            63:     /m arg1 1 get def
        !            64:     /mm arg1 2 get def
        !            65:     %%  D^p[m] ---f---> D^q[mm]   [f m mm] res-isVadapted
        !            66:     f [ [ ] ] eq {
        !            67:       /ans 1 def
        !            68:     } {
        !            69:       [f mm] res-nextShift m eq {/ans 1 def} { /ans 0 def} ifelse
        !            70:     } ifelse
        !            71:     /arg1 ans def
        !            72:   ] pop
        !            73:   popVariables
        !            74:   arg1
        !            75: } def
        !            76:
        !            77: /res-gb {
        !            78:   /arg1 set
        !            79:   [/in-res-gb /aa /gg /qq /ans] pushVariables
        !            80:   [(KanGBmessage)] pushEnv
        !            81:   [
        !            82:     /aa arg1 def  %% Input is a matrix.
        !            83:     aa [ ] eq { /arg1 [ ] def /res-gb.LLL goto } {  } ifelse
        !            84:     aa 0 get isArray {
        !            85:     }{ aa { [ 2 1 roll ] } map /aa} ifelse
        !            86:     /qq aa 0 get length def
        !            87:     aa { dehomogenize homogenize } map /aa set
        !            88:     uli.verbose { } { [(KanGBmessage) 0] system_variable} ifelse
        !            89:     [aa] groebner 0 get /ans set
        !            90:     ans 0 get isArray { }
        !            91:     { [qq ans] toVectors2 /ans set } ifelse
        !            92:     /arg1 ans def
        !            93:     /res-gb.LLL
        !            94:   ] pop
        !            95:   popEnv
        !            96:   popVariables
        !            97:   arg1
        !            98: } def
        !            99:
        !           100: %% Utility functions res-setRing and res-toString
        !           101: /res-toString {
        !           102:   /arg1 set
        !           103:   [/in-res-toString /s /ans] pushVariables
        !           104:   [
        !           105:     /s arg1 def
        !           106:     s isArray {
        !           107:       s {res-toString} map /ans set
        !           108:     }{
        !           109:       s isPolynomial {
        !           110:         /ans s toString def
        !           111:       } {
        !           112:         /ans s def
        !           113:       } ifelse
        !           114:     } ifelse
        !           115:     ans /arg1 set
        !           116:   ] pop
        !           117:   popVariables
        !           118:   arg1
        !           119: } def
        !           120:
        !           121: %% res-setRing.v  res-setRing.vlist are global variables that contain,
        !           122: %% for example, (x,y) and [(x) (y)].
        !           123: /res-setRing {
        !           124:   /arg1 set
        !           125:   [/in-res-setRing /R /v] pushVariables
        !           126:   [
        !           127:      /v arg1 def
        !           128:      v isArray {
        !           129:        /v v res-toString from_records def
        !           130:      }{
        !           131:        v isString {
        !           132:        }{
        !           133:          [(res-setRing: ) v toString
        !           134:           ( is not a set of variables to define a ring.)] cat
        !           135:          error
        !           136:        }ifelse
        !           137:      }ifelse
        !           138:      /res-setRing.v v def
        !           139:      /res-setRing.vlist [v to_records pop] def
        !           140:      [v ring_of_differential_operators 0] define_ring /R set
        !           141:      /arg1 R def
        !           142:    ] pop
        !           143:    popVariables
        !           144:    arg1
        !           145: } def
        !           146:
        !           147:
        !           148: %% [M N] res-div  It returns ker(M/N)  i.e. D^*/ [M N] res-div = M/N
        !           149: %% First size(M) part of the syzygy of M and N.
        !           150: /res-div {
        !           151:   /arg1 set
        !           152:   [/in-res-div /M /N /ss /m /n /ss2 /ans] pushVariables
        !           153:   [(KanGBmessage)] pushEnv
        !           154:   [
        !           155:     /M arg1 0 get def
        !           156:     /N arg1 1 get def
        !           157:     /m M length def
        !           158:     /n N length def
        !           159:     M 0 get isArray {
        !           160:     }{ M { [ 2 1 roll ] } map /M } ifelse
        !           161:     M { dehomogenize homogenize } map /M set
        !           162:
        !           163:     n 0 eq not {
        !           164:       N 0 get isArray {
        !           165:       }{ N { [ 2 1 roll ] } map /N } ifelse
        !           166:       N { dehomogenize homogenize } map /N set
        !           167:     } { } ifelse
        !           168:
        !           169:     uli.verbose { } { [(KanGBmessage) 0] system_variable} ifelse
        !           170:     [M N join [(needSyz)]] groebner 2 get /ss set
        !           171:     ss dehomogenize /ss set
        !           172:     ss { [ 2 1 roll  aload pop 1 1 n { pop pop } for ] } map
        !           173:     /ss2 set
        !           174:     ss2 {homogenize} map /ss2 set
        !           175:     ss2 [ ] eq {
        !           176:       [ m res-newpvec ] /ans set
        !           177:     }{
        !           178:       [ss2 0 get length [ss2] groebner 0 get dehomogenize ] toVectors2
        !           179:       /ans set
        !           180:     } ifelse
        !           181:
        !           182:     /arg1 ans def
        !           183:   ] pop
        !           184:   popEnv
        !           185:   popVariables
        !           186:   arg1
        !           187: } def
        !           188: [(res-div)
        !           189: [( [M N] res-div K )
        !           190:  ( matrix M, N, K ; Each element of M and N must be an element of a ring.)
        !           191:  ( coker(K) is isomorphic to M/N. )
        !           192:  (Example: [(x,y) ring_of_differential_operators 0] define_ring )
        !           193:  (   [[[(x+x^2+y^2).] [(x y).]] [[(x+x^2+y^2).] [(x y).]]] res-div)
        !           194:  (  )
        !           195:  $res*div accepts string inputs, too. For example,$
        !           196:  $ [[[[(x+x^2+y^2)] [(x y)]] [[(x+x^2+y^2)] [(x y)]]]$
        !           197:  $   [(x) (y)]]  res*div ::$
        !           198:  (See also res-toString, res-setRing.)
        !           199: ]] putUsages
        !           200:
        !           201: /res*div {
        !           202:   /arg1 set
        !           203:   [/in-res*div /A] pushVariables
        !           204:   [(CurrentRingp)] pushEnv
        !           205:   [
        !           206:     /A arg1 def
        !           207:     A 1 get res-setRing pop
        !           208:     A 0 get res-toString expand res-div /arg1 set
        !           209:   ] pop
        !           210:   popEnv
        !           211:   popVariables
        !           212:   arg1
        !           213: } def
        !           214:
        !           215: /res-syz {
        !           216:   /arg1 set
        !           217:   [/in-res-syz /M /m] pushVariables
        !           218:   [
        !           219:     /M arg1 def
        !           220:
        !           221:     M 0 get isArray {
        !           222:     }{ M { [ 2 1 roll ] } map /M } ifelse
        !           223:
        !           224:     M { dehomogenize homogenize } map /M set
        !           225:     [M [(needSyz)]] groebner 2 get dehomogenize /arg1 set
        !           226:   ] pop
        !           227:   popVariables
        !           228:   arg1
        !           229: } def
        !           230: [(res-syz)
        !           231: [( M res-syz N)
        !           232:  ( matrix M, N ; each element of M and N must be an element of a ring.)
        !           233:  ( N is a set of generators of the syzygy module of M.)
        !           234:  (res*syz is also provided. It accepts string inputs.)
        !           235: ]] putUsages
        !           236: /res*syz {
        !           237:   /arg1 set
        !           238:   [/in-res*syz /A] pushVariables
        !           239:   [(CurrentRingp)] pushEnv
        !           240:   [
        !           241:     /A arg1 def
        !           242:     A 1 get res-setRing pop
        !           243:     A 0 get res-toString expand res-syz /arg1 set
        !           244:   ] pop
        !           245:   popEnv
        !           246:   popVariables
        !           247:   arg1
        !           248: } def
        !           249:
        !           250: /res-getx {
        !           251:   /arg1 set
        !           252:   [/in-res-getx /xx /nn /ff] pushVariables
        !           253:   [
        !           254:     /ff arg1 def
        !           255:     /xx ff getvNamesCR def
        !           256:     [(N)] system_variable /nn set
        !           257:     [ xx aload pop 1 1 nn { pop pop } for pop ] rest
        !           258:     /arg1 set
        !           259:   ] pop
        !           260:   popVariables
        !           261:   arg1
        !           262: } def
        !           263:
        !           264: %% Solving \sum c_i M_i = d
        !           265: %% [M d] res-solv c'/r  ;   M : matrix,  d, c' : vectors, r : scalar, c'/r =c
        !           266: /res-solv {
        !           267:   /arg1 set
        !           268:   [/in-res-solv /M /d /ans /B /vv /G /rr /rng] pushVariables
        !           269:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           270:   [
        !           271:      /M arg1  0 get def
        !           272:      /d arg1  1 get def
        !           273:      M getRing /rng set
        !           274:      rng res-getx /vv set
        !           275:      uli.verbose { (res-solv : vv = ) messagen vv message } { } ifelse
        !           276:      uli.verbose { } { [(KanGBmessage) 0] system_variable } ifelse
        !           277:      M dehomogenize /M set
        !           278:      [vv from_records ring_of_differential_operators 0] define_ring
        !           279:      M 0 get isArray {
        !           280:        M { { toString . } map } map /M set
        !           281:      } {
        !           282:        M { toString . } map /M set
        !           283:      } ifelse
        !           284:      [M [(needBack)]] groebner_sugar /G set
        !           285:      G 1 get /B set
        !           286:
        !           287:      d isArray {
        !           288:        d 0 get isArray { [d] fromVectors 0 get /d set } { } ifelse
        !           289:        [d] fromVectors 0 get /d set
        !           290:      } {  } ifelse
        !           291:      d toString . dehomogenize /d set
        !           292:
        !           293:      /res-solv.d d def
        !           294:      /res-solv.G G def
        !           295:
        !           296:      d G 0 get reduction-noH  /rr set
        !           297:      rr 0 get (0). eq {
        !           298:        [rr 2 get] B mul 0 get /ans set
        !           299:        /ans [ ans { toString rng ,, (-1) rng ,, mul} map
        !           300:               rr 1 get toString .. ] def
        !           301:      } {
        !           302:        /ans null def
        !           303:      } ifelse
        !           304:      /arg1 ans def
        !           305:   ] pop
        !           306:   popEnv
        !           307:   popVariables
        !           308:   arg1
        !           309: } def
        !           310: [(res-solv)
        !           311: [$[M d] res-solv [c' r] $
        !           312:  $ M : matrix,  d, c' : vectors, r : scalar(integer) $
        !           313:  $ c:=c'/r is a solutions of Sum[c_i M_i] = d where c_i is the i-th element $
        !           314:  $ of the vector c and M_i is the i-th row vector of M.$
        !           315:  $If there is no solution, then res-solv returns null. $
        !           316:  (Note that M and d are not treated as an element of the homogenized Weyl)
        !           317:  (algebra. If M or d contains the homogenization variable h, it automatically)
        !           318:  (set to 1. If you need to use h, use the command res-solv-h)
        !           319:  $Example 1:  [(x,y) ring_of_differential_operators [[(x) -1 (Dx) 1]] weight_vector 0] $
        !           320:  $              define_ring $
        !           321:  $ [ [ [(x Dx + 2).] [ (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)).]]   [(1).]] $
        !           322:  $  res-solv :: $
        !           323:  $Example 2: $
        !           324:  $ [ [ (x Dx + 2).  (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)).]   (1).] $
        !           325:  $  res-solv :: $
        !           326:  $Example 3: $
        !           327:  $ [ [[(x Dx + 2). (0).] $
        !           328:  $    [(Dx+3).     (x^3).]$
        !           329:  $    [(3).        (x).]$
        !           330:  $    [(Dx (x Dx + 3) - (x Dx + 2) (x Dx -4)). (0).]]   [(1). (0).]] $
        !           331:  $  res-solv :: $
        !           332:  $Example 4: $
        !           333:  $ [[ (x*Dx+h^2). (Dx^2+x*h).] [(x^2+h^2). (h Dx + x^2).]] /ff set $
        !           334:  $ [[ (x^2 Dx + x h^2). (Dx^3).]] /gg set  $
        !           335:  $ [ff gg ff mul 0 get ] res-solv-h :: $
        !           336:  $   $
        !           337:  $res*solv and res*solv*h accept string inputs, too. For example,$
        !           338:  $ [[ [ [(x Dx + 2)] [ (Dx (x Dx + 3) - (x Dx + 2) (x Dx -4))]]   [(1)]] $
        !           339:  $  (x)]  res*solv :: $
        !           340: ]] putUsages
        !           341: /res*solv {
        !           342:   /arg1 set
        !           343:   [/in-res*solv /A] pushVariables
        !           344:   [(CurrentRingp)] pushEnv
        !           345:   [
        !           346:     /A arg1 def
        !           347:     A 1 get res-setRing pop
        !           348:     A 0 get res-toString expand res-solv /arg1 set
        !           349:   ] pop
        !           350:   popEnv
        !           351:   popVariables
        !           352:   arg1
        !           353: } def
        !           354:
        !           355: %% Solving \sum c_i M_i = d
        !           356: %% [M d] res-solv-h c'/r  ;
        !           357: %% M : matrix,  d, c' : vectors, r : scalar, c'/r =c
        !           358: /res-solv-h {
        !           359:   /arg1 set
        !           360:   [/in-res-solv-h /M /d /ans /B /vv /G /rr /rng] pushVariables
        !           361:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           362:   [
        !           363:      /M arg1  0 get def
        !           364:      /d arg1  1 get def
        !           365:      M getRing /rng set
        !           366:      rng res-getx /vv set
        !           367:      uli.verbose { (res-solv-h : vv = ) messagen vv message } { } ifelse
        !           368:      uli.verbose { } { [(KanGBmessage) 0] system_variable } ifelse
        !           369:      [vv from_records ring_of_differential_operators 0] define_ring
        !           370:      M 0 get isArray {
        !           371:        M { { toString . } map } map /M set
        !           372:      } {
        !           373:        M { toString . } map /M set
        !           374:      } ifelse
        !           375:
        !           376:      getOptions /options set
        !           377:      (grade) (module1v) switch_function
        !           378:      [M [(needBack)]] groebner /G set
        !           379:      options restoreOptions
        !           380:
        !           381:      G 1 get /B set
        !           382:
        !           383:      d isArray {
        !           384:        d 0 get isArray { [d] fromVectors 0 get /d set } { } ifelse
        !           385:        [d] fromVectors 0 get /d set
        !           386:      } {  } ifelse
        !           387:      d toString . /d set
        !           388:
        !           389:      /res-solv.d d def
        !           390:      /res-solv.G G def
        !           391:
        !           392:      d G 0 get reduction  /rr set
        !           393:      rr 0 get (0). eq {
        !           394:        [rr 2 get] B mul 0 get /ans set
        !           395:        /ans [ ans { toString rng ,, (-1) rng ,, mul} map
        !           396:               rr 1 get toString .. ] def
        !           397:      } {
        !           398:        /ans null def
        !           399:      } ifelse
        !           400:      /arg1 ans def
        !           401:   ] pop
        !           402:   popEnv
        !           403:   popVariables
        !           404:   arg1
        !           405: } def
        !           406: /res*solv*h {
        !           407:   /arg1 set
        !           408:   [/in-res*solv*h /A] pushVariables
        !           409:   [(CurrentRingp)] pushEnv
        !           410:   [
        !           411:     /A arg1 def
        !           412:     A 1 get res-setRing pop
        !           413:     A 0 get res-toString expand res-solv-h /arg1 set
        !           414:   ] pop
        !           415:   popEnv
        !           416:   popVariables
        !           417:   arg1
        !           418: } def
        !           419:
        !           420: %% See also xm, sm1_mul, sm1_mul_d, sm1_mul_h
        !           421: /res*mul {
        !           422:   /arg1 set
        !           423:   [/in-res*mul /A] pushVariables
        !           424:   [(CurrentRingp)] pushEnv
        !           425:   [
        !           426:     /A arg1 def
        !           427:     A 1 get res-setRing pop
        !           428:     A 0 get 0 get res-toString expand
        !           429:     A 0 get 1 get res-toString expand
        !           430:     mul dehomogenize
        !           431:     /arg1 set
        !           432:   ] pop
        !           433:   popEnv
        !           434:   popVariables
        !           435:   arg1
        !           436: } def
        !           437: /res*mul*h {
        !           438:   /arg1 set
        !           439:   [/in-res*mul*h /A] pushVariables
        !           440:   [(CurrentRingp)] pushEnv
        !           441:   [
        !           442:     /A arg1 def
        !           443:     A 1 get res-setRing pop
        !           444:     A 0 get 0 get res-toString expand
        !           445:     A 0 get 1 get res-toString expand
        !           446:     mul
        !           447:     /arg1 set
        !           448:   ] pop
        !           449:   popEnv
        !           450:   popVariables
        !           451:   arg1
        !           452: } def
        !           453:
        !           454: %% cf. sm1_adjoint
        !           455: /res*adjoint {
        !           456:   /arg1 set
        !           457:   [/in-res*adjoint /A /p /v /p0 /ans] pushVariables
        !           458:   [(CurrentRingp)] pushEnv
        !           459:   [
        !           460:     /A arg1 def
        !           461:     A 1 get res-setRing pop
        !           462:     A 0 get res-toString expand dehomogenize /p set
        !           463:     /v res-setRing.v def
        !           464:     p isArray {
        !           465:       p { /p0 set [p0 v] res*adjoint } map /ans set
        !           466:     }{
        !           467:       p v adjoint dehomogenize /ans set
        !           468:     }ifelse
        !           469:     /arg1 ans def
        !           470:   ] pop
        !           471:   popEnv
        !           472:   popVariables
        !           473:   arg1
        !           474: } def
        !           475:
        !           476: /res-init-m {
        !           477:   /arg1 set
        !           478:   [/in-res-init-m /A /ans] pushVariables
        !           479:   [
        !           480:     /A arg1 def
        !           481:     A isArray {
        !           482:        A { res-init-m } map /ans set
        !           483:     }{
        !           484:        A init /ans set
        !           485:     }ifelse
        !           486:     /arg1 ans def
        !           487:   ] pop
        !           488:   popVariables
        !           489:   arg1
        !           490: } def
        !           491:
        !           492: /res-ord_w-m {
        !           493:   /arg2 set
        !           494:   /arg1 set
        !           495:   [/in-ord_w-m /A /ans /w] pushVariables
        !           496:   [
        !           497:     /A arg1 def
        !           498:     /w arg2 def
        !           499:     A isArray {
        !           500:        A { w res-ord_w-m } map /ans set
        !           501:     }{
        !           502:        A w ord_w /ans set
        !           503:     }ifelse
        !           504:     /arg1 ans def
        !           505:   ] pop
        !           506:   popVariables
        !           507:   arg1
        !           508: } def
        !           509:
        !           510: %% cf. sm1_resol1
        !           511: /res*resol1 {
        !           512:   /arg1 set
        !           513:   [/in-res*resol1 /A /ans /w /ans1 /ans2] pushVariables
        !           514:   [
        !           515:     /A arg1 def
        !           516:     A length 3 ge {
        !           517:      /w A 2 get def  %% weight vector
        !           518:     } {
        !           519:      /w null def
        !           520:     }ifelse
        !           521:     A resol1 /ans set
        !           522:     /ans1 ans res-init-m def
        !           523:     w tag 0 eq {
        !           524:       /ans [ans ans1] def
        !           525:     }{
        !           526:       ans w 0 get res-ord_w-m /ans2 set
        !           527:       /ans [ans ans1 ans2] def
        !           528:     }ifelse
        !           529:     /arg1 ans def
        !           530:   ] pop
        !           531:   popVariables
        !           532:   arg1
        !           533: } def
        !           534:
        !           535: %% @@@
        !           536:
        !           537: %% submodule to quotient module
        !           538: %% M res-sub2Q  ==> J, where M \simeq D^m/J
        !           539: /res-sub2Q {
        !           540:   /arg1 set
        !           541:   [/in-res-sub2Q /M /m] pushVariables
        !           542:   [
        !           543:     /M arg1 def
        !           544:     M 0 get isArray {
        !           545:     }{ M { [ 2 1 roll ] } map /M } ifelse
        !           546:     M { dehomogenize homogenize } map /M set
        !           547:     [M [(needSyz)]] groebner 2 get dehomogenize /arg1 set
        !           548:   ] pop
        !           549:   popVariables
        !           550:   arg1
        !           551: } def
        !           552: [(res-sub2Q)
        !           553: [(M res-sub2Q J)
        !           554:  (matrix M, J; )
        !           555:  (The submodule generated by M is isomorphic to D^m/J.)
        !           556: ]] putUsages
        !           557:
        !           558:
        !           559: %% submodules to quotient module
        !           560: %% [M N] res-subsub2Q  ==> J, where M \simeq D^m/J
        !           561: /res-subsub2Q {
        !           562:   /arg1 set
        !           563:   [/in-res-subsub2Q /M /N /ss /m /n /ss2] pushVariables
        !           564:   [
        !           565:     /M arg1 0 get def
        !           566:     /N arg1 1 get def
        !           567:     /m M length def
        !           568:     /n N length def
        !           569:     M 0 get isArray {
        !           570:     }{ M { [ 2 1 roll ] } map /M } ifelse
        !           571:     N 0 get isArray {
        !           572:     }{ N { [ 2 1 roll ] } map /N } ifelse
        !           573:     M { dehomogenize homogenize } map /M set
        !           574:     N { dehomogenize homogenize } map /N set
        !           575:     [M N join [(needSyz)]] groebner 2 get /ss set
        !           576:     ss dehomogenize /ss set
        !           577:     ss { [ 2 1 roll  aload pop 1 1 n { pop pop } for ] } map
        !           578:     /ss2 set
        !           579:     ss2 {homogenize} map /ss2 set
        !           580:     [ss2 0 get length [ss2] groebner 0 get dehomogenize ] toVectors2
        !           581:     /arg1 set
        !           582:   ] pop
        !           583:   popVariables
        !           584:   arg1
        !           585: } def
        !           586:
        !           587: /res-newpvec {
        !           588:   /arg1 set
        !           589:   [/in-res-newpvec /n ] pushVariables
        !           590:   [
        !           591:     /n arg1 def
        !           592:     [1 1 n { pop (0). } for] /arg1 set
        !           593:   ] pop
        !           594:   popVariables
        !           595:   arg1
        !           596: } def
        !           597:
        !           598: %% ki.sm1   kernel/image,  1999, 2/4
        !           599: %% ki.sm1 is now moved to gbhg3/Int.
        !           600: %% It is included in lib/complex.sm1
        !           601: /kernel-image.v 1 def
        !           602: /kernel-image.p 0 def % characteristic
        !           603: %%
        !           604: %%  D^p <-- m --- D^q <-- n -- D^r
        !           605: %%       ker(m)/im(n)
        !           606: %%
        !           607: /res-kernel-image {
        !           608:   /arg1 set
        !           609:   [/in-res-kernel-image /p /q /r /m /n /t
        !           610:    /vlist  /s0 /s1 /ans
        !           611:   ] pushVariables
        !           612:   [
        !           613:     /m arg1 0 get def
        !           614:     /n arg1 1 get def
        !           615:     /vlist arg1 2 get def
        !           616:     vlist isArray {
        !           617:       vlist from_records /vlist
        !           618:     } { } ifelse
        !           619:     [vlist ring_of_differential_operators kernel-image.p] define_ring
        !           620:     m { {toString . dehomogenize toString} map } map /m set
        !           621:     m length /q set
        !           622:     n { {toString . dehomogenize toString} map } map /n set
        !           623:     n length /r set
        !           624:
        !           625:     [m vlist] syz  0 get {{toString} map} map /s0 set
        !           626:     /t s0 length def
        !           627:     [ s0 n join vlist ] syz 0 get /s1 set
        !           628:     s1 { t carN } map /ans set
        !           629:
        !           630:     /arg1 ans def
        !           631:   ] pop
        !           632:   popVariables
        !           633:   arg1
        !           634: } def
        !           635: [(res-kernel-image)
        !           636: [( [m n vlist] res-kernel-image c )
        !           637:  (When, D^p <-- m --- D^q <-- n -- D^r )
        !           638:  (D^q/c is isomorhic to ker(m)/im(n).)
        !           639:  (vlist is a list of variables.)
        !           640: ]] putUsages
        !           641:
        !           642:
        !           643: /res-dual {
        !           644:   /arg1 set
        !           645:   [/in-res-dual ] pushVariables
        !           646:   [
        !           647:     arg1 0 get /input set
        !           648:     arg1 1 get /vlist set
        !           649:     /n vlist length def
        !           650:     /vv vlist from_records def
        !           651:
        !           652:     %% preprocess to input resol0. Future version of resol1 should do them.
        !           653:     input 0 get isArray {
        !           654:       /kernel-image.unknowns input 0 get length def
        !           655:     } { /kernel-image.unknowns 1 def } ifelse
        !           656:     [vv ring_of_differential_operators
        !           657:      kernel-image.p ] define_ring
        !           658:     input 0 get isArray {
        !           659:        input { {toString . dehomogenize toString} map
        !           660:        } map /input set
        !           661:     }{ input { toString . dehomogenize toString} map /input set } ifelse
        !           662:
        !           663:     [input  vv]
        !           664:     resol0 /rr set
        !           665:
        !           666:     %% Postprocess of resol0
        !           667:     [vv ring_of_differential_operators
        !           668:      kernel-image.p ] define_ring
        !           669:     [ [kernel-image.unknowns rr 0 get { toString . dehomogenize } map]
        !           670:        toVectors2 { {toString} map } map ]
        !           671:     rr 1 get join /rr-syz set
        !           672:     %%% end. The result is in rr-syz.
        !           673:
        !           674:     /M rr-syz << n       >> get def
        !           675:     /N rr-syz << n 1 sub >> get def
        !           676:     M [ ] eq {
        !           677:      /q N length def
        !           678:      /M [ [0 1 q 1 sub { pop (0). } for] ] def
        !           679:     } {  } ifelse
        !           680:
        !           681:     %% regard them as a map from row vector v to row vector w; v M --> w
        !           682:     uli.verbose {
        !           683:       (M = ) messagen M pmat
        !           684:       (N = ) messagen N pmat
        !           685:     } { } ifelse
        !           686:     M transpose { { toString . dehomogenize vv adjoint} map } map /M set
        !           687:     N transpose { { toString . dehomogenize vv adjoint} map } map /N set
        !           688:     uli.verbose {
        !           689:       $We are now computing ker (*N)/im (*M).$ message
        !           690:       (*N = ) messagen N pmat
        !           691:       (*M = ) messagen M pmat
        !           692:       ( *N *M = ) messagen N M mul dehomogenize message
        !           693:       (  ) message
        !           694:     }{  } ifelse
        !           695:     /M M {{toString} map } map def
        !           696:     /N N {{toString} map } map def
        !           697:     [M N vv] res-kernel-image {{toString} map}map /ans1 set
        !           698:     [ans1 vv] gb 0 get /arg1 set
        !           699:   ] pop
        !           700:   popVariables
        !           701:   arg1
        !           702: } def
        !           703:
        !           704: [(res-dual)
        !           705: [$[F V] res-dual G$
        !           706:  $G is the dual D-module of F. V is a list of variables.$
        !           707:  $Example 1:  [ [( x^3-y^2 )  ( 2 x Dx + 3 y Dy + 6 )  ( 2 y Dx + 3 x^2 Dy) ] $
        !           708:  $              [(x) (y)]] res-dual $
        !           709:  $Example 2:  [[1 3 4 5]] appell1 res-dual  $
        !           710:  $Example 3:  [ [(-x1 Dx1 + x1 + 2) (x2 Dx2 - Dx2 -3)] [(x1) (x2)]] res-dual $
        !           711:  $Example 4:  [ [(x2 Dx2 - Dx2 + 4) (x1 Dx1 + x1 +3)] [(x1) (x2)]] res-dual $
        !           712:  $            3 and 4 are res-dual each other. $
        !           713:  $Example 5:  [ [[1 1 1][0 1 2]] [0 0]] gkz res-dual $
        !           714:  $Example 6:  [ [[1 1 1][0 1 2]] [-2 -1]] gkz res-dual $
        !           715:  $    $
        !           716:  $Example 7:  [ [(x Dx -1) (Dx^2)]     [(x)]] res-dual $
        !           717:  $Example 8:  [ [[(1) (0)] [(0) (Dx)]] [(x)]] res-dual $
        !           718:  $Example 9:  [ [((x Dx + x +1) (Dx-1))] [(x)]] res-dual $
        !           719: ]] putUsages
        !           720:
        !           721: %%% From 1999/Int/sst.sm1
        !           722: /saturation1 {
        !           723:   /arg1 set
        !           724:   [/in-saturation1 /ff /vlist /ulist /mm /hlist /iii
        !           725:    /i  /uweight /aaa
        !           726:   ] pushVariables
        !           727:   [(KanGBmessage) (CurrentRingp)] pushEnv
        !           728:   [
        !           729:     /ff arg1 def
        !           730:     /iii ff 0 get {toString} map def  %% ideal
        !           731:     /hlist ff 1 get {toString} map def %% saturation polynomials
        !           732:     /vlist [ff 2 get to_records pop] def
        !           733:     /mm hlist length def
        !           734:
        !           735:     [(KanGBmessage) 0] system_variable
        !           736:     /ulist [ 0 1 mm 1 sub { /i set [(_u) i] cat } for ] def
        !           737:     /uweight ulist { 1 } map def
        !           738:     [vlist ulist join from_records ring_of_polynomials
        !           739:      [uweight] weight_vector 0] define_ring
        !           740:     [0 1 mm 1 sub { /i set hlist i get .
        !           741:                            ulist i get . mul (1). sub } for]
        !           742:     /hlist set
        !           743:     %%hlist pmat
        !           744:     [iii {.} map hlist join] groebner_sugar 0 get /aaa set
        !           745:     %%[aaa ulist] pmat
        !           746:     aaa ulist eliminatev /arg1 set
        !           747:   ] pop
        !           748:   popEnv
        !           749:   popVariables
        !           750:   arg1
        !           751: } def
        !           752:
        !           753: [(saturation1)
        !           754: [([ideal saturation-poly vlist] saturation jjj)
        !           755:  $It returns(((ideal:f_1^\infty):f_2^\infty) ...) where$
        !           756:  $saturation-poly is [f_1, f_2, ...]$
        !           757:  $Example 1:   $
        !           758:  $           [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
        !           759:  $             (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
        !           760:  $            [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation1$
        !           761:  $            /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
        !           762:  $                     [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
        !           763:  $            0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
        !           764: ]] putUsages
        !           765:
        !           766:
        !           767: /intersection {
        !           768:   /arg1 set
        !           769:   [/in-intersection2 /ii /jj /rr /vlist /ii2 /jj2 ] pushVariables
        !           770:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           771:   [
        !           772:      /ii arg1 0 get def
        !           773:      /jj arg1 1 get def
        !           774:      /vlist arg1 2 get def
        !           775:
        !           776:     [(KanGBmessage) 0] system_variable
        !           777:
        !           778:      [vlist to_records pop] /vlist set
        !           779:      [vlist [(_t)] join from_records ring_of_differential_operators
        !           780:       [[(_t) 1]] weight_vector 0] define_ring
        !           781:      ii { toString . (_t). mul } map /ii2 set
        !           782:      jj { toString . (1-_t). mul } map /jj2 set
        !           783:      [ii2 jj2 join] groebner_sugar 0 get
        !           784:      [(_t)] eliminatev /arg1 set
        !           785:   ] pop
        !           786:   popEnv
        !           787:   popVariables
        !           788:   arg1
        !           789: } def
        !           790:
        !           791: [(intersection)
        !           792: [(Ideal intersections in the ring of differential operators.)
        !           793:  $Example 1: [[[(x1) (x2)] [(x2) (x4)] (x1,x2,x3,x4)] intersection$
        !           794:  $             [(x2) (x4^2)] (x1,x2,x3,x4)] intersection :: $
        !           795:  $Example 2: [[[(x1) (x2)] [(x2) (x4)] (x1,x2,x3,x4)] intersection$
        !           796:  $             [(x2) (x4^2)] (x1,x2,x3,x4)] intersection /ff set ff message$
        !           797:  $           [ ff [(x2^2) (x3) (x4)] (x1,x2,x3,x4)] intersection :: $
        !           798:  $Example 3: [[[(x1) (x2)] [(x2) (x4^2)] (x1,x2,x3,x4)] intersection$
        !           799:  $             [(x2^2) (x3) (x4)] (x1,x2,x3,x4)] intersection :: $
        !           800: ]] putUsages
        !           801:
        !           802:
        !           803: /saturation2 {
        !           804:   /arg1 set
        !           805:   [/in-saturation2 /ff /vlist /mm /slist /iii
        !           806:    /i  /aaa
        !           807:   ] pushVariables
        !           808:   [(KanGBmessage) (CurrentRingp)] pushEnv
        !           809:   [
        !           810:     /ff arg1 def
        !           811:     /iii ff 0 get {toString} map def  %% ideal
        !           812:     /slist ff 1 get {toString} map def %% saturation polynomials
        !           813:     /vlist ff 2 get  def
        !           814:     /mm slist length def
        !           815:
        !           816:     /aaa [iii [slist 0 get] vlist] saturation1 def
        !           817:     1 1 mm 1 sub {
        !           818:       /i set
        !           819:       [[iii [slist i get] vlist] saturation1
        !           820:        aaa vlist] intersection /aaa set
        !           821:     } for
        !           822:     /arg1 aaa def
        !           823:   ] pop
        !           824:   popEnv
        !           825:   popVariables
        !           826:   arg1
        !           827: } def
        !           828:
        !           829: [(saturation2)
        !           830: [([ideal saturation-poly vlist] saturations jjj)
        !           831:  $It returns (ideal:f_1^infty) \cap (ideal:f_2^\infty) \cap ... where$
        !           832:  $saturation-poly is [f_1, f_2, ...]$
        !           833:  $Example 1:   $
        !           834:  $           [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
        !           835:  $             (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
        !           836:  $            [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation2$
        !           837:  $            /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
        !           838:  $                     [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
        !           839:  $            0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
        !           840:  $Example 2: [[(x2^2) (x2 x4) (x2) (x4^2)] [(x2) (x4)] (x2,x4)] saturation2$
        !           841: ]] putUsages
        !           842:
        !           843: /innerProduct {
        !           844:   { [ 2 1 roll ] } map /innerProduct.tmp2 set
        !           845:   /innerProduct.tmp1 set
        !           846:   [innerProduct.tmp1] innerProduct.tmp2 mul
        !           847:   0 get 0 get
        !           848: } def
        !           849:
        !           850: /saturation {
        !           851:   /arg1 set
        !           852:   [/in-saturation /ff /vlist /mm /slist /iii
        !           853:    /i  /aaa  /vlist2
        !           854:   ] pushVariables
        !           855:   [(KanGBmessage) (CurrentRingp)] pushEnv
        !           856:   [
        !           857:     /ff arg1 def
        !           858:     /iii ff 0 get {toString} map def  %% ideal
        !           859:     /slist ff 1 get {toString} map def %% saturation polynomials
        !           860:     /vlist ff 2 get  def
        !           861:     /mm slist length def
        !           862:
        !           863:     [vlist to_records pop] [(_z) (_y)] join /vlist2 set
        !           864:     [vlist2 from_records ring_of_polynomials
        !           865:      [[(_z) 1 (_y) 1]] weight_vector
        !           866:     0] define_ring
        !           867:
        !           868:     [
        !           869:      [
        !           870:       [0 1 mm 1 sub { /i set (_y). i npower } for ]
        !           871:       slist {.} map innerProduct  (_z). sub
        !           872:      ]
        !           873:      iii {.} map join
        !           874:
        !           875:      [(_z)]
        !           876:      vlist2 from_records
        !           877:     ] saturation1 /aaa set
        !           878:
        !           879:     [(KanGBmessage) 0] system_variable
        !           880:     aaa {toString .} map /aaa set
        !           881:     [aaa] groebner_sugar 0 get
        !           882:     [(_z) (_y)] eliminatev
        !           883:     /arg1 set
        !           884:   ] pop
        !           885:   popEnv
        !           886:   popVariables
        !           887:   arg1
        !           888: } def
        !           889:
        !           890: [(saturation)
        !           891: [([ideal J vlist] saturations jjj)
        !           892:  $It returns (ideal : J^\infty) $
        !           893:  (Saturation is computed in the ring of polynomials.)
        !           894:  $When J=[f_1, f_2, ...], it is equal to $
        !           895:  $((ideal, z-(f_1 + y f_2 + y^2 f_3 +...)) : z^\infty) \cap k[x].$
        !           896:  $Example 1:   $
        !           897:  $           [[(x1 y1 + x2 y2 + x3 y3 + x4 y4) $
        !           898:  $             (x2 y2 + x4 y4) (x3 y3 + x4 y4) (y1 y4 - y2 y3)]$
        !           899:  $            [(y1) (y2) (y3) (y4)] (x1,x2,x3,x4,y1,y2,y3,y4)] saturation$
        !           900:  $            /ff set [ff (x1,x2,x3,x4,y1,y2,y3,y4) $
        !           901:  $                     [[(y1) 1 (y2) 1 (y3) 1 (y4) 1]]] pgb $
        !           902:  $            0 get [(y1) (y2) (y3) (y4)] eliminatev ::$
        !           903:  $Example 2: [[(x2^2) (x2 x4) (x2) (x4^2)] [(x2) (x4)] (x2,x4)] saturation$
        !           904: ]] putUsages
        !           905:

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