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

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

1.1     ! maekawa     1: %%% oaku/kan/bfunction.sm1, 1998, 11/5
        !             2:
        !             3: %%% global variables for bfunction
        !             4: %%% bfunction.*
        !             5: /bfunction.version (2.981105) def
        !             6: bfunction.version [(Version)] system_variable gt
        !             7: { (This package requires the latest version of kan/sm1) message
        !             8:   (Please get it from http://www.math.kobe-u.ac.jp/KAN) message
        !             9:   error
        !            10: } { } ifelse
        !            11: /bfunction.v [(x) (y) (z)] def   %% default variables of the input polynomial
        !            12: /bfunction.s (s) def             %% default variable of the output b-function
        !            13: /bfunction.vh (v_) def           %% default variable for V-homogenization
        !            14: /bfunction.t (t_) def            %% default variable for t in delta(t-f)
        !            15: /bfunction.a  [] def             %% parameters are not available yet
        !            16: /bfunction.verbose 0 def         %% no messages if 0
        !            17: /bfunction.strategy 0 def        %% V-homogenization + h-homogenization if 0
        !            18:                                  %% V-homogenization if 1 (not available yet)
        !            19:                                  %% h-homogenization if 2 (not available yet)
        !            20: /bfunction.result 0 def
        !            21:
        !            22: (bfunction.sm1,  11/05,1998  (C) T. Oaku.  bfunction ) message-quiet
        !            23:
        !            24: [(bfunction)
        !            25:  [( a bfunction b)
        !            26:   (array a; poly b;)
        !            27:   (a :  [f] ;  string f ;)
        !            28:   (a :  [f] ;  polynomial f ;)
        !            29:   (a :  [f v] ; string f,v; )
        !            30:   (a :  [f v] ; polynomial f, string v; )
        !            31:   (b is the b-function (=Bernstein-Sato polynomial) of a polynomial f)
        !            32:   (in variables v.)
        !            33:   (If v is not specified, the variables are assumed to be (x,y,z). )
        !            34:   (b will be a polynomial in s.  This variable can be changed by typing in)
        !            35:   (  (variable) /bfunction.s set )
        !            36:   (For the algorithm, see Duke Math. J. 87 (1997),115-132,)
        !            37:   (   J. Pure and Applied Algebra 117&118(1997), 495--518.)
        !            38:   $Example  [(x^3-y^2) (x,y)] bfunction :: $
        !            39:  ]
        !            40: ] putUsages
        !            41:
        !            42: /bfunction {
        !            43:   /arg1 set
        !            44:   [/aa /typev /setarg /f /s /v /bf /bfs /vt ] pushVariables
        !            45:   [(CurrentRingp) (KanGBmessage)] pushEnv  %% push current global environment.
        !            46:   [
        !            47:
        !            48:     /aa arg1 def
        !            49:     aa isArray { } { (array bfunction) message error } ifelse
        !            50:     /setarg 0 def
        !            51:     aa { tag } map /typev set
        !            52:     typev [ StringP ] eq
        !            53:     {  /f aa 0 get def
        !            54:        /v bfunction.v def
        !            55:        /s bfunction.s def
        !            56:        /setarg 1 def
        !            57:     } { } ifelse
        !            58:     typev [ PolyP ] eq
        !            59:     {  /f aa 0 get (string) data_conversion def
        !            60:        /v bfunction.v def
        !            61:        /s bfunction.s def
        !            62:        /setarg 1 def
        !            63:     } { } ifelse
        !            64:     typev [StringP StringP] eq
        !            65:     {  /f aa 0 get def
        !            66:        /v [ aa 1 get to_records pop ] def
        !            67:        /s bfunction.s def
        !            68:        /setarg 1 def
        !            69:     } { } ifelse
        !            70:     typev [PolyP StringP] eq
        !            71:     {  /f aa 0 get (string) data_conversion def
        !            72:        /v [ aa 1 get to_records pop ] def
        !            73:        /s bfunction.s def
        !            74:        /setarg 1 def
        !            75:     } { } ifelse
        !            76:     typev [StringP ArrayP] eq
        !            77:     {  /f aa 0 get def
        !            78:        /v aa 1 get def
        !            79:        /s bfunction.s def
        !            80:        /setarg 1 def
        !            81:     } { } ifelse
        !            82:     typev [PolyP ArrayP] eq
        !            83:     {  /f aa 0 get (string) data_conversion def
        !            84:        /v aa 1 get def
        !            85:        /s bfunction.s def
        !            86:        /setarg 1 def
        !            87:     } { } ifelse
        !            88:     setarg { } { (Argument mismatch) message error } ifelse
        !            89:
        !            90:     [(KanGBmessage) bfunction.verbose] system_variable
        !            91:
        !            92:     v bfunction.t append /vt set
        !            93:
        !            94:     [f v fw_delta bfunction.t vt] indicial 0 get /bf set
        !            95:     [bfunction.s ring_of_polynomials 0] define_ring
        !            96:     bf . /bf set
        !            97:     bfunction.s . /bfs set
        !            98:     bf [[bfs (-1). bfs sub]] replace /bf set
        !            99:     /bfunction.result bf def
        !           100:     /arg1 bf def
        !           101:   ] pop
        !           102:   popEnv
        !           103:   popVariables
        !           104:   arg1
        !           105: } def
        !           106:
        !           107: %%  Computing the indicial polynomial (the b-function) of a D-module
        !           108: /indicial {
        !           109:   /arg1 set  %% [equations, the variable to be restricted to 0, all variables]
        !           110:   [/eqs /t /vars /allvars /newvars /x_vars /ans1 /ans2 ] pushVariables
        !           111:   [(CurrentRingp)] pushEnv
        !           112:   [
        !           113:     arg1 0 get /eqs set
        !           114:     arg1 1 get /t set
        !           115:     arg1 2 get /vars set
        !           116:     vars bfunction.s append /allvars set
        !           117:     [bfunction.t] allvars complement /newvars set
        !           118:     [bfunction.t] vars complement /x_vars set
        !           119:     [eqs t vars] indicial1 /ans1 set
        !           120:     [ans1 x_vars newvars] eliminate_Dx /ans2 set
        !           121:     [ans2 x_vars newvars] eliminate_x /arg1 set
        !           122:   ] pop
        !           123:   popEnv
        !           124:   popVariables
        !           125:   arg1
        !           126: } def
        !           127:
        !           128: %% (-1,0;1,0)-Groebner basis
        !           129: %% [equations (t) vars] indical1 ---> psi(BFequations) (as a list of strings)
        !           130: /indicial1 {
        !           131:  /arg1 set
        !           132:  [/bft /bfs /bfh /bf1 /ff /ans /n /i /BFallvarlist /BFDvarlist
        !           133:   /BFs_weight /BFvarlist ] pushVariables
        !           134:  [(CurrentRingp)] pushEnv
        !           135:  [
        !           136:   /ff arg1 0 get def
        !           137:   /bft arg1 1 get def
        !           138:   /BFvarlist arg1 2 get def
        !           139:   /BFallvarlist
        !           140:     [ bfunction.vh bfunction.s] BFvarlist concat bfunction.a concat
        !           141:   def
        !           142:   BFvarlist length /n set
        !           143:   BFvarlist {xtoDx} map /BFDvarlist set
        !           144:   /BFs_weight
        !           145:     [ [ bfunction.vh 1 ]
        !           146:       [ 0 1 n 1 sub
        !           147:           { /i set BFDvarlist i get 1 }
        !           148:         for
        !           149:         0 1 n 1 sub
        !           150:           { /i set BFvarlist i get 1 }
        !           151:         for ]
        !           152:     ] def
        !           153:
        !           154:   [ BFallvarlist listtostring ring_of_differential_operators
        !           155:     BFs_weight weight_vector
        !           156:   0] define_ring
        !           157:
        !           158:   /bfh  (h). def
        !           159:   /bfs  bfunction.vh . def
        !           160:   /bf1  (1). def
        !           161:   ff { bft fw_homogenize . } map /ff set
        !           162:   ff {[[bfh bf1]] replace} map {homogenize} map /ff set
        !           163:   [ff] groebner 0 get {[[bfh bf1]] replace} map /ff set
        !           164:   ff reducedBase /ans set
        !           165:   ans {bft fw_psi} map /ans set
        !           166:   ans {(string) data_conversion} map /arg1 set
        !           167:   ] pop
        !           168:   popEnv
        !           169:  popVariables
        !           170:  arg1
        !           171: } def
        !           172:
        !           173: %% eliminates Dx in the ring of differential operators
        !           174: /eliminate_Dx {
        !           175:  /arg1 set  %% [operators x variables]
        !           176:  [/bfh /bf1 /ff /ans /nx /ny /x_varlist /Dx_weight /BFvarlist
        !           177:    /allvarlist /Dx_varlist /y_varlist /Dy_varlist /allvarlist /i
        !           178:  ] pushVariables
        !           179:  [(CurrentRingp)] pushEnv
        !           180:  [
        !           181:   /ff arg1 0 get def
        !           182:   /x_varlist arg1 1 get def
        !           183:   /BFvarlist arg1 2 get def
        !           184:   x_varlist length /nx set
        !           185:   BFvarlist bfunction.a concat /allvarlist set
        !           186:
        !           187:   x_varlist {xtoDx} map /Dx_varlist set
        !           188:   x_varlist BFvarlist complement /y_varlist set
        !           189:   y_varlist length /ny set
        !           190:   y_varlist {xtoDx} map /Dy_varlist set
        !           191:
        !           192:   /Dx_weight
        !           193:     [ [ 0 1 nx 1 sub
        !           194:           { /i set Dx_varlist i get 1 }
        !           195:         for ]
        !           196:       [ 0 1 nx 1 sub
        !           197:           { /i set x_varlist i get 1 }
        !           198:         for
        !           199:         0 1 ny 1 sub
        !           200:           { /i set y_varlist i get 1 }
        !           201:         for
        !           202:         0 1 ny 1 sub
        !           203:           { /i set Dy_varlist i get 1 }
        !           204:         for
        !           205:       ]
        !           206:     ] def
        !           207:
        !           208:   [ allvarlist listtostring  ring_of_differential_operators
        !           209:     Dx_weight weight_vector
        !           210:   0] define_ring
        !           211:
        !           212:   /bfh (h). def
        !           213:   /bf1 (1). def
        !           214:   ff {.} map /ff set
        !           215:   ff {[[bfh bf1]] replace} map {homogenize} map /ff set
        !           216:   bfunction.verbose 1 eq
        !           217:     {(Eliminating the derivations w.r.t. ) messagen x_varlist ::}
        !           218:     { }
        !           219:   ifelse
        !           220:   [ff] groebner 0 get {[[bfh bf1]] replace} map /ff set
        !           221:   ff reducedBase /ans set
        !           222:   ans Dx_varlist eliminatev /ans set
        !           223:   ans {(string) data_conversion} map /arg1 set
        !           224:  ] pop
        !           225:  popEnv
        !           226:  popVariables
        !           227:  arg1
        !           228: } def
        !           229:
        !           230: %% eliminates x in the ring of polynomials
        !           231: /eliminate_x {
        !           232:  /arg1 set  %% [operators x variables]
        !           233:  [/bfh /bfs /bf1 /ff /ans /nx /ny /x_varlist  /BFvarlist
        !           234:    /allvarlist /y_varlist /i
        !           235:  ] pushVariables
        !           236:  [(CurrentRingp)] pushEnv
        !           237:  [
        !           238:   /ff arg1 0 get def
        !           239:   /x_varlist arg1 1 get def
        !           240:   /BFvarlist arg1 2 get def
        !           241:   x_varlist length /nx set
        !           242:   BFvarlist bfunction.a concat /allvarlist set
        !           243:
        !           244:   x_varlist BFvarlist complement /y_varlist set
        !           245:   y_varlist length /ny set
        !           246:
        !           247:   /x_weight
        !           248:     [ [ 0 1 nx 1 sub
        !           249:           { /i set x_varlist i get 1 }
        !           250:         for ]
        !           251:       [ 0 1 ny 1 sub
        !           252:           { /i set y_varlist i get 1 }
        !           253:         for
        !           254:       ]
        !           255:     ] def
        !           256:
        !           257:   [ allvarlist listtostring  ring_of_polynomials x_weight weight_vector
        !           258:   0] define_ring
        !           259:
        !           260:   /bfh (h). def
        !           261:   /bf1 (1). def
        !           262:   ff {.} map /ff set
        !           263:   ff {[[bfh bf1]] replace} map {homogenize} map /ff set
        !           264:   bfunction.verbose 1 eq
        !           265:     {(Eliminating the variables ) messagen x_varlist ::}
        !           266:     { }
        !           267:   ifelse
        !           268:   [ff] groebner 0 get {[[bfh bf1]] replace} map /ff set
        !           269:   ff reducedBase /ans set
        !           270:   ans x_varlist eliminatev /ans set
        !           271:   ans {(string) data_conversion} map /arg1 set
        !           272:  ] pop
        !           273:  popEnv
        !           274:  popVariables
        !           275:  arg1
        !           276: } def
        !           277: %%%%%%%%%%%%%%%%%%%%%%% libraries  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        !           278:
        !           279: %% FW-principal part of an operator (FW-homogeneous)
        !           280: %%  Op (poly) fw_symbol --->  FW-symbol(Op)  (poly)
        !           281: /fw_symbol {
        !           282:   [[(h). (1).]] replace bfunction.vh . coefficients 1 get 0 get
        !           283: } def
        !           284:
        !           285: %% FW-homogenization
        !           286: %% Op (string) (t) fw_homogenize ---> h(Op) (string)
        !           287: /fw_homogenize {
        !           288:   /arg2 set  %% bft (string)
        !           289:   /arg1 set  %% an operator (string)
        !           290:   [ /bft /bfDt /bfht /bfhDt /Op /degs /m /mn ] pushVariables
        !           291:   [
        !           292:     /Op arg1 expand def
        !           293:     /bft arg2 def
        !           294:     bft xtoDx /bfDt set
        !           295:     bfunction.vh (^(-1)*) bft 3 cat_n /bfht set
        !           296:     bfunction.vh (*) bfDt 3 cat_n /bfhDt set
        !           297:     Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
        !           298:       /Op set
        !           299:     Op bfunction.vh expand coefficients 0 get
        !           300:       {(integer) data_conversion} map /degs set
        !           301:     degs << degs length 1 sub >> get /m set
        !           302:     0 m sub /mn set
        !           303:     << bfunction.vh expand mn powerZ >> Op mul /Op set
        !           304:     Op (string) data_conversion /arg1 set
        !           305:   ] pop
        !           306:   popVariables
        !           307:   arg1
        !           308: } def
        !           309:
        !           310: %% setup the ring of differential operators with the variables varlist
        !           311: %% and parameters bfunction.a
        !           312: %% varlist setupBFring
        !           313: /setupDring {
        !           314:   /arg1 set
        !           315:   [ /varlist /bft /allvarlist /n /dvarlist /D_weight /i
        !           316:   ] pushVariables
        !           317:   [
        !           318:     arg1 /varlist set
        !           319:     /allvarlist
        !           320:       varlist bfunction.a join
        !           321:     def
        !           322:     varlist length /n set
        !           323:     varlist {xtoDx} map /dvarlist set
        !           324:     /D_weight
        !           325:     [ [ 0 1 n 1 sub
        !           326:           { /i set dvarlist i get 1 }
        !           327:         for ]
        !           328:       [
        !           329:         0 1 n 1 sub
        !           330:           { /i set varlist i get 1 }
        !           331:         for ]
        !           332:     ] def
        !           333:
        !           334:     [ allvarlist listtostring ring_of_differential_operators
        !           335:       D_weight weight_vector
        !           336:     0] define_ring
        !           337:
        !           338:   ] pop
        !           339:   popVariables
        !           340: } def
        !           341:
        !           342: %% psi(P)(s)
        !           343: %% Op (poly) (t) (string) fw_psi ---> psi(P) (poly)
        !           344: %% Op should be FW-homogeneous.
        !           345: /fw_psi {
        !           346:  /arg2 set  %% bft (string)
        !           347:  /arg1 set  %% Op  (polynomial)
        !           348:  [/bft /bfDt /P /tt /dtt /k /Q /i /m /kk /PPt /PPC /kk /Ss] pushVariables
        !           349:  [
        !           350:   arg2 /bft set
        !           351:   arg1 fw_symbol /P set
        !           352:   /bfDt bft xtoDx def
        !           353:   /tt bft expand def  /dtt bfDt expand def
        !           354:   P bft fw_order /k set
        !           355:     << 1 1 k >>
        !           356:     {pop tt P mul /P set }
        !           357:     for
        !           358:     << -1 -1 k >>
        !           359:     {pop dtt P mul /P set }
        !           360:     for
        !           361:   (0) expand /Q set
        !           362:   P dtt coefficients 0 get length /m set
        !           363:   0 1 << m 1 sub >>
        !           364:   {
        !           365:     /i set
        !           366:     P dtt coefficients 0 get i get /kk set
        !           367:     kk (integer) data_conversion /kk set
        !           368:     P dtt coefficients 1 get i get /PPt set
        !           369:     PPt tt coefficients 1 get 0 get /PPC set
        !           370:     bfunction.s expand /Ss set
        !           371:     0 1 << kk 1 sub >> {
        !           372:       pop
        !           373:       PPC Ss mul /PPC set
        !           374:       Ss (1) expand sub /Ss set
        !           375:     } for
        !           376:     Q PPC add /Q set
        !           377:   } for
        !           378:   Q  /arg1 set
        !           379:  ] pop
        !           380:  popVariables
        !           381:  arg1
        !           382: } def
        !           383:
        !           384: %% get the FW-order
        !           385: %% Op (poly) (t) fw_order ---> FW-ord(Op) (integer)
        !           386: %% Op should be FW-homogenized.
        !           387: /fw_order {
        !           388:  /arg2 set  %% bft (string)
        !           389:  /arg1 set  %% Op (poly)
        !           390:  [/Op /bft /fws /m /fwsDt /k /tt /dtt] pushVariables
        !           391:  [
        !           392:   arg1 /Op set
        !           393:   arg2 /bft set
        !           394:   Op fw_symbol /fws set
        !           395:   /tt bft expand def
        !           396:   /dtt bft xtoDx  expand def
        !           397:   fws [[bfunction.s expand  (1).]] replace /fws set
        !           398:   fws dtt coefficients 0 get 0 get /m set
        !           399:   fws dtt coefficients 1 get 0 get /fwsDt set
        !           400:   fwsDt tt coefficients 0 get 0 get /k set
        !           401:   m k sub (integer) data_conversion /arg1 set
        !           402:  ] pop
        !           403:  popVariables
        !           404:  arg1
        !           405: } def
        !           406:
        !           407: /remove0 {
        !           408:   /arg1 set
        !           409:   arg1 (0). eq
        !           410:   { } {arg1} ifelse
        !           411: } def
        !           412:
        !           413: %% functions for list operations etc.
        !           414:
        !           415: /notidentical {
        !           416:   /arg2 set
        !           417:   /arg1 set
        !           418:   arg1 arg2 eq
        !           419:   { } {arg1} ifelse
        !           420: } def
        !           421:
        !           422: %% [(x1) (x2) (x3)] ---> (x1,x2,x3)
        !           423: /listtostring {
        !           424:   /arg1 set
        !           425:   [/n /j /ary /str] pushVariables
        !           426:   [
        !           427:     /ary arg1 def
        !           428:     /n ary length def
        !           429:     arg1 0 get /str set
        !           430:     n 1 gt
        !           431:       { str (,) 2 cat_n /str set }{ }
        !           432:     ifelse
        !           433:     1 1 n 1 sub {
        !           434:       /j set
        !           435:       j n 1 sub eq
        !           436:         {str << ary j get >>  2 cat_n /str set}
        !           437:         {str << ary j get >>  (,) 3 cat_n /str set}
        !           438:       ifelse
        !           439:     } for
        !           440:     /arg1 str def
        !           441:   ] pop
        !           442:   popVariables
        !           443:   arg1
        !           444: } def
        !           445:
        !           446: %% (x1) --> (Dx1)
        !           447: /xtoDx {
        !           448:   /arg1 set
        !           449:   @@@.Dsymbol arg1 2 cat_n
        !           450: } def
        !           451:
        !           452: %% concatenate two lists
        !           453: /concat {
        !           454:   /arg2 set
        !           455:   /arg1 set
        !           456:   [/n /j /lst1 /lst2 ] pushVariables
        !           457:   [
        !           458:     /lst1 arg1 def
        !           459:     /lst2 arg2 def
        !           460:     /n lst2 length def
        !           461:     0 1 n 1 sub {
        !           462:       /j set
        !           463:       lst1 lst2 j get append /lst1 set
        !           464:     } for
        !           465:     /arg1 lst1 def
        !           466:   ] pop
        !           467:   popVariables
        !           468:   arg1
        !           469: } def
        !           470:
        !           471: %% var (poly) m (integer) ---> var^m (poly)
        !           472: /powerZ {
        !           473:   /arg2 set %% m
        !           474:   /arg1 set %% Var
        !           475:   [ /m /var /varstr /pow /nvar] pushVariables
        !           476:   [
        !           477:     arg1 /var set
        !           478:     arg2 /m set
        !           479:     var (string) data_conversion /varstr set
        !           480:     m -1 gt
        !           481:       { var m npower /pow set}
        !           482:       { varstr (^(-1)) 2 cat_n expand /nvar set
        !           483:         nvar << 0 m sub >> npower /pow set
        !           484:        }
        !           485:     ifelse
        !           486:     pow /arg1 set
        !           487:   ] pop
        !           488:   popVariables
        !           489:   arg1
        !           490: } def
        !           491:
        !           492:
        !           493: %% (f) varlist fw_delta ---> [t - f, Dx + f_xDt, ...]
        !           494: /fw_delta {
        !           495:   /arg2 set %% [(x) (y) ...]
        !           496:   /arg1 set %% (f)
        !           497:   [ /fstr /f /bft /n /j /varlist /dxvarlist /allvarlist /xi /fxi /dxi /dt
        !           498:     /delta /BFdt /BFDtx_weight ] pushVariables
        !           499:   [
        !           500:     arg1 /fstr set
        !           501:     arg2 /varlist set
        !           502:     [bfunction.t] varlist join bfunction.a join /allvarlist set
        !           503:     bfunction.t xtoDx /BFdt set
        !           504:     varlist {xtoDx} map /dxvarlist set
        !           505:     varlist length /n set
        !           506:     /BFDtx_weight [ [ BFdt 1
        !           507:       0 1 n 1 sub {/j set varlist j get 1} for ]
        !           508:       [ bfunction.t 1
        !           509:       0 1 n 1 sub {/j set dxvarlist j get 1} for ]
        !           510:     ] def
        !           511:
        !           512:     [ allvarlist listtostring ring_of_differential_operators
        !           513:      BFDtx_weight weight_vector  0 ] define_ring
        !           514:
        !           515:     fstr expand /f set
        !           516:     bfunction.t expand /bft set
        !           517:     BFdt expand /dt set
        !           518:     /delta [
        !           519:       bft f sub
        !           520:       0 1 n 1 sub {
        !           521:         /i set
        !           522:         varlist i get xtoDx expand /dxi set
        !           523:        << dxi f mul >> << f dxi mul >> sub [[(h). (1).]] replace /fxi set
        !           524:         dxi << fxi dt mul >> add
        !           525:       } for
        !           526:     ] def
        !           527:     delta {(string) data_conversion} map /arg1 set
        !           528:   ] pop
        !           529:   popVariables
        !           530:   arg1
        !           531: } def
        !           532:
        !           533:
        !           534:
        !           535:
        !           536:

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