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

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

1.1     ! maekawa     1: %% hol.sm1, 1998, 11/8, 11/10, 11/14, 11/25, 1999, 5/18, 6/5.
        !             2: %% rank, rrank, characteristic
        !             3: %% This file is error clean.
        !             4: /hol.version (2.990515) def
        !             5: hol.version [(Version)] system_variable gt
        !             6: { [(This package hol.sm1 requires the latest version of kan/sm1) nl
        !             7:    (Please get it from http://www.math.kobe-u.ac.jp/KAN)
        !             8:   ] cat
        !             9:   error
        !            10: } { } ifelse
        !            11:
        !            12: $hol.sm1, basic package for holonomic systems (C) N.Takayama, 1999, 6/05 $
        !            13: message-quiet
        !            14:
        !            15: /rank.v [(x) (y) (z)] def   %% default value of v (variables).
        !            16: /rank.ch [ ] def  %% characteristic variety.
        !            17: /rank.verbose 0 def
        !            18: /rank {
        !            19:   /arg1 set
        !            20:   [/in-rank /aa /typev /setarg /f /v /vsss /vddd
        !            21:    /gg /wv /vd /vdweight /chv
        !            22:    /one
        !            23:   ] pushVariables
        !            24:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !            25:   [
        !            26:
        !            27:     /aa arg1 def
        !            28:     aa isArray { } { ( << array >> rank) error } ifelse
        !            29:     /setarg 0 def
        !            30:     aa { tag } map /typev set
        !            31:     typev [ ArrayP ] eq
        !            32:     {  /f aa 0 get def
        !            33:        /v rank.v def
        !            34:        /setarg 1 def
        !            35:     } { } ifelse
        !            36:     typev [ArrayP StringP] eq
        !            37:     {  /f aa 0 get def
        !            38:        /v [ aa 1 get to_records pop ] def
        !            39:        /setarg 1 def
        !            40:     } { } ifelse
        !            41:     typev [ArrayP ArrayP] eq
        !            42:     {  /f aa 0 get def
        !            43:        /v aa 1 get def
        !            44:        /setarg 1 def
        !            45:     } { } ifelse
        !            46:     setarg { } { (rank : Argument mismatch) error } ifelse
        !            47:
        !            48:     [(KanGBmessage) rank.verbose ] system_variable
        !            49:
        !            50:     f { toString } map /f set
        !            51:     v { @@@.Dsymbol 2 1 roll 2 cat_n 1 } map
        !            52:     /vddd set   %% vddd = [(Dx) 1 (Dy) 1 (Dz) 1]
        !            53:     v { @@@.Dsymbol 2 1 roll 2 cat_n } map
        !            54:     /vd set     %% vd = [(Dx) (Dy) (Dz)]
        !            55:     /vdweight
        !            56:        vd { [ 2 1 roll -1 ] } map  %% vdweight=[[(Dx) -1] [(Dy) -1] [(Dz) -1]]
        !            57:     def
        !            58:
        !            59:     [v from_records
        !            60:      ring_of_differential_operators [vddd] weight_vector 0] define_ring
        !            61:     f { . dehomogenize } map /f set
        !            62:     [f] groebner_sugar 0 get /gg set
        !            63:
        !            64:     /wv vddd weightv def
        !            65:     gg { wv init } map /chv set  %%obtained the characteristic variety.
        !            66:     /rank.ch chv def
        !            67:     chv { toString } map /chv set
        !            68:
        !            69:     [ v vd join from_records
        !            70:       ring_of_polynomials
        !            71:       [vddd]  vdweight join weight_vector
        !            72:       0
        !            73:     ] define_ring
        !            74:     [chv {.} map] groebner_sugar 0 get { init } map /chii set
        !            75:
        !            76:     /rank.chii chii def
        !            77:     rank.verbose { chii message } {  } ifelse
        !            78:     v {[ 2 1 roll . (1).]} map /one set
        !            79:     %% [[(x). (1).] [(y). (1).] [(z). (1).]]
        !            80:     %% chii { one replace } map  %% buggy code.
        !            81:     %% Arg of hilb should be a reduced GB.
        !            82:     [chii { one replace } map] groebner 0 get
        !            83:     vd hilb /arg1 set
        !            84:   ] pop
        !            85:   popEnv
        !            86:   popVariables
        !            87:   arg1
        !            88: } def
        !            89:
        !            90:
        !            91: [(rank)
        !            92:  [( a rank b)
        !            93:   ( array a;  number b)
        !            94:   (Example 1 : )
        !            95:   $ [ [( (x Dx)^2 + ( y Dy)^2) ( x Dx y Dy -1)] (x,y)] rank :: $
        !            96:   (Example 2 : )
        !            97:   $[ [( (x^3-y^2) Dx + 3 x^2) ( (x^3-y^2) Dy - 2 y)] (x,y)] rank :: $
        !            98:  ]
        !            99: ] putUsages
        !           100: (rank ) messagen-quiet
        !           101:
        !           102: /characteristic.verbose 0 def
        !           103: /characteristic.v [(x) (y) (z)] def
        !           104: /characteristic.ch [ ] def
        !           105: /ch { characteristic } def
        !           106: /characteristic {
        !           107:   /arg1 set
        !           108:   [/in-rank /aa /typev /setarg /f /v /vsss /vddd
        !           109:    /gg /wv /vd  /chv
        !           110:    /one
        !           111:   ] pushVariables
        !           112:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           113:   [
        !           114:
        !           115:     /aa arg1 def
        !           116:     aa isArray { } { ( << array >> characteristic) error } ifelse
        !           117:     /setarg 0 def
        !           118:     aa { tag } map /typev set
        !           119:     typev [ ArrayP ] eq
        !           120:     {  /f aa 0 get def
        !           121:        /v characteristic.v def
        !           122:        /setarg 1 def
        !           123:     } { } ifelse
        !           124:     typev [ArrayP StringP] eq
        !           125:     {  /f aa 0 get def
        !           126:        /v [ aa 1 get to_records pop ] def
        !           127:        /setarg 1 def
        !           128:     } { } ifelse
        !           129:     typev [ArrayP ArrayP] eq
        !           130:     {  /f aa 0 get def
        !           131:        /v aa 1 get def
        !           132:        /setarg 1 def
        !           133:     } { } ifelse
        !           134:     setarg { } { (rank : Argument mismatch) error } ifelse
        !           135:
        !           136:     [(KanGBmessage) characteristic.verbose ] system_variable
        !           137:
        !           138:     f { toString } map /f set
        !           139:     v { @@@.Dsymbol 2 1 roll 2 cat_n 1 } map
        !           140:     /vddd set   %% vddd = [(Dx) 1 (Dy) 1 (Dz) 1]
        !           141:     v { @@@.Dsymbol 2 1 roll 2 cat_n } map
        !           142:     /vd set     %% vd = [(Dx) (Dy) (Dz)]
        !           143:
        !           144:     [v from_records
        !           145:      ring_of_differential_operators [vddd] weight_vector 0] define_ring
        !           146:     f { . dehomogenize } map /f set
        !           147:     [f] groebner_sugar 0 get /gg set
        !           148:
        !           149:     /wv vddd weightv def
        !           150:     gg { wv init } map /chv set
        !           151:     /characteristic.ch [chv] def
        !           152: %%    gg { wv init toString} map /chv set  %%obtained the characteristic variety.
        !           153: %%    /characteristic.ch chv def
        !           154:
        !           155: %%    [ v vd join from_records
        !           156: %%      ring_of_polynomials
        !           157: %%      [vddd] weight_vector
        !           158: %%      0
        !           159: %%    ] define_ring
        !           160: %%    [chv {.} map] groebner_sugar 0 get /characteristic.ch set
        !           161:
        !           162:     characteristic.ch /arg1 set
        !           163:   ] pop
        !           164:   popEnv
        !           165:   popVariables
        !           166:   arg1
        !           167: } def
        !           168:
        !           169: [(characteristic)
        !           170:  [( a characteristic b)
        !           171:   ( array a;  number b)
        !           172:   (b is the generator of the characteristic variety of a.)
        !           173:   (For the algorithm, see Japan J. of Industrial and Applied Math., 1994, 485--497.)
        !           174:   (Example 1 : )
        !           175:   $ [ [( (x Dx)^2 + ( y Dy)^2) ( x Dx y Dy -1)] (x,y)] characteristic :: $
        !           176:   (Example 2 : )
        !           177:   $[ [( (x^3-y^2) Dx + 3 x^2) ( (x^3-y^2) Dy - 2 y)] (x,y)] characteristic :: $
        !           178:  ]
        !           179: ] putUsages
        !           180: (characteristic ) messagen-quiet
        !           181: [(ch)
        !           182:  [(ch is the abbreviation of characteristic.)
        !           183:   ( a ch b)
        !           184:   ( array a;  number b)
        !           185:   (b is the generator of the characteristic variety of a.)
        !           186:   (For the algorithm, see, Japan J. of Industrial and Applied Math., 1994, 485--497.)
        !           187:   (Example 1 : )
        !           188:   $ [ [( (x Dx)^2 + ( y Dy)^2) ( x Dx y Dy -1)] (x,y)] ch :: $
        !           189:   (Example 2 : )
        !           190:   $[ [( (x^3-y^2) Dx + 3 x^2) ( (x^3-y^2) Dy - 2 y)] (x,y)] ch :: $
        !           191:  ]
        !           192: ] putUsages
        !           193: (ch ) messagen-quiet
        !           194:
        !           195: %%%% developing rrank.sm1
        !           196: /rrank.v [(x) (y) (z)] def   %% default value of v (variables).
        !           197: /rrank.init [ ] def  %% initial ideal.
        !           198: /rrank.verbose 0 def
        !           199: /rrank {
        !           200:   /arg1 set
        !           201:   [/in-rrank /aa /typev /setarg /f /v /vsss /vddd
        !           202:    /gg /wv /vd /vdweight
        !           203:    /one /i /chv
        !           204:   ] pushVariables
        !           205:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           206:   [
        !           207:
        !           208:     /aa arg1 def
        !           209:     aa isArray { } { ( << array >> rrank) error } ifelse
        !           210:     /setarg 0 def
        !           211:     aa { tag } map /typev set
        !           212:     typev [ ArrayP ] eq
        !           213:     {  /f aa 0 get def
        !           214:        /v rrank.v def
        !           215:        /setarg 1 def
        !           216:     } { } ifelse
        !           217:     typev [ArrayP StringP] eq
        !           218:     {  /f aa 0 get def
        !           219:        /v [ aa 1 get to_records pop ] def
        !           220:        /setarg 1 def
        !           221:     } { } ifelse
        !           222:     typev [ArrayP ArrayP] eq
        !           223:     {  /f aa 0 get def
        !           224:        /v aa 1 get def
        !           225:        /setarg 1 def
        !           226:     } { } ifelse
        !           227:     setarg { } { (rrank : Argument mismatch) error } ifelse
        !           228:
        !           229:     [(KanGBmessage) rrank.verbose ] system_variable
        !           230:
        !           231:     f { toString } map /f set
        !           232:     v { @@@.Dsymbol 2 1 roll 2 cat_n 1 } map
        !           233:
        !           234:     v { @@@.Dsymbol 2 1 roll 2 cat_n } map
        !           235:     /vd set     %% vd = [(Dx) (Dy) (Dz)] , v = [(x) (y) (z)]
        !           236:     /vdweight
        !           237:       [ 0 1 v length 1 sub { /i set v i get << 0 i sub >>
        !           238:                                     vd i get << i >> } for ]
        !           239:     def
        !           240:     rrank.verbose { vdweight message } { } ifelse
        !           241:
        !           242:     [v from_records
        !           243:      ring_of_differential_operators [vdweight] weight_vector 0] define_ring
        !           244:     f { . dehomogenize homogenize } map /f set
        !           245:     [f] groebner 0 get {dehomogenize} map /gg set
        !           246:
        !           247:     /wv vdweight weightv def
        !           248:     gg { wv init } map /rrank.init set  %%obtained the initial ideal
        !           249:     rrank.init {toString} map /chv set
        !           250:     /arg1 [chv v] rank def
        !           251:   ] pop
        !           252:   popEnv
        !           253:   popVariables
        !           254:   arg1
        !           255: } def
        !           256:
        !           257:
        !           258: [(rrank)
        !           259:  [( a rrank b)
        !           260:   ( array a;  number b)
        !           261:   (It computes the holonomic rank for regular holonomic system.)
        !           262:   (For the algorithm, see Grobner deformations of hypergeometric differential equations, 1999, Springer.)
        !           263:   (Chapter 2.)
        !           264:   (Example 1 : )
        !           265:   $ [ [( (x Dx)^2 + ( y Dy)^2) ( x Dx y Dy -1)] (x,y)] rrank :: $
        !           266:  ]
        !           267: ] putUsages
        !           268: (rrank ) messagen-quiet
        !           269:
        !           270: /gb.v 1 def
        !           271: /gb.verbose 0 def
        !           272: /gb {
        !           273:   /arg1 set
        !           274:   [/in-gb /aa /typev /setarg /f /v
        !           275:    /gg /wv /termorder /vec /ans /rr /mm
        !           276:   ] pushVariables
        !           277:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           278:   [
        !           279:
        !           280:     /aa arg1 def
        !           281:     aa isArray { } { ( << array >> gb) error } ifelse
        !           282:     /setarg 0 def
        !           283:     /wv 0 def
        !           284:     aa { tag } map /typev set
        !           285:     typev [ ArrayP ] eq
        !           286:     {  /f aa 0 get def
        !           287:        /v gb.v def
        !           288:        /setarg 1 def
        !           289:     } { } ifelse
        !           290:     typev [ArrayP StringP] eq
        !           291:     {  /f aa 0 get def
        !           292:        /v aa 1 get def
        !           293:        /setarg 1 def
        !           294:     } { } ifelse
        !           295:     typev [ArrayP ArrayP] eq
        !           296:     {  /f aa 0 get def
        !           297:        /v aa 1 get from_records def
        !           298:        /setarg 1 def
        !           299:     } { } ifelse
        !           300:     typev [ArrayP StringP ArrayP] eq
        !           301:     {  /f aa 0 get def
        !           302:        /v aa 1 get def
        !           303:        /wv aa 2 get def
        !           304:        /setarg 1 def
        !           305:     } { } ifelse
        !           306:     typev [ArrayP ArrayP ArrayP] eq
        !           307:     {  /f aa 0 get def
        !           308:        /v aa 1 get from_records def
        !           309:        /wv aa 2 get def
        !           310:        /setarg 1 def
        !           311:     } { } ifelse
        !           312:
        !           313:     setarg { } { (gb : Argument mismatch) error } ifelse
        !           314:
        !           315:     [(KanGBmessage) gb.verbose ] system_variable
        !           316:
        !           317:     %%% Start of the preprocess
        !           318:     f getRing /rr set
        !           319:     %% To the normal form : matrix expression.
        !           320:     f gb.toMatrixOfString /f set
        !           321:     /mm gb.itWasMatrix def
        !           322:
        !           323:     rr tag 0 eq {
        !           324:       %% Define our own ring
        !           325:       v isInteger {
        !           326:         (Error in gb: Specify variables) error
        !           327:       } {  } ifelse
        !           328:       wv isInteger {
        !           329:         [v ring_of_differential_operators
        !           330:         0] define_ring
        !           331:         /termorder 1 def
        !           332:       }{
        !           333:         [v ring_of_differential_operators
        !           334:          wv weight_vector
        !           335:         0] define_ring
        !           336:         wv gb.isTermOrder /termorder set
        !           337:       } ifelse
        !           338:     } {
        !           339:       %% Use the ring structre given by the input.
        !           340:       v isInteger not {
        !           341:         (Warning : the given ring definition is not used.) message
        !           342:       } {  } ifelse
        !           343:       rr ring_def
        !           344:       /wv rr gb.getWeight def
        !           345:       wv gb.isTermOrder /termorder set
        !           346:     } ifelse
        !           347:     %%% Enf of the preprocess
        !           348:
        !           349:
        !           350:     termorder {
        !           351:       f { {. dehomogenize} map } map /f set
        !           352:       [f] groebner_sugar 0 get /gg set
        !           353:     }{
        !           354:       f { {. dehomogenize} map} map /f set
        !           355:       f fromVectors { homogenize } map /f set
        !           356:       [f] groebner 0 get /gg set
        !           357:     }ifelse
        !           358:     wv isInteger {
        !           359:       /ans [gg gg {init} map] def
        !           360:     }{
        !           361:       /ans [gg gg {wv 0 get weightv init} map] def
        !           362:     }ifelse
        !           363:
        !           364:     %% Postprocess : recover the matrix expression.
        !           365:     mm {
        !           366:       ans { /tmp set [mm tmp] toVectors } map
        !           367:       /ans set
        !           368:     }{ }
        !           369:     ifelse
        !           370:     %%
        !           371:
        !           372:     /arg1 ans def
        !           373:   ] pop
        !           374:   popEnv
        !           375:   popVariables
        !           376:   arg1
        !           377: } def
        !           378: (gb ) messagen-quiet
        !           379:
        !           380: /pgb {
        !           381:   /arg1 set
        !           382:   [/in-pgb /aa /typev /setarg /f /v
        !           383:    /gg /wv /termorder /vec /ans /rr /mm
        !           384:   ] pushVariables
        !           385:   [(CurrentRingp) (KanGBmessage) (UseCriterion1)] pushEnv
        !           386:   [
        !           387:
        !           388:     /aa arg1 def
        !           389:     aa isArray { } { (<< array >> pgb) error } ifelse
        !           390:     /setarg 0 def
        !           391:     /wv 0 def
        !           392:     aa { tag } map /typev set
        !           393:     typev [ ArrayP ] eq
        !           394:     {  /f aa 0 get def
        !           395:        /v gb.v def
        !           396:        /setarg 1 def
        !           397:     } { } ifelse
        !           398:     typev [ArrayP StringP] eq
        !           399:     {  /f aa 0 get def
        !           400:        /v aa 1 get def
        !           401:        /setarg 1 def
        !           402:     } { } ifelse
        !           403:     typev [ArrayP ArrayP] eq
        !           404:     {  /f aa 0 get def
        !           405:        /v aa 1 get from_records def
        !           406:        /setarg 1 def
        !           407:     } { } ifelse
        !           408:     typev [ArrayP StringP ArrayP] eq
        !           409:     {  /f aa 0 get def
        !           410:        /v aa 1 get def
        !           411:        /wv aa 2 get def
        !           412:        /setarg 1 def
        !           413:     } { } ifelse
        !           414:     typev [ArrayP ArrayP ArrayP] eq
        !           415:     {  /f aa 0 get def
        !           416:        /v aa 1 get from_records def
        !           417:        /wv aa 2 get def
        !           418:        /setarg 1 def
        !           419:     } { } ifelse
        !           420:
        !           421:     setarg { } { (pgb : Argument mismatch) error } ifelse
        !           422:
        !           423:     [(KanGBmessage) gb.verbose ] system_variable
        !           424:
        !           425:     %%% Start of the preprocess
        !           426:     f getRing /rr set
        !           427:     %% To the normal form : matrix expression.
        !           428:     f gb.toMatrixOfString /f set
        !           429:     /mm gb.itWasMatrix def
        !           430:
        !           431:     rr tag 0 eq {
        !           432:       %% Define our own ring
        !           433:       v isInteger {
        !           434:         (Error in pgb: Specify variables) error
        !           435:       } {  } ifelse
        !           436:       wv isInteger {
        !           437:         [v ring_of_polynomials
        !           438:         0] define_ring
        !           439:         /termorder 1 def
        !           440:       }{
        !           441:         [v ring_of_polynomials
        !           442:          wv weight_vector
        !           443:         0] define_ring
        !           444:         wv gb.isTermOrder /termorder set
        !           445:       } ifelse
        !           446:     } {
        !           447:       %% Use the ring structre given by the input.
        !           448:       v isInteger not {
        !           449:         (Warning : the given ring definition is not used.) message
        !           450:       } {  } ifelse
        !           451:       rr ring_def
        !           452:       /wv rr gb.getWeight def
        !           453:       wv gb.isTermOrder /termorder set
        !           454:     } ifelse
        !           455:     %%% Enf of the preprocess
        !           456:
        !           457:
        !           458:     termorder {
        !           459:       f { {. dehomogenize} map } map /f set
        !           460:       [(UseCriterion1) 1] system_variable
        !           461:       [f] groebner_sugar 0 get /gg set
        !           462:       [(UseCriterion1) 0] system_variable
        !           463:     }{
        !           464:       f { {. dehomogenize} map} map /f set
        !           465:       f fromVectors { homogenize } map /f set
        !           466:       [(UseCriterion1) 1] system_variable
        !           467:       [f] groebner 0 get /gg set
        !           468:       [(UseCriterion1) 0] system_variable
        !           469:     }ifelse
        !           470:     wv isInteger {
        !           471:       /ans [gg gg {init} map] def
        !           472:     }{
        !           473:       /ans [gg gg {wv 0 get weightv init} map] def
        !           474:     }ifelse
        !           475:
        !           476:     %% Postprocess : recover the matrix expression.
        !           477:     mm {
        !           478:       ans { /tmp set [mm tmp] toVectors } map
        !           479:       /ans set
        !           480:     }{ }
        !           481:     ifelse
        !           482:     %%
        !           483:
        !           484:     /arg1 ans def
        !           485:   ] pop
        !           486:   popEnv
        !           487:   popVariables
        !           488:   arg1
        !           489: } def
        !           490:
        !           491: /pgb.old {
        !           492:   /arg1 set
        !           493:   [/in-pgb /aa /typev /setarg /f /v
        !           494:    /gg /wv /termorder /vec /ans
        !           495:   ] pushVariables
        !           496:   [(CurrentRingp) (KanGBmessage) (UseCriterion1)] pushEnv
        !           497:   [
        !           498:
        !           499:     /aa arg1 def
        !           500:     aa isArray { } { (array pgb) message (pgb) usage error } ifelse
        !           501:     /setarg 0 def
        !           502:     /wv 0 def
        !           503:     aa { tag } map /typev set
        !           504:     typev [ ArrayP ] eq
        !           505:     {  /f aa 0 get def
        !           506:        /v gb.v def
        !           507:        /setarg 1 def
        !           508:     } { } ifelse
        !           509:     typev [ArrayP StringP] eq
        !           510:     {  /f aa 0 get def
        !           511:        /v aa 1 get def
        !           512:        /setarg 1 def
        !           513:     } { } ifelse
        !           514:     typev [ArrayP ArrayP] eq
        !           515:     {  /f aa 0 get def
        !           516:        /v aa 1 get from_records def
        !           517:        /setarg 1 def
        !           518:     } { } ifelse
        !           519:     typev [ArrayP StringP ArrayP] eq
        !           520:     {  /f aa 0 get def
        !           521:        /v aa 1 get def
        !           522:        /wv aa 2 get def
        !           523:        /setarg 1 def
        !           524:     } { } ifelse
        !           525:     typev [ArrayP ArrayP ArrayP] eq
        !           526:     {  /f aa 0 get def
        !           527:        /v aa 1 get from_records def
        !           528:        /wv aa 2 get def
        !           529:        /setarg 1 def
        !           530:     } { } ifelse
        !           531:
        !           532:     setarg { } { (pgb : Argument mismatch) message error } ifelse
        !           533:
        !           534:     [(KanGBmessage) gb.verbose ] system_variable
        !           535:
        !           536:     %% Input must not be vectors.
        !           537:     f { toString } map /f set
        !           538:
        !           539:     wv isInteger {
        !           540:       [v ring_of_polynomials
        !           541:       0] define_ring
        !           542:       /termorder 1 def
        !           543:     }{
        !           544:       [v ring_of_polynomials
        !           545:        wv weight_vector
        !           546:       0] define_ring
        !           547:       wv gb.isTermOrder /termorder set
        !           548:     } ifelse
        !           549:     termorder {
        !           550:       f { . dehomogenize } map /f set
        !           551:       [(UseCriterion1) 1] system_variable
        !           552:       [f] groebner_sugar 0 get /gg set
        !           553:       [(UseCriterion1) 0] system_variable
        !           554:     }{
        !           555:       f { . dehomogenize homogenize} map /f set
        !           556:       [(UseCriterion1) 1] system_variable
        !           557:       [f] groebner 0 get /gg set
        !           558:       [(UseCriterion1) 0] system_variable
        !           559:     }ifelse
        !           560:     wv isInteger {
        !           561:       /ans [gg gg {init} map] def
        !           562:     }{
        !           563:       /ans [gg gg {wv 0 get weightv init} map] def
        !           564:     }ifelse
        !           565:     /arg1 ans def
        !           566:   ] pop
        !           567:   popEnv
        !           568:   popVariables
        !           569:   arg1
        !           570: } def
        !           571: (pgb ) messagen-quiet
        !           572:
        !           573: /gb.toMatrixOfString {
        !           574:   /arg1 set
        !           575:   [/in-gb.toMatrixOfString /ff /aa /ans] pushVariables
        !           576:   [
        !           577:      /aa arg1 def
        !           578:      aa length 0 eq { /ans [ ] def /gb.toMatrixOfString.LLL goto }{ } ifelse
        !           579:      aa 0 get isArray {
        !           580:        /gb.itWasMatrix aa 0 get length def
        !           581:      }{
        !           582:        /gb.itWasMatrix 0 def
        !           583:      } ifelse
        !           584:      aa {
        !           585:        /ff set
        !           586:        ff isArray {
        !           587:          ff {toString} map /ff set
        !           588:        }{
        !           589:          [ff toString] /ff set
        !           590:        } ifelse
        !           591:        ff
        !           592:      } map /ans set
        !           593:     /gb.toMatrixOfString.LLL
        !           594:     /arg1 ans def
        !           595:   ] pop
        !           596:   popVariables
        !           597:   arg1
        !           598: } def
        !           599: [(gb.toMatrixOfString)
        !           600: [(It translates given input into a matrix form which is a data structure)
        !           601:  (for computations of kernel, image, cokernel, etc.)
        !           602:  (gb.itWasMatrix is set to the length of the input vector.)
        !           603:  $Example 1: $
        !           604:  $  [ (x). (y).] gb.toMatrixOfString ==> [[(x)] [(y)]] $
        !           605:  $  gb.itWasMatrix is 0.$
        !           606:  $Example 2: $
        !           607:  $  [ [(x). (1).] [(y). (0).]] gb.toMatrixOfString ==>  [ [(x) (1)] [(y) (0)]] $
        !           608:  $  gb.itWasMatrix is 2.$
        !           609: ]] putUsages
        !           610:
        !           611: /gb.toMatrixOfPoly {
        !           612:   /arg1 set
        !           613:   [/in-gb.toMatrixOfPoly /ff /aa /ans] pushVariables
        !           614:   [
        !           615:      /aa arg1 def
        !           616:      aa length 0 eq { /ans [ ] def /gb.toMatrixOfPoly.LLL goto }{ } ifelse
        !           617:      aa 0 get isArray {
        !           618:        /gb.itWasMatrix aa 0 get length def
        !           619:      }{
        !           620:        /gb.itWasMatrix 0 def
        !           621:      } ifelse
        !           622:      aa {
        !           623:        /ff set
        !           624:        ff isArray {
        !           625:        }{
        !           626:          [ff] /ff set
        !           627:        } ifelse
        !           628:        ff
        !           629:      } map /ans set
        !           630:     /gb.toMatrixOfPoly.LLL
        !           631:     /arg1 ans def
        !           632:   ] pop
        !           633:   popVariables
        !           634:   arg1
        !           635: } def
        !           636: [(gb.toMatrixOfPoly)
        !           637: [(It translates given input into a matrix form which is a data structure)
        !           638:  (for computations of kernel, image, cokernel, etc.)
        !           639:  (gb.itWasMatrix is set to the length of the input vector.)
        !           640:  $Example 1: $
        !           641:  $  [ (x). (y).] gb.toMatrixOfPoly ==> [[(x)] [(y)]] $
        !           642:  $  gb.itWasMatrix is 0.$
        !           643:  $Example 2: $
        !           644:  $  [ [(x). (1).] [(y). (0).]] gb.toMatrixOfPoly ==>  [ [(x) (1)] [(y) (0)]] $
        !           645:  $  gb.itWasMatrix is 2.$
        !           646: ]] putUsages
        !           647:
        !           648: /gb.getWeight {
        !           649:   /arg1 set
        !           650:   [/in-gb.getWeight /rr /ww /vv /ans /nn /ii] pushVariables
        !           651:   [(CurrentRingp)] pushEnv
        !           652:   [
        !           653:      /rr arg1 def
        !           654:      rr ring_def
        !           655:      getVariableNames /vv set
        !           656:      [(orderMatrix)] system_variable 0 get /ww set
        !           657:      /nn vv length 1 sub def
        !           658:      [0 1 nn {
        !           659:         /ii set
        !           660:         ww ii get 0 eq {
        !           661:         } {
        !           662:           vv ii get
        !           663:           ww ii get
        !           664:         } ifelse
        !           665:       } for
        !           666:      ] /ans set
        !           667:      /arg1 [ans] def
        !           668:   ] pop
        !           669:   popEnv
        !           670:   popVariables
        !           671:   arg1
        !           672: } def
        !           673: [(gb.getWeight)
        !           674: [(ring gb.getWeight wv)
        !           675:  (It gets the weight vector field of the ring ring.)
        !           676: ]] putUsages
        !           677:
        !           678:
        !           679: /gb.isTermOrder {
        !           680:   /arg1 set
        !           681:   [/in-gb.isTermOrder /vv /ww /yes /i /j] pushVariables
        !           682:   [
        !           683:      /vv arg1 def
        !           684:      /yes 1 def
        !           685:      0 1 vv length 1 sub {
        !           686:        /i set
        !           687:        /ww vv i get def
        !           688:        0 1 ww length 1 sub {
        !           689:           /j set
        !           690:           ww j get isInteger {
        !           691:             ww j get 0 lt { /yes 0 def } { } ifelse
        !           692:           }{ } ifelse
        !           693:        }for
        !           694:      }for
        !           695:      /arg1 yes def
        !           696:   ] pop
        !           697:   popVariables
        !           698:   arg1
        !           699: } def
        !           700: [(gb)
        !           701:  [(a gb b)
        !           702:   (array a; array b;)
        !           703:   (b : [g ii];  array g; array in; g is a Grobner basis of f)
        !           704:   (             in the ring of differential operators.)
        !           705:    $            ii is the initial ideal in case of w is given or <<a>> belongs$
        !           706:    $            to a ring. In the other cases, it returns the initial monominal.$
        !           707:   (a : [f ];    array f;  f is a set of generators of an ideal in a ring.)
        !           708:   (a : [f v];   array f; string v;  v is the variables. )
        !           709:   (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
        !           710:   (  )
        !           711:   $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
        !           712:   $             [ [ (Dx) 1 ] ] ] gb pmat ; $
        !           713:   (Example 2: )
        !           714:   (To put h=1, type in, e.g., )
        !           715:   $ [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
        !           716:   $   [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] gb /gg set gg dehomogenize pmat ;$
        !           717:   (  )
        !           718:   $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) (  x y Dx Dy -1)] (x,y) $
        !           719:   $             [ [ (Dx) 1 (Dy) 1] ] ] gb pmat ; $
        !           720:   (  )
        !           721:   $Example 4: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
        !           722:   $             [ [ (x) -1 (y) -1] ] ] gb pmat ; $
        !           723:   (  )
        !           724:   (cf. gb, groebner, groebner_sugar, syz. )
        !           725: ]] putUsages
        !           726:
        !           727: [(pgb)
        !           728:  [(a pgb b)
        !           729:   (array a; array b;)
        !           730:   (b : [g ii];  array g; array in; g is a Grobner basis of f)
        !           731:   (             in the ring of polynomials.)
        !           732:   $             ii is the initial ideal in case of w is given or <<a>>belongs$
        !           733:   $             to a ring. In the other cases, it returns the initial monominal.$
        !           734:   (a : [f ];    array f;  f is a set of generators of an ideal in a ring.)
        !           735:   (a : [f v];   array f; string v;  v is the variables.)
        !           736:   (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
        !           737:   $Example 1: [(x,y) ring_of_polynomials 0] define_ring $
        !           738:   $           [ [(x^2+y^2-4). (x y -1).] ] pgb :: $
        !           739:   $Example 2: [ [(x^2+y^2) (x y)]   (x,y)  [ [(x) -1 (y) -1] ] ] pgb :: $
        !           740:   (cf. gb, groebner, groebner_sugar, syz. )
        !           741: ]] putUsages
        !           742:
        !           743:
        !           744: %/syz.v 1 def
        !           745: /syz.v 1 def
        !           746: /syz.verbose 0 def
        !           747: /syz {
        !           748:   /arg1 set
        !           749:   [/in-syz /aa /typev /setarg /f /v
        !           750:    /gg /wv /termorder /vec /ans /ggall /vectorInput /vsize /gtmp /gtmp2
        !           751:    /rr /mm
        !           752:   ] pushVariables
        !           753:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           754:   [
        !           755:
        !           756:     /aa arg1 def
        !           757:     aa isArray { } { (<< array >> syz) error } ifelse
        !           758:     /setarg 0 def
        !           759:     /wv 0 def
        !           760:     aa { tag } map /typev set
        !           761:     typev [ ArrayP ] eq
        !           762:     {  /f aa 0 get def
        !           763:        /v syz.v def
        !           764:        /setarg 1 def
        !           765:     } { } ifelse
        !           766:     typev [ArrayP StringP] eq
        !           767:     {  /f aa 0 get def
        !           768:        /v aa 1 get def
        !           769:        /setarg 1 def
        !           770:     } { } ifelse
        !           771:     typev [ArrayP ArrayP] eq
        !           772:     {  /f aa 0 get def
        !           773:        /v aa 1 get from_records def
        !           774:        /setarg 1 def
        !           775:     } { } ifelse
        !           776:     typev [ArrayP StringP ArrayP] eq
        !           777:     {  /f aa 0 get def
        !           778:        /v aa 1 get def
        !           779:        /wv aa 2 get def
        !           780:        /setarg 1 def
        !           781:     } { } ifelse
        !           782:     typev [ArrayP ArrayP ArrayP] eq
        !           783:     {  /f aa 0 get def
        !           784:        /v aa 1 get from_records def
        !           785:        /wv aa 2 get def
        !           786:        /setarg 1 def
        !           787:     } { } ifelse
        !           788:
        !           789:     setarg { } { (syz : Argument mismatch) error } ifelse
        !           790:
        !           791:     [(KanGBmessage) syz.verbose ] system_variable
        !           792:
        !           793:
        !           794:
        !           795:     %%% Start of the preprocess
        !           796:     f getRing /rr set
        !           797:     %% To the normal form : matrix expression.
        !           798:     f gb.toMatrixOfString /f set
        !           799:     /mm gb.itWasMatrix def
        !           800:     mm 0 gt {
        !           801:       /vectorInput 1 def
        !           802:     }{
        !           803:       /vectorInput 1 def
        !           804:     } ifelse
        !           805:
        !           806:     rr tag 0 eq {
        !           807:       %% Define our own ring
        !           808:       v isInteger {
        !           809:         (Error in syz: Specify variables) error
        !           810:       } {  } ifelse
        !           811:       wv isInteger {
        !           812:         [v ring_of_differential_operators
        !           813:         0] define_ring
        !           814:         /termorder 1 def
        !           815:       }{
        !           816:         [v ring_of_differential_operators
        !           817:          wv weight_vector
        !           818:         0] define_ring
        !           819:         wv gb.isTermOrder /termorder set
        !           820:       } ifelse
        !           821:     }{
        !           822:       %% Use the ring structre given by the input.
        !           823:       v isInteger not {
        !           824:         (Warning : the given ring definition is not used.) message
        !           825:       } {  } ifelse
        !           826:       rr ring_def
        !           827:       /wv rr gb.getWeight def
        !           828:       wv gb.isTermOrder /termorder set
        !           829:     } ifelse
        !           830:     %%% Enf of the preprocess
        !           831:
        !           832:     termorder {
        !           833:       f { {. dehomogenize} map } map /f set
        !           834:       [f [(needBack) (needSyz)]] groebner_sugar /ggall set
        !           835:       ggall 2 get /gg set
        !           836:     }{
        !           837:       f { {. dehomogenize } map homogenize } map /f set
        !           838:       [f [(needBack) (needSyz)]] groebner /ggall set
        !           839:       ggall 2 get /gg set
        !           840:     }ifelse
        !           841:     vectorInput {
        !           842:       /vsize f 0 get length def  %% input vector size.
        !           843:       /gtmp ggall 0 get def
        !           844:        [vsize gtmp] toVectors /gtmp set
        !           845:        ggall 0 gtmp put
        !           846:     }{  } ifelse
        !           847:       /arg1 [gg dehomogenize ggall] def
        !           848:   ] pop
        !           849:   popEnv
        !           850:   popVariables
        !           851:   arg1
        !           852: } def
        !           853: (syz ) messagen-quiet
        !           854:
        !           855: [(syz)
        !           856:  [(a syz [b c])
        !           857:   (array a; array b; array c)
        !           858:   (b is a set of generators of the syzygies of f.)
        !           859:   (c = [gb, backward transformation, syzygy without dehomogenization].)
        !           860:   (See groebner.)
        !           861:   (a : [f ];    array f;  f is a set of generators of an ideal in a ring.)
        !           862:   (a : [f v];   array f; string v;  v is the variables.)
        !           863:   (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
        !           864:   $Example 1: [(x,y) ring_of_polynomials 0] define_ring $
        !           865:   $           [ [(x^2+y^2-4). (x y -1).] ] syz :: $
        !           866:   $Example 2: [ [(x^2+y^2) (x y)]   (x,y)  [ [(x) -1 (y) -1] ] ] syz :: $
        !           867:   $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
        !           868:   $             [ [ (Dx) 1 ] ] ] syz pmat ; $
        !           869:   $Example 4:  [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
        !           870:   $             [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] syz pmat ;$
        !           871:   $Example 5:  [ [ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] $
        !           872:   $              (x,y) ] syz pmat ;$
        !           873:   $Example 6:  [ [ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] $
        !           874:   $              (x,y) [[(x) -1 (y) -2]] ] syz pmat ;$
        !           875:   $Example 7:  [ [ [(0) (0)] [(0) (0)] [(x) (y)]] $
        !           876:   $              [(x) (y)]] syz pmat ;$
        !           877: ]] putUsages
        !           878:
        !           879:
        !           880: %%%%%%%%%%%%%%%%%% package fs  %%%%%%%%%%%%%%%%%%%%%%%
        !           881: [(genericAnn)
        !           882:  [ (f [s v1 v2 ... vn] genericAnn [L1 ... Lm])
        !           883:    (L1, ..., Lm are annihilating ideal for f^s.)
        !           884:    (f is a polynomial of v1, ..., vn)
        !           885:    (<string> | <poly>  f, s, v1, ..., vn ; <poly>  L1, ..., Lm )
        !           886:    $Example: (x^3+y^3+z^3) [(s) (x) (y) (z)] genericAnn$
        !           887:  ]
        !           888: ] putUsages ( genericAnn ) messagen-quiet
        !           889: /fs.verbose 0 def
        !           890: /genericAnn {
        !           891:   /arg2 set /arg1 set
        !           892:   [/in-genericAnn /f /vlist /s  /vvv /nnn /rrr
        !           893:    /v1  /ops /ggg /ggg0
        !           894:    ] pushVariables
        !           895:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           896:   [
        !           897:     /f arg1 def  /vlist arg2 def
        !           898:     f toString /f set
        !           899:     vlist { toString } map /vlist set
        !           900:     [(KanGBmessage) fs.verbose] system_variable
        !           901:     /s vlist 0 get def
        !           902:     /vvv (_u,_v,_t,) vlist rest { (,) 2 cat_n } map aload length /nnn set
        !           903:          s nnn 2 add cat_n def
        !           904:     fs.verbose { vvv message } {  }ifelse
        !           905:     [vvv ring_of_differential_operators
        !           906:      [[(_u) 1 (_v) 1]] weight_vector 0] define_ring /rrr set
        !           907:
        !           908:     [ (_u*_t). f . sub  (_u*_v-1). ]
        !           909:     vlist rest { /v1 set
        !           910: %%D-clean   f . (D) v1 2 cat_n . 1 diff0 (_v*D_t). mul
        !           911:         f . @@@.Dsymbol v1 2 cat_n . 1 diff0 [(_v*) @@@.Dsymbol (_t)] cat . mul
        !           912:         @@@.Dsymbol v1 2 cat_n . add } map
        !           913:     join
        !           914:     /ops set
        !           915:     ops {[[(h). (1).]] replace } map /ops set
        !           916:     fs.verbose { ops message  } {  }ifelse
        !           917:     [ops] groebner_sugar 0 get /ggg0 set
        !           918:     fs.verbose { ggg0 message } { } ifelse
        !           919:     ggg0 [(_u) (_v)] eliminatev
        !           920: %%D-clean        { [(_t).] [ (D_t).] [s .] distraction
        !           921:         { [(_t).] [ [@@@.Dsymbol (_t)] cat .] [s .] distraction
        !           922:           [[s . << (0). s . sub (1). sub >>]] replace
        !           923:          } map /arg1 set
        !           924:   ] pop
        !           925:   popEnv
        !           926:   popVariables
        !           927:   arg1
        !           928: } def
        !           929:
        !           930: %% Find differential equations for  f^(m), r0 the minimal integral root.
        !           931: [(annfs)
        !           932:  [( [ f v m r0] annfs g )
        !           933:   (It returns the annihilating ideal of f^m where r0 must be smaller)
        !           934:   (or equal to the minimal integral root of the b-function.)
        !           935:   (Or, it returns the annihilating ideal of f^r0, r0 and the b-function)
        !           936:   (where r0 is the minial integral root of b.)
        !           937:   (For the algorithm, see J. Pure and Applied Algebra 117&118(1997), 495--518.)
        !           938:   (Example 1: [(x^2+y^2+z^2+t^2) (x,y,z,t) -1 -2] annfs :: )
        !           939:   $           It returns the annihilating ideal of (x^2+y^2+z^2+t^2)^(-1).$
        !           940:   (Example 2: [(x^2+y^2+z^2+t^2) (x,y,z,t)] annfs :: )
        !           941:   $           It returns the annihilating ideal of f^r0 and [r0, b-function]$
        !           942:   $           where r0 is the minimal integral root of the b-function.$
        !           943:   (Example 3: [(x^2+y^2+z^2) (x,y,z) -1 -1] annfs :: )
        !           944:   (Example 4: [(x^3+y^3+z^3) (x,y,z)] annfs :: )
        !           945:   (Example 5: [((x1+x2+x3)(x1 x2 + x2 x3 + x1 x3) - t x1 x2 x3 ) )
        !           946:   (            (t,x1,x2,x3) -1 -2] annfs :: )
        !           947:   (           Note that the example 4 uses huge memory space.)
        !           948: ]] putUsages
        !           949: ( annfs ) messagen-quiet
        !           950: /annfs.verbose fs.verbose def
        !           951: /annfs.v [(x) (y) (z)] def
        !           952: /annfs.s (_s) def
        !           953: %% The first variable must be s.
        !           954: /annfs {
        !           955:   /arg1 set
        !           956:   [/in-annfs /aa /typev /setarg  /v /m /r0 /gg /ss /fs /gg2
        !           957:    /ans /vtmp /w2 /velim /bbb /rrr /r0
        !           958:   ] pushVariables
        !           959:   [(CurrentRingp) (KanGBmessage)] pushEnv
        !           960:   [
        !           961:
        !           962:     /aa arg1 def
        !           963:     aa isArray { } { ( << array >> annfs) error } ifelse
        !           964:     /setarg 0 def
        !           965:     aa { tag } map /typev set
        !           966:     /r0 [ ] def
        !           967:     /m  [ ]  def
        !           968:     /v annfs.v def
        !           969:     aa 0 << aa 0 get toString >> put
        !           970:     typev [ StringP ] eq
        !           971:     {  /f aa 0 get def
        !           972:        /setarg 1 def
        !           973:     } { } ifelse
        !           974:     typev [StringP StringP] eq
        !           975:     {  /f aa 0 get def
        !           976:        /v [ aa 1 get to_records pop ] def
        !           977:        /setarg 1 def
        !           978:     } { } ifelse
        !           979:     typev [StringP ArrayP] eq
        !           980:     {  /f aa 0 get def
        !           981:        /v aa 1 get def
        !           982:        /setarg 1 def
        !           983:     } { } ifelse
        !           984:     typev [StringP ArrayP IntegerP IntegerP] eq
        !           985:     {  /f aa 0 get def
        !           986:        /v aa 1 get def
        !           987:        /m aa 2 get def
        !           988:        /r0 aa 3 get def
        !           989:        /setarg 1 def
        !           990:     } { } ifelse
        !           991:     typev [StringP StringP IntegerP IntegerP] eq
        !           992:     {  /f aa 0 get def
        !           993:        /v [ aa 1 get to_records pop ] def
        !           994:        /m aa 2 get def
        !           995:        /r0 aa 3 get def
        !           996:        /setarg 1 def
        !           997:     } { } ifelse
        !           998:     setarg 1 eq { } { (annfs : wrong argument) error } ifelse
        !           999:
        !          1000:     [annfs.s] v join /v set
        !          1001:
        !          1002:     /ss v 0 get def
        !          1003:     annfs.verbose {
        !          1004:        (f, v, s, f^{m}, m+r0 = ) messagen
        !          1005:        [ f  (, ) v  (, )  ss  (, )
        !          1006:          (f^) m (,) m (+)  r0 ] {messagen} map ( ) message
        !          1007:     } { } ifelse
        !          1008:
        !          1009:     f v genericAnn /fs set
        !          1010:
        !          1011:     annfs.verbose {
        !          1012:       (genericAnn is ) messagen fs message
        !          1013:     } { } ifelse
        !          1014:     [(KanGBmessage) annfs.verbose] system_variable
        !          1015:
        !          1016:     m isArray {
        !          1017:       %% Now, let us find  the b-function. /vtmp /w2 /velim /bbb /rrr /r0
        !          1018:       v rest { /vtmp set vtmp  @@@.Dsymbol vtmp 2 cat_n } map /velim set
        !          1019:       velim { 1 } map /w2 set
        !          1020:       annfs.verbose { w2 message } {  } ifelse
        !          1021:       [v from_records ring_of_differential_operators
        !          1022:        [w2] weight_vector 0] define_ring
        !          1023:       [ fs { toString . } map [ f toString . ] join ]
        !          1024:       groebner_sugar 0 get velim eliminatev 0 get /bbb set
        !          1025:       [[(s) annfs.s] from_records ring_of_polynomials 0] define_ring
        !          1026:       bbb toString . [[annfs.s . (s).]] replace /bbb set
        !          1027:       annfs.verbose { bbb message } {  } ifelse
        !          1028:       bbb findIntegralRoots  /rrr set
        !          1029:       rrr 0 get /r0 set  %% minimal integral root.
        !          1030:       annfs.verbose { rrr message } {  } ifelse
        !          1031:       fs 0 get (ring) dc ring_def
        !          1032:       fs { [[annfs.s . r0 toString .]] replace } map /ans set
        !          1033:       /ans [ans [r0 bbb]] def
        !          1034:       /annfs.label1 goto
        !          1035:     } { } ifelse
        !          1036:     m 0 ge {
        !          1037:       (annfs works only for getting annihilating ideal for f^(negative))
        !          1038:       error
        !          1039:     } { } ifelse
        !          1040:     r0 isArray {
        !          1041:       [(Need to compute the minimal root of b-function) nl
        !          1042:        (It has not been implemented.) ] cat
        !          1043:       error
        !          1044:     } {  } ifelse
        !          1045:
        !          1046:     [v from_records ring_of_differential_operators 0] define_ring
        !          1047:     fs {toString . dehomogenize [[ss . r0 (poly) dc]] replace}
        !          1048:        map /gg set
        !          1049:     annfs.verbose { gg message } { } ifelse
        !          1050:
        !          1051:     [ [f . << m r0 sub >> npower ] gg join
        !          1052:       [(needBack) (needSyz)]] groebner_sugar 2 get /gg2 set
        !          1053:
        !          1054:     gg2 { 0 get } map /ans set
        !          1055:     /ans ans { dup (0). eq {pop} { } ifelse } map def
        !          1056:
        !          1057:     /annfs.label1
        !          1058:     /arg1 ans def
        !          1059:   ] pop
        !          1060:   popEnv
        !          1061:   popVariables
        !          1062:   arg1
        !          1063: } def
        !          1064:
        !          1065: /genericAnnWithL.s (s) def
        !          1066: /annfs.verify 0 def
        !          1067: /genericAnnWithL {
        !          1068:   /arg1 set
        !          1069:   [/in-genericAnnWithL /aa /typev /setarg  /v /m /r0 /gg /ss /fs /gg2
        !          1070:    /ans /vtmp /w2 /velim /bbb /rrr /r0  /myL /mygb /jj
        !          1071:   ] pushVariables
        !          1072:   [(CurrentRingp) (KanGBmessage) (Homogenize)] pushEnv
        !          1073:   [
        !          1074:
        !          1075:     /aa arg1 def
        !          1076:     aa isArray { } { ( << array >> annfs) error } ifelse
        !          1077:     /setarg 0 def
        !          1078:     aa { tag } map /typev set
        !          1079:     /r0 [ ] def
        !          1080:     /m  [ ]  def
        !          1081:     /v annfs.v def
        !          1082:     aa 0 << aa 0 get toString >> put
        !          1083:     typev [ StringP ] eq
        !          1084:     {  /f aa 0 get def
        !          1085:        /setarg 1 def
        !          1086:     } { } ifelse
        !          1087:     typev [StringP StringP] eq
        !          1088:     {  /f aa 0 get def
        !          1089:        /v [ aa 1 get to_records pop ] def
        !          1090:        /setarg 1 def
        !          1091:     } { } ifelse
        !          1092:     typev [StringP ArrayP] eq
        !          1093:     {  /f aa 0 get def
        !          1094:        /v aa 1 get def
        !          1095:        /setarg 1 def
        !          1096:     } { } ifelse
        !          1097:     setarg 1 eq { } { (genericAnnWithL : wrong argument) error } ifelse
        !          1098:
        !          1099:     [genericAnnWithL.s] v join /v set
        !          1100:
        !          1101:     /ss v 0 get def
        !          1102:     annfs.verbose {
        !          1103:        (f, v, s, f^{m}, m+r0 = ) messagen
        !          1104:        [ f  (, ) v  (, )  ss  (, )
        !          1105:          (f^) m (,) m (+)  r0 ] {messagen} map ( ) message
        !          1106:     } { } ifelse
        !          1107:
        !          1108:     f v genericAnn /fs set
        !          1109:
        !          1110:     annfs.verbose {
        !          1111:       (genericAnn is ) messagen fs message
        !          1112:     } { } ifelse
        !          1113:     [(KanGBmessage) annfs.verbose] system_variable
        !          1114:
        !          1115:     m isArray {
        !          1116:       %% Now, let us find  the b-function. /vtmp /w2 /velim /bbb /rrr /r0
        !          1117:       v rest { /vtmp set vtmp  @@@.Dsymbol vtmp 2 cat_n } map /velim set
        !          1118:       velim { 1 } map /w2 set
        !          1119:       annfs.verbose { w2 message } {  } ifelse
        !          1120:       [v from_records ring_of_differential_operators
        !          1121:        [w2] weight_vector 0] define_ring
        !          1122:
        !          1123:       [ [ f toString . ] fs { toString . } map join [(needBack)]]
        !          1124:       groebner_sugar /mygb set
        !          1125:       mygb 0 get velim eliminatev 0 get /bbb set
        !          1126:       mygb 0 get bbb position /jj set
        !          1127:       mygb 1 get jj get 0 get /myL set
        !          1128:
        !          1129:       annfs.verbose { bbb message } {  } ifelse
        !          1130:
        !          1131:       annfs.verify {
        !          1132:         (Verifying L f - b belongs to genericAnn(f)) message
        !          1133:         [(Homogenize) 0] system_variable
        !          1134:         << myL f . mul bbb sub >>
        !          1135:         [fs { toString . } map] groebner_sugar 0 get
        !          1136:         reduction 0 get message
        !          1137:         (Is it zero? Then it's fine.) message
        !          1138:       } { } ifelse
        !          1139:
        !          1140:       /ans [bbb [myL fs] ] def
        !          1141:       /annfs.label1 goto
        !          1142:     } { } ifelse
        !          1143:
        !          1144:     /annfs.label1
        !          1145:     /arg1 ans def
        !          1146:   ] pop
        !          1147:   popEnv
        !          1148:   popVariables
        !          1149:   arg1
        !          1150: } def
        !          1151:
        !          1152:
        !          1153: [(genericAnnWithL)
        !          1154: [$[f v] genericAnnWithL [b [L I]]$
        !          1155:  $String f,v; poly b,L; array of poly I;$
        !          1156:  $f is a polynomial given by a string. v is the variables.$
        !          1157:  $ v must not contain names  s, e.$
        !          1158:  $b is the b-function (Bernstein-Sato polynomial) for f and$
        !          1159:  $ L is the operator satisfying L f^{s+1} = b(s) f^s $
        !          1160:  $ I is the annihilating ideal of f^s.$
        !          1161:  $cf. bfunction, annfs, genericAnn.$
        !          1162:  $Example 1:  [(x^2+y^2) (x,y)] genericAnnWithL ::$
        !          1163:  $Example 2:  [(x^2+y^2+z^2) (x,y,z)] genericAnnWithL ::$
        !          1164:  $Example 3:  [(x^3-y^2 z^2) (x,y,z)] genericAnnWithL ::$
        !          1165: ]] putUsages
        !          1166:
        !          1167:
        !          1168: ( ) message-quiet ;
        !          1169:
        !          1170:
        !          1171:
        !          1172:
        !          1173:
        !          1174:

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