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

Annotation of OpenXM/src/kan96xx/Kan/dr.sm1, Revision 1.1.1.1

1.1       maekawa     1: %% dr.sm1 (Define Ring) 1994/9/25, 26
                      2: %% This file is error clean.
                      3:
                      4: @@@.quiet {   }
                      5: { (macro package : dr.sm1,   9/26,1995 --- Version 9/8, 1999. ) message } ifelse
                      6:
                      7: /ctrlC-hook {
                      8: %%% define your own routing in case of error.
                      9: } def
                     10: [(ctrlC-hook)
                     11: [(When ctrl-C is pressed, this function is executed.)
                     12:  (User can define one's own ctrlC-hook function.)
                     13: ]] putUsages
                     14:
                     15: %% n evenQ  bool
                     16: /evenQ {
                     17:   /arg1 set
                     18:   arg1 2 idiv  2 mul arg1 sub 0 eq
                     19:   { true }
                     20:   { false } ifelse
                     21: } def
                     22:
                     23: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                     24: /ring_of_polynomials {
                     25:   /arg1 set
                     26:   [/vars /n /i /xList /dList /param] pushVariables
                     27:   %dup print (-----) message
                     28:   [
                     29:      (mmLarger) (matrix) switch_function
                     30:      (mpMult)   (poly) switch_function
                     31:      (red@)     (module1) switch_function
                     32:      (groebner) (standard) switch_function
                     33:      (isSameComponent) (x) switch_function
                     34:
                     35:      [arg1 to_records pop] /vars set
                     36:      vars length evenQ
                     37:      { }
                     38:      { vars [(PAD)] join /vars set }
                     39:      ifelse
                     40:      vars length 2 idiv /n set
                     41:      [ << n 1 sub >> -1 0
                     42:           { /i set
                     43:             vars i get
                     44:           } for
                     45:      ] /xList set
                     46:      [ << n 1 sub >> -1 0
                     47:           { /i set
                     48:             vars << i n add >> get
                     49:           } for
                     50:      ] /dList set
                     51:
                     52:      [(H)] xList join [@@@.esymbol] join /xList set
                     53:      [(h)] dList join [@@@.Esymbol] join /dList set
                     54:      [0 %% dummy characteristic
                     55:       << xList length >> << xList length >> << xList length >>
                     56:                                             << xList length >>
                     57:       << xList length 1 sub >> << xList length >> << xList length >>
                     58:                                                   << xList length >>
                     59:      ] /param set
                     60:
                     61:      [xList dList param] /arg1 set
                     62:    ] pop
                     63:    popVariables
                     64:    arg1
                     65: } def
                     66:
                     67: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                     68: %% with no graduation and homogenization variables.
                     69: /ring_of_polynomials2 {
                     70:   /arg1 set
                     71:   [/vars /n /i /xList /dList /param] pushVariables
                     72:   %dup print (-----) message
                     73:   [
                     74:      (mmLarger) (matrix) switch_function
                     75:      (mpMult)   (poly) switch_function
                     76:      (red@)     (module1) switch_function
                     77:      (groebner) (standard) switch_function
                     78:      (isSameComponent) (x) switch_function
                     79:
                     80:      [arg1 to_records pop] /vars set
                     81:      vars length evenQ
                     82:      { }
                     83:      { vars [(PAD)] join /vars set }
                     84:      ifelse
                     85:      vars length 2 idiv /n set
                     86:      [ << n 1 sub >> -1 0
                     87:           { /i set
                     88:             vars i get
                     89:           } for
                     90:      ] /xList set
                     91:      [ << n 1 sub >> -1 0
                     92:           { /i set
                     93:             vars << i n add >> get
                     94:           } for
                     95:      ] /dList set
                     96:
                     97:      [0 %% dummy characteristic
                     98:       << xList length >> << xList length >> << xList length >>
                     99:                                             << xList length >>
                    100:       << xList length >> << xList length >> << xList length >>
                    101:                                             << xList length >>
                    102:      ] /param set
                    103:
                    104:      [xList dList param] /arg1 set
                    105:    ] pop
                    106:    popVariables
                    107:    arg1
                    108: } def
                    109:
                    110: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                    111: %% with no homogenization variables.
                    112: /ring_of_polynomials3 {
                    113:   /arg1 set
                    114:   [/vars /n /i /xList /dList /param] pushVariables
                    115:   %dup print (-----) message
                    116:   [
                    117:      (mmLarger) (matrix) switch_function
                    118:      (mpMult)   (poly) switch_function
                    119:      (red@)     (module1) switch_function
                    120:      (groebner) (standard) switch_function
                    121:      (isSameComponent) (x) switch_function
                    122:
                    123:      [arg1 to_records pop] /vars set
                    124:      vars length evenQ
                    125:      { }
                    126:      { vars [(PAD)] join /vars set }
                    127:      ifelse
                    128:      vars length 2 idiv /n set
                    129:      [ << n 1 sub >> -1 0
                    130:           { /i set
                    131:             vars i get
                    132:           } for
                    133:      ] /xList set
                    134:      xList [@@@.esymbol] join /xList set
                    135:      [ << n 1 sub >> -1 0
                    136:           { /i set
                    137:             vars << i n add >> get
                    138:           } for
                    139:      ] /dList set
                    140:      dList [@@@.Esymbol] join /dList set
                    141:
                    142:      [0 %% dummy characteristic
                    143:       << xList length >> << xList length >> << xList length >>
                    144:                                             << xList length >>
                    145:       << xList length >> << xList length >> << xList length >>
                    146:                                             << xList length >>
                    147:      ] /param set
                    148:
                    149:      [xList dList param] /arg1 set
                    150:    ] pop
                    151:    popVariables
                    152:    arg1
                    153: } def
                    154:
                    155: /ring_of_differential_operators {
                    156:   /arg1 set
                    157:   [/vars /n /i /xList /dList /param] pushVariables
                    158:   [
                    159:      (mmLarger) (matrix) switch_function
                    160:      (mpMult)   (diff) switch_function
                    161:      (red@)     (module1) switch_function
                    162:      (groebner) (standard) switch_function
                    163:      (isSameComponent) (x) switch_function
                    164:
                    165:      [arg1 to_records pop] /vars set %[x y z]
                    166:      vars reverse /xList set         %[z y x]
                    167:      vars {@@@.Dsymbol 2 1 roll 2 cat_n} map
                    168:      reverse /dList set              %[Dz Dy Dx]
                    169:      [(H)] xList join [@@@.esymbol] join /xList set
                    170:      [(h)] dList join [@@@.Esymbol] join /dList set
                    171:      [0 1 1 1 << xList length >>
                    172:         1 1 1 << xList length 1 sub >> ] /param set
                    173:      [ xList dList param ] /arg1 set
                    174:   ] pop
                    175:   popVariables
                    176:   arg1
                    177: } def
                    178:
                    179: /ring_of_differential_operators3 {
                    180: %% with no homogenization variables.
                    181:   /arg1 set
                    182:   [/vars /n /i /xList /dList /param] pushVariables
                    183:   [
                    184:      (mmLarger) (matrix) switch_function
                    185:      (mpMult)   (diff) switch_function
                    186:      (red@)     (module1) switch_function
                    187:      (groebner) (standard) switch_function
                    188:      (isSameComponent) (x) switch_function
                    189:
                    190:      [arg1 to_records pop] /vars set %[x y z]
                    191:      vars reverse /xList set         %[z y x]
                    192:      vars {@@@.Dsymbol 2 1 roll 2 cat_n} map
                    193:      reverse /dList set              %[Dz Dy Dx]
                    194:      xList [@@@.esymbol] join /xList set
                    195:      dList [@@@.Esymbol] join /dList set
                    196:      [0 0 0 0 << xList length >>
                    197:         0 0 0 << xList length 1 sub >> ] /param set
                    198:      [ xList dList param ] /arg1 set
                    199:   ] pop
                    200:   popVariables
                    201:   arg1
                    202: } def
                    203:
                    204: /ring_of_q_difference_operators {
                    205:   /arg1 set
                    206:   [/vars /n /i /xList /dList /param] pushVariables
                    207:   [
                    208:      (mmLarger) (matrix) switch_function
                    209:      (mpMult)   (diff) switch_function
                    210:      (red@)     (module1) switch_function
                    211:      (groebner) (standard) switch_function
                    212:      (isSameComponent) (x) switch_function
                    213:
                    214:      [arg1 to_records pop] /vars set %[x y z]
                    215:      vars reverse /xList set         %[z y x]
                    216:      vars {@@@.Qsymbol 2 1 roll 2 cat_n} map
                    217:      reverse /dList set              %[Dz Dy Dx]
                    218:      [(q)] xList join [@@@.esymbol] join /xList set
                    219:      [(h)] dList join [@@@.Esymbol] join /dList set
                    220:      [0 1 << xList length >> << xList length >> << xList length >>
                    221:         1 << xList length 1 sub >> << xList length >> << xList length >> ]
                    222:      /param set
                    223:      [ xList dList param ] /arg1 set
                    224:   ] pop
                    225:   popVariables
                    226:   arg1
                    227: } def
                    228:
                    229: /ring_of_q_difference_operators3 {
                    230: %% with no homogenization and q variables.
                    231:   /arg1 set
                    232:   [/vars /n /i /xList /dList /param] pushVariables
                    233:   [
                    234:      (mmLarger) (matrix) switch_function
                    235:      (mpMult)   (diff) switch_function
                    236:      (red@)     (module1) switch_function
                    237:      (groebner) (standard) switch_function
                    238:      (isSameComponent) (x) switch_function
                    239:
                    240:      [arg1 to_records pop] /vars set %[x y z]
                    241:      vars reverse /xList set         %[z y x]
                    242:      vars {@@@.Qsymbol 2 1 roll 2 cat_n} map
                    243:      reverse /dList set              %[Dz Dy Dx]
                    244:      xList  [@@@.esymbol] join /xList set
                    245:      dList  [@@@.Esymbol] join /dList set
                    246:      [0 0 << xList length >> << xList length >> << xList length >>
                    247:         0 << xList length 1 sub >> << xList length >> << xList length >> ]
                    248:      /param set
                    249:      [ xList dList param ] /arg1 set
                    250:   ] pop
                    251:   popVariables
                    252:   arg1
                    253: } def
                    254:
                    255: /ring_of_difference_operators {
                    256:   /arg1 set
                    257:   [/vars /n /i /xList /dList /param] pushVariables
                    258:   [
                    259:      (mmLarger) (matrix) switch_function
                    260:      (mpMult)   (difference) switch_function
                    261:      (red@)     (module1) switch_function
                    262:      (groebner) (standard) switch_function
                    263:      (isSameComponent) (x) switch_function
                    264:
                    265:      [arg1 to_records pop] /vars set %[x y z]
                    266:      vars reverse /xList set         %[z y x]
                    267:      vars {@@@.diffEsymbol 2 1 roll 2 cat_n} map
                    268:      reverse /dList set              %[Dz Dy Dx]
                    269:      [(H)] xList join [@@@.esymbol] join /xList set
                    270:      [(h)] dList join [@@@.Esymbol] join /dList set
                    271:      [0 1 1 << xList length >> << xList length >>
                    272:         1 1 << xList length 1 sub >> << xList length >> ] /param set
                    273:      [ xList dList param ] /arg1 set
                    274:   ] pop
                    275:   popVariables
                    276:   arg1
                    277: } def
                    278:
                    279:
                    280:
                    281: /reverse {
                    282:   /arg1 set
                    283:   arg1 length 1 lt
                    284:   { [ ] }
                    285:   {
                    286:     [
                    287:      <<  arg1 length 1 sub >> -1 0
                    288:      {
                    289:         arg1 2 1 roll get
                    290:       } for
                    291:      ]
                    292:    } ifelse
                    293: } def
                    294:
                    295: /memberQ {
                    296: %% a set0 memberQ bool
                    297:   /arg2 set  /arg1 set
                    298:   [/a /set0 /flag /i ] pushVariables
                    299:   [
                    300:      /a arg1 def  /set0 arg2 def
                    301:      /flag 0 def
                    302:      0 1 << set0 length 1 sub >>
                    303:      {
                    304:         /i set
                    305:         << set0 i get >> a eq
                    306:         {
                    307:            /flag 1 def
                    308:          }
                    309:         { }
                    310:         ifelse
                    311:      } for
                    312:   ] pop
                    313:   /arg1 flag def
                    314:   popVariables
                    315:   arg1
                    316: } def
                    317:
                    318: /transpose {
                    319:   /arg1 set
                    320:   [/mat /m /n /ans /i /j] pushVariables
                    321:   [
                    322:     /mat arg1 def
                    323:     /m mat length def
                    324:     mat 0 get isArray
                    325:     {   }
                    326:     { (transpose: Argument must be an array of arrays.) error }
                    327:     ifelse
                    328:     /n mat 0 get length def
                    329:     /ans [ 1 1 n { pop [ 1 1 m { pop 0 } for ]} for ] def
                    330:     0 1 << m 1 sub >> {
                    331:        /i set
                    332:        0 1 << n 1 sub >> {
                    333:          /j set
                    334:          ans [ j i ]  <<  mat i get j get >> put
                    335:       } for
                    336:     } for
                    337:    /arg1 ans def
                    338:   ] pop
                    339:   popVariables
                    340:   arg1
                    341: } def
                    342:
                    343:
                    344: /getPerm {
                    345: %% old new getPerm perm
                    346:   /arg2 set /arg1 set
                    347:   [/old /new /i /j /p] pushVariables
                    348:   [
                    349:     /old arg1 def
                    350:     /new arg2 def
                    351:     [
                    352:         /p old length def
                    353:         0 1 << p 1 sub >>
                    354:         {
                    355:            /i set
                    356:            0 1 << p 1 sub >>
                    357:            {
                    358:               /j set
                    359:               old i get
                    360:               new j get
                    361:               eq
                    362:               { j }
                    363:               {   } ifelse
                    364:             } for
                    365:          } for
                    366:      ] /arg1 set
                    367:    ] pop
                    368:    popVariables
                    369:    arg1
                    370: } def
                    371:
                    372: /permuteOrderMatrix {
                    373: %% order perm puermuteOrderMatrix newOrder
                    374:   /arg2 set /arg1 set
                    375:   [/order /perm /newOrder /k ] pushVariables
                    376:   [
                    377:     /order arg1 def
                    378:     /perm arg2 def
                    379:     order transpose /order set
                    380:     order 1 copy /newOrder set pop
                    381:
                    382:     0 1 << perm length 1 sub >>
                    383:     {
                    384:        /k set
                    385:        newOrder << perm k get >> << order k get >> put
                    386:     } for
                    387:     newOrder transpose /newOrder set
                    388:   ] pop
                    389:   /arg1 newOrder def
                    390:   popVariables
                    391:   arg1
                    392: } def
                    393:
                    394:
                    395:
                    396: /complement {
                    397: %% set0 universe complement compl
                    398:   /arg2 set /arg1 set
                    399:   [/set0 /universe /compl /i] pushVariables
                    400:    /set0 arg1 def  /universe arg2 def
                    401:   [
                    402:      0 1 << universe length 1 sub >>
                    403:      {
                    404:         /i set
                    405:         << universe i get >> set0 memberQ
                    406:         {   }
                    407:         { universe i get }
                    408:         ifelse
                    409:       } for
                    410:    ] /arg1 set
                    411:    popVariables
                    412:    arg1
                    413: } def
                    414:
                    415:
                    416: %%% from order.sm1
                    417:
                    418: %% size i evec [0 0 ... 0 1 0 ... 0]
                    419: /evec {
                    420:  /arg2 set /arg1 set
                    421:  [/size /iii] pushVariables
                    422:  /size arg1 def  /iii arg2 def
                    423:  [
                    424:    0 1 << size 1 sub >>
                    425:    {
                    426:       iii eq
                    427:       {  1 }
                    428:       {  0 }
                    429:       ifelse
                    430:    } for
                    431:   ] /arg1 set
                    432:   popVariables
                    433:   arg1
                    434: } def
                    435:
                    436: %% size i evec_neg [0 0 ... 0 -1 0 ... 0]
                    437: /evec_neg {
                    438:  /arg2 set /arg1 set
                    439:  [/size /iii] pushVariables
                    440:  /size arg1 def  /iii arg2 def
                    441:  [
                    442:    0 1 << size 1 sub >>
                    443:    {
                    444:       iii eq
                    445:       {  -1 }
                    446:       {  0 }
                    447:       ifelse
                    448:    } for
                    449:   ] /arg1 set
                    450:   popVariables
                    451:   arg1
                    452: } def
                    453:
                    454:
                    455: %% size i j e_ij  << matrix e(i,j) >>
                    456: /e_ij {
                    457:   /arg3 set /arg2 set /arg1 set
                    458:   [/size /k /i /j] pushVariables
                    459:   [
                    460:     /size arg1 def  /i arg2 def /j arg3 def
                    461:     [ 0 1 << size 1 sub >>
                    462:       {
                    463:          /k set
                    464:          k i eq
                    465:          { size j evec }
                    466:          {
                    467:             k j eq
                    468:             { size i evec }
                    469:             { size k evec }
                    470:             ifelse
                    471:           } ifelse
                    472:        } for
                    473:      ] /arg1 set
                    474:    ] pop
                    475:    popVariables
                    476:    arg1
                    477: } def
                    478:
                    479:
                    480: %% size i j d_ij  << matrix E_{ij} >>
                    481: /d_ij {
                    482:   /arg3 set /arg2 set /arg1 set
                    483:   [/size /k /i /j] pushVariables
                    484:   [
                    485:     /size arg1 def  /i arg2 def /j arg3 def
                    486:     [ 0 1 << size 1 sub >>
                    487:       {
                    488:          /k set
                    489:          k i eq
                    490:          { size j evec }
                    491:          {
                    492:             [ 0 1 << size 1 sub >> { pop 0} for ]
                    493:           } ifelse
                    494:        } for
                    495:      ] /arg1 set
                    496:    ] pop
                    497:    popVariables
                    498:    arg1
                    499: } def
                    500:
                    501: %% size matid << id matrix  >>
                    502: /matid {
                    503:   /arg1 set
                    504:   [/size /k ] pushVariables
                    505:   [
                    506:     /size arg1 def
                    507:     [ 0 1 << size 1 sub >>
                    508:       {
                    509:          /k set
                    510:          size k evec
                    511:        } for
                    512:      ] /arg1 set
                    513:    ] pop
                    514:    popVariables
                    515:    arg1
                    516: } def
                    517:
                    518:
                    519: %% m1 m2 oplus
                    520: /oplus {
                    521:   /arg2 set /arg1 set
                    522:   [/m1 /m2 /n /m  /k ] pushVariables
                    523:   [
                    524:     /m1 arg1 def  /m2 arg2 def
                    525:     m1 length /n set
                    526:     m2 length /m set
                    527:     [
                    528:       0 1 << n m add 1 sub >>
                    529:       {
                    530:         /k set
                    531:         k n lt
                    532:         {
                    533:             << m1 k get >> << m -1 evec >> join
                    534:         }
                    535:         {
                    536:             << n -1 evec >> << m2 << k n sub >> get >> join
                    537:         } ifelse
                    538:       } for
                    539:      ] /arg1 set
                    540:    ] pop
                    541:    popVariables
                    542:    arg1
                    543: } def
                    544:
                    545: %%%%%%%%%%%%%%%%%%%%%%%
                    546:
                    547: /eliminationOrderTemplate  { %% esize >= 1
                    548: %% if esize == 0, it returns reverse lexicographic order.
                    549: %%  m esize eliminationOrderTemplate mat
                    550:   /arg2 set /arg1 set
                    551:   [/m  /esize /m1 /m2 /k ] pushVariables
                    552:   [
                    553:     /m arg1 def  /esize arg2 def
                    554:     /m1 m esize sub 1 sub def
                    555:     /m2 esize 1 sub def
                    556:      [esize 0 gt
                    557:       {
                    558:        [1 1 esize
                    559:         { pop 1 } for
                    560:         esize 1 << m 1 sub >>
                    561:         { pop 0 } for
                    562:        ]  %% 1st vector
                    563:       }
                    564:       { } ifelse
                    565:
                    566:       m esize gt
                    567:       {
                    568:        [1 1  esize
                    569:         { pop 0 } for
                    570:         esize 1 << m 1 sub >>
                    571:         { pop 1 } for
                    572:        ]  %% 2nd vector
                    573:       }
                    574:       { } ifelse
                    575:
                    576:       m1 0 gt
                    577:       {
                    578:          m 1 sub -1 << m m1 sub >>
                    579:          {
                    580:               /k set
                    581:               m  k  evec_neg
                    582:          } for
                    583:       }
                    584:       { } ifelse
                    585:
                    586:       m2 0 gt
                    587:       {
                    588:          << esize 1 sub >> -1 1
                    589:          {
                    590:               /k set
                    591:               m  k  evec_neg
                    592:          } for
                    593:       }
                    594:       { } ifelse
                    595:
                    596:     ] /arg1 set
                    597:    ] pop
                    598:    popVariables
                    599:    arg1
                    600: } def
                    601:
                    602: /elimination_order {
                    603: %% [x-list d-list params]  (x,y,z) elimination_order
                    604: %%  vars                    evars
                    605: %% [x-list d-list params order]
                    606:   /arg2 set  /arg1 set
                    607:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    608:   /vars arg1 def /evars [arg2 to_records pop] def
                    609:   [
                    610:     /univ vars 0 get reverse
                    611:           vars 1 get reverse join
                    612:     def
                    613:
                    614:     << univ length 2 sub >>
                    615:     << evars length >>
                    616:     eliminationOrderTemplate /order set
                    617:
                    618:     [[1]] order oplus [[1]] oplus /order set
                    619:
                    620:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    621:
                    622:     /compl
                    623:       [univ 0 get] evars join evars univ0 complement join
                    624:     def
                    625:     compl univ
                    626:     getPerm /perm set
                    627:     %%perm :: univ :: compl ::
                    628:
                    629:     order perm permuteOrderMatrix /order set
                    630:
                    631:
                    632:     vars [order] join /arg1 set
                    633:   ] pop
                    634:   popVariables
                    635:   arg1
                    636: } def
                    637:
                    638: /elimination_order2 {
                    639: %% [x-list d-list params]  (x,y,z) elimination_order
                    640: %%  vars                    evars
                    641: %% [x-list d-list params order]
                    642: %% with no graduation and homogenization variables.
                    643:   /arg2 set  /arg1 set
                    644:   [/vars /evars /univ /order /perm /compl] pushVariables
                    645:   /vars arg1 def /evars [arg2 to_records pop] def
                    646:   [
                    647:     /univ vars 0 get reverse
                    648:           vars 1 get reverse join
                    649:     def
                    650:
                    651:     << univ length  >>
                    652:     << evars length >>
                    653:     eliminationOrderTemplate /order set
                    654:     /compl
                    655:       evars << evars univ complement >> join
                    656:     def
                    657:     compl univ
                    658:     getPerm /perm set
                    659:     %%perm :: univ :: compl ::
                    660:
                    661:     order perm permuteOrderMatrix /order set
                    662:
                    663:     vars [order] join /arg1 set
                    664:   ] pop
                    665:   popVariables
                    666:   arg1
                    667: } def
                    668:
                    669:
                    670: /elimination_order3 {
                    671: %% [x-list d-list params]  (x,y,z) elimination_order
                    672: %%  vars                    evars
                    673: %% [x-list d-list params order]
                    674:   /arg2 set  /arg1 set
                    675:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    676:   /vars arg1 def /evars [arg2 to_records pop] def
                    677:   [
                    678:     /univ vars 0 get reverse
                    679:           vars 1 get reverse join
                    680:     def
                    681:
                    682:     << univ length 1 sub >>
                    683:     << evars length >>
                    684:     eliminationOrderTemplate /order set
                    685:
                    686:     [[1]] order oplus  /order set
                    687:
                    688:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    689:
                    690:     /compl
                    691:       [univ 0 get] evars join evars univ0 complement join
                    692:     def
                    693:     compl univ
                    694:     getPerm /perm set
                    695:     %%perm :: univ :: compl ::
                    696:
                    697:     order perm permuteOrderMatrix /order set
                    698:
                    699:     vars [order] join /arg1 set
                    700:   ] pop
                    701:   popVariables
                    702:   arg1
                    703: } def
                    704:
                    705:
                    706: /define_ring {
                    707: %[  (x,y,z) ring_of_polynominals
                    708: %   (x,y) elimination_order
                    709: %   17
                    710: %] define_ring
                    711: % or
                    712: %[  (x,y,z) ring_of_polynominals
                    713: %   (x,y) elimination_order
                    714: %   17
                    715: %   [(keyword) value (keyword) value ...]
                    716: %] define_ring
                    717:    /arg1 set
                    718:    [/rp /param /foo] pushVariables
                    719:    [/rp arg1 def
                    720:
                    721:      rp 0 get length 3 eq {
                    722:        rp 0  [rp 0 get 0 get rp 0 get 1 get rp 0 get 2 get ]
                    723:              ( ) elimination_order put
                    724:      } { } ifelse
                    725:
                    726:     [
                    727:       rp 0 get 0 get             %% x-list
                    728:       rp 0 get 1 get             %% d-list
                    729:       rp 0 get 2 get /param set
                    730:       param 0 << rp 1 get >> put %% << rp 1 get >> is 17 in the example.
                    731:       param                      %% parameters.
                    732:       rp 0 get 3 get             %% order matrix.
                    733:       rp length 2 eq
                    734:       { [  ] }                   %% null optional argument.
                    735:       { rp 2 get }
                    736:       ifelse
                    737:     ]  /foo set
                    738:     foo aload pop set_up_ring@
                    739:    ] pop
                    740:    popVariables
                    741:    [(CurrentRingp)] system_variable
                    742: } def
                    743:
                    744:
                    745: [(define_qring)
                    746:   [( [varlist ring_of_q_difference_operators order characteristic] define_qring)
                    747:    (    Pointer to the ring. )
                    748:    (Example: [$x,y$ ring_of_q_difference_operators $Qx,Qy$ elimination_order)
                    749:    (          0] define_qring )
                    750:    (cf. define_ring, set_up_ring@ <coefficient ring>, ring_def, << ,, >>)
                    751:   ]
                    752: ] putUsages
                    753: /define_qring {
                    754: %[  (x,y,z) ring_of_q_difference_operators
                    755: %   (Qx,Qy) elimination_order
                    756: %   17
                    757: %] define_qring
                    758:    /arg1 set
                    759:    [/rp /param /foo /cring /ppp] pushVariables
                    760:    [/rp arg1 def
                    761:     /ppp rp 1 get def
                    762:     %% define coefficient ring.
                    763:     [(q) @@@.esymbol] [(h) @@@.Esymbol]
                    764:     [ppp 2 2 2 2 1 2 2 2]
                    765:     [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]
                    766:     [(mpMult) (poly)] set_up_ring@
                    767:     /cring  [(CurrentRingp)] system_variable def
                    768:
                    769:      rp 0 get length 3 eq {
                    770:        rp 0  [rp 0 get 0 get rp 0 get 1 get rp 0 get 2 get ]
                    771:              ( ) elimination_order put
                    772:      } { } ifelse
                    773:
                    774:     [
                    775:       rp 0 get 0 get             %% x-list
                    776:       rp 0 get 1 get             %% d-list
                    777:       rp 0 get 2 get /param set
                    778:       param 0 << rp 1 get >> put %% << rp 1 get >> is 17 in the example.
                    779:       param                      %% parameters.
                    780:       rp 0 get 3 get             %% order matrix.
                    781:       rp length 2 eq
                    782:       { [(mpMult) (diff) (coefficient ring) cring] }  %% optional argument.
                    783:       { [(mpMult) (diff) (coefficient ring) cring] rp 2 get join }
                    784:       ifelse
                    785:     ]  /foo set
                    786:     foo aload pop set_up_ring@
                    787:    ] pop
                    788:    popVariables
                    789:    [(CurrentRingp)] system_variable
                    790: } def
                    791:
                    792: [(ring_def)
                    793:  [(ring ring_def)
                    794:   (Set the current ring to the <<ring>>)
                    795:   (Example: [(x,y) ring_of_polynomials [[(x) 1]] weight_vector 0 ] define_ring)
                    796:   (          /R set)
                    797:   (          R ring_def)
                    798:   (In order to get the ring object R to which a given polynomial f belongs,)
                    799:   (one may use the command )
                    800:   (          f (ring) data_conversion /R set)
                    801:   (cf. define_ring, define_qring, system_variable, poly (ring) data_conversion)
                    802:   (cf. << ,, >>)
                    803:  ]
                    804: ] putUsages
                    805:
                    806: /ring_def {
                    807:   /arg1 set
                    808:   [(CurrentRingp) arg1] system_variable
                    809: } def
                    810:
                    811:
                    812:
                    813: /lexicographicOrderTemplate {
                    814: % size lexicographicOrderTemplate matrix
                    815:   /arg1 set
                    816:   [/k /size] pushVariables
                    817:   [
                    818:     /size arg1 def
                    819:     [ 0 1 << size 1 sub >>
                    820:       {
                    821:          /k set
                    822:          size k evec
                    823:        } for
                    824:     ] /arg1 set
                    825:   ] pop
                    826:   popVariables
                    827:   arg1
                    828: } def
                    829:
                    830: /lexicographic_order {
                    831: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    832: %%  vars                    evars
                    833: %% [x-list d-list params order]
                    834:   /arg2 set  /arg1 set
                    835:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    836:   /vars arg1 def /evars [arg2 to_records pop] def
                    837:   [
                    838:     /univ vars 0 get reverse
                    839:           vars 1 get reverse join
                    840:     def
                    841:
                    842:     << univ length 2 sub >>
                    843:     lexicographicOrderTemplate /order set
                    844:
                    845:     [[1]] order oplus [[1]] oplus /order set
                    846:
                    847:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    848:
                    849:     /compl
                    850:       [univ 0 get] evars join evars univ0 complement join
                    851:     def
                    852:     compl univ
                    853:     getPerm /perm set
                    854:     %%perm :: univ :: compl ::
                    855:
                    856:     order perm permuteOrderMatrix /order set
                    857:
                    858:     vars [order] join /arg1 set
                    859:   ] pop
                    860:   popVariables
                    861:   arg1
                    862: } def
                    863:
                    864: /lexicographic_order2 {
                    865: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    866: %%  vars                    evars
                    867: %% [x-list d-list params order]
                    868: %% with no graduation and homogenization variables
                    869:   /arg2 set  /arg1 set
                    870:   [/vars /evars /univ /order /perm /compl] pushVariables
                    871:   /vars arg1 def /evars [arg2 to_records pop] def
                    872:   [
                    873:     /univ vars 0 get reverse
                    874:           vars 1 get reverse join
                    875:     def
                    876:
                    877:     << univ length  >>
                    878:     lexicographicOrderTemplate /order set
                    879:
                    880:     /compl
                    881:       evars << evars univ complement >> join
                    882:     def
                    883:     compl univ
                    884:     getPerm /perm set
                    885:
                    886:     order perm permuteOrderMatrix /order set
                    887:
                    888:     vars [order] join /arg1 set
                    889:   ] pop
                    890:   popVariables
                    891:   arg1
                    892: } def
                    893:
                    894: /lexicographic_order3 {
                    895: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    896: %%  vars                    evars
                    897: %% [x-list d-list params order]
                    898: %% with no homogenization variable.
                    899:   /arg2 set  /arg1 set
                    900:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    901:   /vars arg1 def /evars [arg2 to_records pop] def
                    902:   [
                    903:     /univ vars 0 get reverse
                    904:           vars 1 get reverse join
                    905:     def
                    906:
                    907:     << univ length 1 sub >>
                    908:     lexicographicOrderTemplate /order set
                    909:
                    910:     [[1]] order oplus /order set
                    911:
                    912:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    913:
                    914:     /compl
                    915:       [univ 0 get] evars join evars univ0 complement join
                    916:     def
                    917:     compl univ
                    918:     getPerm /perm set
                    919:     %%perm :: univ :: compl ::
                    920:
                    921:     order perm permuteOrderMatrix /order set
                    922:
                    923:     vars [order] join /arg1 set
                    924:   ] pop
                    925:   popVariables
                    926:   arg1
                    927: } def
                    928:
                    929: %%%%%%   add_rings %%%%%%%%%%%%%% 10/5
                    930:
                    931: /graded_reverse_lexicographic_order {
                    932:   (  ) elimination_order
                    933: } def
                    934:
                    935:
                    936: /getX {
                    937: %% param [1|2|3|4] getX [var-lists]  ;  1->c,2->l,3->m,4->n
                    938:   /arg2 set /arg1 set
                    939:   [/k /param /func /low /top] pushVariables
                    940:   [
                    941:      /param arg1 def  /func arg2 def
                    942:      func 1 eq
                    943:      {
                    944:        /low 0 def
                    945:      }
                    946:      {
                    947:        /low << param 2 get >> << func 1 sub >> get def
                    948:      } ifelse
                    949:      /top << param 2 get >> << func 4 add >> get 1 sub def
                    950:      [
                    951:        low 1 top
                    952:        {
                    953:            /k set
                    954:           param 0 get k get
                    955:         } for
                    956:      ] /arg1 set
                    957:   ] pop
                    958:   popVariables
                    959:   arg1
                    960: } def
                    961:
                    962: /getD {
                    963: %% param [1|2|3|4] getD [var-lists]  ;  1->c,2->l,3->m,4->n
                    964:   /arg2 set /arg1 set
                    965:   [/k /param /func /low /top] pushVariables
                    966:   [
                    967:      /param arg1 def  /func arg2 def
                    968:      func 1 eq
                    969:      {
                    970:        /low 0 def
                    971:      }
                    972:      {
                    973:        /low << param 2 get >> << func 1 sub >> get def
                    974:      } ifelse
                    975:      /top << param 2 get >> << func 4 add >> get 1 sub def
                    976:      [
                    977:        low 1 top
                    978:        {
                    979:            /k set
                    980:           param 1 get k get
                    981:         } for
                    982:      ] /arg1 set
                    983:   ] pop
                    984:   popVariables
                    985:   arg1
                    986: } def
                    987:
                    988: /getXV {
                    989: %% param [1|2|3|4] getXV [var-lists]  ;  1->c,2->l,3->m,4->n
                    990:   /arg2 set /arg1 set
                    991:   [/k /param /func /low /top] pushVariables
                    992:   [
                    993:      /param arg1 def  /func arg2 def
                    994:      /low << param 2 get >> << func 4 add >> get def
                    995:      /top << param 2 get >>  func get 1 sub def
                    996:      [
                    997:        low 1 top
                    998:        {
                    999:            /k set
                   1000:           param 0 get k get
                   1001:         } for
                   1002:      ] /arg1 set
                   1003:   ] pop
                   1004:   popVariables
                   1005:   arg1
                   1006: } def
                   1007:
                   1008: /getDV {
                   1009: %% param [1|2|3|4] getDV [var-lists]  ;  1->c,2->l,3->m,4->n
                   1010:   /arg2 set /arg1 set
                   1011:   [/k /param /func /low /top] pushVariables
                   1012:   [
                   1013:      /param arg1 def  /func arg2 def
                   1014:      /low << param 2 get >> << func 4 add >> get def
                   1015:      /top << param 2 get >>  func get 1 sub def
                   1016:      [
                   1017:        low 1 top
                   1018:        {
                   1019:            /k set
                   1020:           param 1 get k get
                   1021:         } for
                   1022:      ] /arg1 set
                   1023:   ] pop
                   1024:   popVariables
                   1025:   arg1
                   1026: } def
                   1027:
                   1028: /reNaming {
                   1029:   %% It also changes oldx2 and oldd2, which are globals.
                   1030:   /arg1 set
                   1031:   [/i /j /new /count /ostr /k] pushVariables
                   1032:   [
                   1033:     /new arg1 def
                   1034:     /count 0 def
                   1035:     0 1 << new length 1 sub >> {
                   1036:        /i set
                   1037:       << i 1 add >> 1 << new length 1 sub >> {
                   1038:           /j set
                   1039:           << new i get >> << new j get >> eq
                   1040:           {
                   1041:              new j get /ostr set
                   1042:              (The two rings have the same name :) messagen
                   1043:              new i get messagen (.) message
                   1044:              (The name ) messagen
                   1045:              new i get messagen ( is changed into ) messagen
                   1046:              new j << new i get << 48 count add $string$ data_conversion >>
                   1047:                       2 cat_n >> put
                   1048:              new j get messagen (.) message
                   1049:              /oldx2 ostr << new j get >> reNaming2
                   1050:              /oldd2 ostr << new j get >> reNaming2
                   1051:              /count count 1 add def
                   1052:            }
                   1053:            { }
                   1054:            ifelse
                   1055:       } for
                   1056:     } for
                   1057:     /arg1 new def
                   1058:   ] pop
                   1059:   popVariables
                   1060:   arg1
                   1061: } def
                   1062:
                   1063: /reNaming2 {
                   1064:   %% array oldString newString reNaming2
                   1065:   %% /aa (x) (y) reNaming2
                   1066:   /arg3 set /arg2 set /arg1 set
                   1067:   [/array /oldString /newString /k] pushVariables
                   1068:   [
                   1069:     /array arg1 def /oldString arg2 def /newString arg3 def
                   1070:       0 1 << array load length 1 sub >>
                   1071:       {
                   1072:          /k set
                   1073:          << array load k get  >> oldString eq
                   1074:          {
                   1075:             array load k newString put
                   1076:           }
                   1077:           { } ifelse
                   1078:       } for
                   1079:    ] pop
                   1080:    popVariables
                   1081: } def
                   1082:
                   1083: /add_rings {
                   1084:   /arg2 set /arg1 set
                   1085:   [/param1 /param2
                   1086:    /newx /newd  /newv
                   1087:    /k /const /od1 /od2 /od
                   1088:    /oldx2 /oldd2  % these will be changed in reNaming.
                   1089:    /oldv
                   1090:   ] pushVariables
                   1091:   [
                   1092:      /param1 arg1 def /param2 arg2 def
                   1093:    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   1094:      /newx
                   1095:        [ ]
                   1096:        param2 1 getX join  param1 1 getX join
                   1097:        param2 1 getXV join param1 1 getXV join
                   1098:
                   1099:        param2 2 getX join  param1 2 getX join
                   1100:        param2 2 getXV join param1 2 getXV join
                   1101:
                   1102:        param2 3 getX join  param1 3 getX join
                   1103:        param2 3 getXV join param1 3 getXV join
                   1104:
                   1105:        param2 4 getX join  param1 4 getX join
                   1106:        param2 4 getXV join param1 4 getXV join
                   1107:      def
                   1108:      /newd
                   1109:        [ ]
                   1110:        param2 1 getD join  param1 1 getD join
                   1111:        param2 1 getDV join param1 1 getDV join
                   1112:
                   1113:        param2 2 getD join  param1 2 getD join
                   1114:        param2 2 getDV join param1 2 getDV join
                   1115:
                   1116:        param2 3 getD join  param1 3 getD join
                   1117:        param2 3 getDV join param1 3 getDV join
                   1118:
                   1119:        param2 4 getD join  param1 4 getD join
                   1120:        param2 4 getDV join param1 4 getDV join
                   1121:      def
                   1122:
                   1123:      /newv  newx newd join def
                   1124:      /oldx2 param2 0 get def  /oldd2 param2 1 get def
                   1125:      /oldx2 oldx2 {1 copy 2 1 roll pop} map def
                   1126:      /oldd2 oldd2 {1 copy 2 1 roll pop} map def
                   1127:      /newv newv reNaming def
                   1128:
                   1129:      /newx [
                   1130:        0 1 << newv length 2 idiv 1 sub >>
                   1131:        {
                   1132:           /k set
                   1133:           newv k get
                   1134:        } for
                   1135:      ] def
                   1136:      /newd [
                   1137:        0 1 << newv length 2 idiv 1 sub >>
                   1138:        {
                   1139:           /k set
                   1140:           newv << newv length 2 idiv k add >> get
                   1141:        } for
                   1142:      ] def
                   1143:      /const [
                   1144:         << param1 2 get 0 get >>
                   1145:         << param1 2 get 1 get  param2 2 get 1 get add >>
                   1146:         << param1 2 get 2 get  param2 2 get 2 get add >>
                   1147:         << param1 2 get 3 get  param2 2 get 3 get add >>
                   1148:         << param1 2 get 4 get  param2 2 get 4 get add >>
                   1149:         << param1 2 get 5 get  param2 2 get 5 get add >>
                   1150:         << param1 2 get 6 get  param2 2 get 6 get add >>
                   1151:         << param1 2 get 7 get  param2 2 get 7 get add >>
                   1152:         << param1 2 get 8 get  param2 2 get 8 get add >>
                   1153:     ] def
                   1154:
                   1155:     /od1 param1 3 get def /od2 param2 3 get def
                   1156:     od1 od2 oplus /od set
                   1157:
                   1158:     %%oldx2 :: oldd2 ::
                   1159:     << param1 0 get reverse >> << param1 1 get reverse >> join
                   1160:     << oldx2 reverse >> << oldd2 reverse >> join
                   1161:     join /oldv set
                   1162:
                   1163:
                   1164:     od << oldv << newx reverse newd reverse join >> getPerm >>
                   1165:     permuteOrderMatrix /od set
                   1166:
                   1167:      /arg1 [newx newd const od] def
                   1168:   ] pop
                   1169:   popVariables
                   1170:   arg1
                   1171: } def
                   1172:
                   1173:
                   1174: %%%% end of add_rings
                   1175:
                   1176:
                   1177:
                   1178: [(swap01) [
                   1179:    $[ .... ] swap01 [....]$
                   1180:    $Examples: [(x,y) ring_of_polynomials (x) elmination_order 0] swap01 $
                   1181:    $          define_ring$
                   1182: ]] putUsages
                   1183: %
                   1184: /swap01 {
                   1185:   /arg1 set
                   1186:   [/rg /ch ] pushVariables
                   1187:   [
                   1188:     arg1 0 get /rg set  % ring
                   1189:     arg1 1 get /ch set  % characteristics
                   1190:     [rg 0 get , rg 1 get , rg 2 get ,
                   1191:      << rg 3 get length >> 0 1 e_ij << rg 3 get >> mul ] /rg set
                   1192:     /arg1 [ rg ch ] def
                   1193:   ] pop
                   1194:   popVariables
                   1195:   arg1
                   1196: } def
                   1197:
                   1198: [(swap0k) [
                   1199:    $[ .... ] k swap0k [....]$
                   1200:    $Examples: [(x,y) ring_of_polynomials (x) elmination_order 0] 1 swap0k $
                   1201:    $          define_ring$
                   1202:    $swap01 == 1 swap0k$
                   1203: ]] putUsages
                   1204: %
                   1205: /swap0k {
                   1206:   /arg2 set
                   1207:   /arg1 set
                   1208:   [/rg /ch /kk] pushVariables
                   1209:   [
                   1210:     arg2 /kk set
                   1211:     arg1 0 get /rg set  % ring
                   1212:     arg1 1 get /ch set  % characteristics
                   1213:     [rg 0 get , rg 1 get , rg 2 get ,
                   1214:      << rg 3 get length >> 0 kk e_ij << rg 3 get >> mul ] /rg set
                   1215:     /arg1 [ rg ch ] def
                   1216:   ] pop
                   1217:   popVariables
                   1218:   arg1
                   1219: } def
                   1220:
                   1221: %%%%%%%%%%%%%   weight vector
                   1222: [(position)
                   1223:   [(set element position number)
                   1224:    (Example: [(cat) (dog) (hot chocolate)] (cat) position ===> 0.)
                   1225:   ]
                   1226: ] putUsages
                   1227: /position {
                   1228:   /arg2 set /arg1 set
                   1229:   [/univ /elem /num /flag] pushVariables
                   1230:   [
                   1231:      /univ arg1 def
                   1232:      /elem arg2 def
                   1233:      /num -1 def /flag -1 def
                   1234:      0 1 << univ length 1 sub >>
                   1235:      {
                   1236:         /num set
                   1237:         univ num get  elem  eq
                   1238:         { /flag 0 def exit }
                   1239:         {    }
                   1240:         ifelse
                   1241:      }  for
                   1242:      flag -1 eq
                   1243:      {/num -1 def}
                   1244:      {  }
                   1245:      ifelse
                   1246:   ] pop
                   1247:   /arg1 num def
                   1248:   popVariables
                   1249:   arg1
                   1250: } def
                   1251:
                   1252:
                   1253: [(evecw)
                   1254:   [(size position weight evecw  [0 0 ... 0 weight 0 ... 0] )
                   1255:    (Example: 3 0 113 evecw ===> [113  0  0])
                   1256:   ]
                   1257: ] putUsages
                   1258: /evecw {
                   1259:  /arg3 set /arg2 set /arg1 set
                   1260:  [/size /iii /www] pushVariables
                   1261:  /size arg1 def  /iii arg2 def /www arg3 def
                   1262:  [
                   1263:    0 1 << size 1 sub >>
                   1264:    {
                   1265:       iii eq
                   1266:       {  www }
                   1267:       {  0 }
                   1268:       ifelse
                   1269:    } for
                   1270:   ] /arg1 set
                   1271:   popVariables
                   1272:   arg1
                   1273: } def
                   1274:
                   1275: [(weight_vector)
                   1276:  [ ([x-list d-list params] [[(name) weight ...] [...] ...] weight_vector)
                   1277:    ([x-list d-list params order])
                   1278:    (Example:)
                   1279:    (   [(x,y,z) ring_of_polynomials [[(x) 100 (y) 10]] weight_vector 0] )
                   1280:    (   define_ring )
                   1281:   ]
                   1282: ] putUsages
                   1283: /weight_vector {
                   1284:   /arg2 set  /arg1 set
                   1285:   [/vars /univ /w-vectors /www /k /order1 /order2] pushVariables
                   1286:   /vars arg1 def /w-vectors arg2 def
                   1287:   [
                   1288:     /univ vars 0 get reverse
                   1289:           vars 1 get reverse join
                   1290:     def
                   1291:     [
                   1292:     0 1 << w-vectors length 1 sub >>
                   1293:     {
                   1294:       /k set
                   1295:       univ w-vectors k get w_to_vec
                   1296:     } for
                   1297:     ] /order1 set
                   1298:     %% order1 ::
                   1299:
                   1300:     vars ( ) elimination_order 3 get /order2 set
                   1301:     vars [ << order1 order2 join >> ] join /arg1 set
                   1302:   ] pop
                   1303:   popVariables
                   1304:   arg1
                   1305: } def
                   1306:
                   1307: %% [@@@.esymbol (x) (y) (h)] [(x) 100 (y) 10] w_to_vec [0 100 10 0]
                   1308: %%  univ              www
                   1309: /w_to_vec {
                   1310:   /arg2 set  /arg1 set
                   1311:   [/univ /www /k /vname /vweight /ans] pushVariables
                   1312:   /univ arg1 def /www arg2 def
                   1313:   [
                   1314:     /ans << univ length >> -1 0 evecw def
                   1315:     0  2  << www length 2 sub >>
                   1316:     {
                   1317:       %% ans ::
                   1318:       /k set
                   1319:       www k get /vname set
                   1320:       www << k 1 add >> get /vweight set
                   1321:       << univ length >>
                   1322:       << univ vname position >>
                   1323:       vweight evecw
                   1324:       ans add /ans set
                   1325:     } for
                   1326:     /arg1 ans def
                   1327:   ] pop
                   1328:   popVariables
                   1329:   arg1
                   1330: } def
                   1331:
                   1332: %%%%%%%%%% end of weight_vector macro
                   1333:
                   1334: %%%%%%%% eliminatev macro
                   1335: [(eliminatev)
                   1336:  [([g1 g2 g3 ...gm] [list of variables] eliminatev [r1 ... rp])
                   1337:   (Example: [(x y z - 1). (z-1). (y-1).] [(x) (y)] eliminatev [ z-1 ])
                   1338:  ]
                   1339: ] putUsages
                   1340: /eliminatev {
                   1341:  /arg2 set /arg1 set
                   1342:  [/gb /var /vars /ans /k] pushVariables
                   1343:  [
                   1344:    /gb arg1 def
                   1345:    /vars arg2 def
                   1346:    /ans gb def
                   1347:    0 1 << vars length 1 sub >> {
                   1348:      /k set
                   1349:      ans  << vars k get >> eliminatev.tmp
                   1350:      /ans set
                   1351:    } for
                   1352:    /arg1 ans def
                   1353:  ] pop
                   1354:  popVariables
                   1355:  arg1
                   1356: } def
                   1357: /eliminatev.tmp {
                   1358:   /arg2 set /arg1 set
                   1359:   [/gb /degs /ans /n /var /ff /rr /gg] pushVariables
                   1360:   [
                   1361:   /gb arg1 def
                   1362:   /var arg2 def
                   1363:   /degs gb {
                   1364:        /gg set
                   1365:        gg (0). eq
                   1366:        { 0 }
                   1367:        { gg (ring) data_conversion /rr set
                   1368:          gg  << var rr ,, >> degree
                   1369:        } ifelse
                   1370:     } map def
                   1371:   %%degs message
                   1372:   /ans [
                   1373:     0 1 << gb length 1 sub >> {
                   1374:       /n set
                   1375:       << degs n get  >>  0 eq
                   1376:       { gb n get /ff set
                   1377:         ff (0). eq
                   1378:         {  }
                   1379:         { ff } ifelse
                   1380:       }
                   1381:       {   } ifelse
                   1382:     } for
                   1383:   ] def
                   1384:   /arg1 ans def
                   1385:   ] pop
                   1386:   popVariables
                   1387:   arg1
                   1388: } def
                   1389:
                   1390: /eliminatev.tmp.org {
                   1391:   /arg2 set /arg1 set
                   1392:   [/gb /degs /ans /n /var /ff] pushVariables
                   1393:   [
                   1394:   /gb arg1 def
                   1395:   /var arg2 def
                   1396:   /degs gb {var . degree} map def
                   1397:   /ans [
                   1398:     0 1 << gb length 1 sub >> {
                   1399:       /n set
                   1400:       << degs n get  >>  0 eq
                   1401:       { gb n get /ff set
                   1402:         ff (0). eq
                   1403:         {  }
                   1404:         { ff } ifelse
                   1405:       }
                   1406:       {   } ifelse
                   1407:     } for
                   1408:   ] def
                   1409:   /arg1 ans def
                   1410:   ] pop
                   1411:   popVariables
                   1412:   arg1
                   1413: } def
                   1414: %%% end of eliminatev macro
                   1415:
                   1416: %%% macro for output
                   1417:
                   1418: [(isInteger)
                   1419:  [(obj isInteger bool) ]
                   1420: ] putUsages
                   1421: /isInteger {
                   1422:   (type?) data_conversion  << 0  (type?) data_conversion >> eq
                   1423: } def
                   1424:
                   1425: [(isArray)
                   1426:  [(obj isArray bool) ]
                   1427: ] putUsages
                   1428: /isArray {
                   1429:   (type?) data_conversion << [ ] (type?) data_conversion >>  eq
                   1430: } def
                   1431:
                   1432: [(isPolynomial)
                   1433:  [(obj isPolynomial bool) ]
                   1434: ] putUsages
                   1435: /isPolynomial {
                   1436:   (type?) data_conversion
                   1437:    << [(x) (var) 0] system_variable . (type?) data_conversion >> eq
                   1438: } def
                   1439:
                   1440: [(isString)
                   1441:  [(obj isString bool) ]
                   1442: ] putUsages
                   1443: /isString {
                   1444:   (type?) data_conversion
                   1445:    << (Hi) (type?) data_conversion >> eq
                   1446: } def
                   1447:
                   1448: [(isClass)
                   1449:  [(obj isClass bool) ]
                   1450: ] putUsages
                   1451: /isClass {
                   1452:   (type?) data_conversion  ClassP eq
                   1453: } def
                   1454:
                   1455: [(isUniversalNumber)
                   1456:  [(obj isUniversalNumber bool) ]
                   1457: ] putUsages
                   1458: /isUniversalNumber {
                   1459:   (type?) data_conversion  UniversalNumberP eq
                   1460: } def
                   1461:
                   1462: [(isDouble)
                   1463:  [(obj isDouble bool) ]
                   1464: ] putUsages
                   1465: /isDouble {
                   1466:   (type?) data_conversion  DoubleP eq
                   1467: } def
                   1468:
                   1469: [(isRational)
                   1470:  [(obj isRational bool) ]
                   1471: ] putUsages
                   1472: /isRational {
                   1473:   (type?) data_conversion  RationalFunctionP eq
                   1474: } def
                   1475:
                   1476: /toString.tmp {
                   1477:   /arg1 set
                   1478:   [/obj /fname] pushVariables
                   1479:   /obj arg1 def
                   1480:   [
                   1481:     obj isArray
                   1482:     {
                   1483:        obj {toString.tmp} map
                   1484:     }
                   1485:     { } ifelse
                   1486:     obj isInteger
                   1487:     {
                   1488:        obj (dollar) data_conversion  %% not string. It returns the ascii code.
                   1489:     }
                   1490:     { } ifelse
                   1491:     obj isPolynomial
                   1492:     {
                   1493:        obj (string) data_conversion
                   1494:     }
                   1495:     { } ifelse
                   1496:     obj isString
                   1497:     { obj }
                   1498:     { } ifelse
                   1499:     obj isUniversalNumber
                   1500:     { obj (string) data_conversion } { } ifelse
                   1501:     obj isDouble
                   1502:     { obj (string) data_conversion } { } ifelse
                   1503:     obj isRational
                   1504:     { obj (string) data_conversion } { } ifelse
                   1505:     obj tag 0 eq
                   1506:     { (null) } { } ifelse
                   1507:
                   1508:     %%% New code that uses a file.
                   1509:     obj tag 2 eq obj tag 13 eq or obj tag 14 eq or obj tag 17 eq or
                   1510:     { [(getUniqueFileName) (/tmp/sm1_toString)] extension /fname set
                   1511:       [(outputObjectToFile) fname obj] extension pop
                   1512:       fname pushfile
                   1513:       [(/bin/rm -rf ) fname] cat system
                   1514:     } { } ifelse
                   1515:   ] /arg1 set
                   1516:   popVariables
                   1517:   arg1 aload pop
                   1518: } def
                   1519:
                   1520:
                   1521:
                   1522: %% [(xy) [(x+1) (2)]] toString.tmp2 ([ xy , [ x+1 , 2 ] ])
                   1523: /toString.tmp2 {
                   1524:   /arg1 set
                   1525:   [/obj /i /n /r] pushVariables
                   1526:   [
                   1527:     /obj arg1 def
                   1528:     obj isArray
                   1529:     {
                   1530:        ( [ )
                   1531:        obj {toString.tmp2} map /r set
                   1532:        /n r length 1 sub def
                   1533:        [0 1  n  {
                   1534:           /i set
                   1535:           i n eq {
                   1536:             r i get
                   1537:           }
                   1538:           { r i get ( , ) 2 cat_n }
                   1539:           ifelse
                   1540:         } for
                   1541:        ] aload length cat_n
                   1542:        ( ] )
                   1543:        3 cat_n
                   1544:      }
                   1545:      {
                   1546:         obj
                   1547:      } ifelse
                   1548:    ] /arg1 set
                   1549:    popVariables
                   1550:    arg1 aload pop
                   1551: } def
                   1552:
                   1553:
                   1554: [(toString)
                   1555:  [(obj toString)
                   1556:   (Convert obj to a string.)
                   1557:   (Example: [ 1 (x+1). [ 2 (Hello)]] toString ==> $[ 1 , x+1 , [ 2 , Hello ]  ]$)
                   1558:  ]
                   1559: ] putUsages
                   1560: /toString {
                   1561:   /arg1 set
                   1562:   [/obj ] pushVariables
                   1563:   [
                   1564:     /obj arg1 def
                   1565:     obj isString
                   1566:     { obj }
                   1567:     { obj toString.tmp toString.tmp2 }
                   1568:     ifelse /arg1 set
                   1569:   ] pop
                   1570:   popVariables
                   1571:   arg1
                   1572: } def
                   1573:
                   1574: [(output)
                   1575:  [(obj output) (Output the object to the standard file sm1out.txt)]
                   1576: ] putUsages
                   1577: /output {
                   1578:   /arg1 set
                   1579:   [/obj /fd ] pushVariables
                   1580:   [
                   1581:     /obj arg1 def
                   1582:     (sm1out.txt) (a) file /fd set
                   1583:     (Writing to sm1out.txt  ...) messagen
                   1584:     [ fd << obj toString >> writestring ] pop
                   1585:     [ fd << 10 (string) data_conversion >> writestring ] pop
                   1586:     ( Done.) message
                   1587:     fd closefile
                   1588:   ] pop
                   1589:   popVariables
                   1590: } def
                   1591: %%%% end of macro for output.
                   1592: [(tag)
                   1593:  [(obj tag integer)
                   1594:   (tag returns datatype.)
                   1595:   (cf. data_conversion)
                   1596:   (Example: 2 tag IntegerP eq ---> 1)
                   1597:  ]
                   1598: ] putUsages
                   1599: /etag {(type??) data_conversion} def
                   1600: [(etag)
                   1601:  [(obj etag integer)
                   1602:   (etag returns extended object tag. cf. kclass.c)
                   1603:  ]
                   1604: ] putUsages
                   1605: /tag {(type?) data_conversion} def
                   1606: %% datatype constants
                   1607: /IntegerP 1  (type?) data_conversion def
                   1608: /LiteralP /arg1 (type?) data_conversion def   %Sstring
                   1609: /StringP (?) (type?) data_conversion def      %Sdollar
                   1610: /ExecutableArrayP  { 1 } (type?) data_conversion def
                   1611: /ArrayP [ 0 ] (type?) data_conversion def
                   1612: /PolyP  (1).  (type?) data_conversion def
                   1613: /FileP  13 def
                   1614: /RingP  14 def
                   1615: /UniversalNumberP 15 def
                   1616: /RationalFunctionP 16 def
                   1617: /ClassP 17 def
                   1618: /DoubleP 18 def
                   1619: /@.datatypeConstant.usage [
                   1620:  (IntegerP, LiteralP, StringP, ExecutableArrayP, ArrayP, PolyP, FileP, RingP,)
                   1621:  (UniversalNumberP, RationalFunctionP, ClassP, DoubleP)
                   1622:  (      return data type identifiers.)
                   1623:  (Example:  7 tag IntegerP eq  ---> 1)
                   1624: ] def
                   1625: [(IntegerP) @.datatypeConstant.usage ] putUsages
                   1626: [(LiteralP) @.datatypeConstant.usage ] putUsages
                   1627: [(StringP) @.datatypeConstant.usage ] putUsages
                   1628: [(ExecutableArrayP) @.datatypeConstant.usage ] putUsages
                   1629: [(ArrayP) @.datatypeConstant.usage ] putUsages
                   1630: [(PolyP) @.datatypeConstant.usage ] putUsages
                   1631: [(RingP) @.datatypeConstant.usage ] putUsages
                   1632: [(UniversalNumberP) @.datatypeConstant.usage ] putUsages
                   1633: [(RationalFunctionP) @.datatypeConstant.usage ] putUsages
                   1634: [(ClassP) @.datatypeConstant.usage ] putUsages
                   1635: [(DoubleP) @.datatypeConstant.usage ] putUsages
                   1636:
                   1637: [(,,)
                   1638:  [( string ring ,, polynomial)
                   1639:   (Parse the <<string>> as an element in the <<ring>> and returns)
                   1640:   (the polynomial.)
                   1641:   (cf. define_ring, define_qring, ring_def)
                   1642:   (Example: [(x,y) ring_of_polynomials [[(x) 1]] weight_vector 7]define_ring)
                   1643:   (         /myring set)
                   1644:   (         ((x+y)^4) myring ,, /f set)
                   1645: ]] putUsages
                   1646:
                   1647: /,, {
                   1648:   /arg2 set /arg1 set
                   1649:   [/rrr] pushVariables
                   1650:   [ arg1 tag StringP eq
                   1651:     arg2 tag RingP eq  and
                   1652:     { [(CurrentRingp)] system_variable /rrr set
                   1653:       [(CurrentRingp) arg2] system_variable
                   1654:       /arg1 arg1 expand def
                   1655:       [(CurrentRingp) rrr] system_variable
                   1656:     }
                   1657:     {(Argument Error for ,, ) error }
                   1658:     ifelse
                   1659:   ] pop
                   1660:   popVariables
                   1661:   arg1
                   1662: } def
                   1663:
                   1664: [(..)
                   1665:  [( string .. universalNumber)
                   1666:   (Parse the << string >> as a universalNumber.)
                   1667:   (Example:  (123431232123123).. /n set)
                   1668: ]] putUsages
                   1669: /.. { (universalNumber) data_conversion } def
                   1670:
                   1671: [(dc)
                   1672:  [(Abbreviation of data_conversion.)
                   1673: ]] putUsages
                   1674: /dc { data_conversion } def
                   1675:
                   1676:
                   1677: %%% start of shell sort macro.
                   1678: [(and) [(obj1 obj2 and bool)]] putUsages
                   1679: /and { add 1 copy 2 eq {pop 1} {pop 0} ifelse } def
                   1680:
                   1681: [(or) [(obj1 obj2 or bool)]] putUsages
                   1682: /or  { add 1 copy 2 eq {pop 1} { } ifelse} def
                   1683:
                   1684: [(ge) [(obj1 obj2 ge bool) (greater than or equal)]] putUsages
                   1685: %% 2 copy is equivalent to  dup 3 -1 roll dup 4 -2 roll 3 -1 roll 2 -1 roll
                   1686: /ge  { dup 3 -1 roll dup 4 -2 roll 3 -1 roll 2 -1 roll
                   1687:                eq {pop pop 1}
                   1688:                   { gt {1}
                   1689:                        {0}
                   1690:                        ifelse}
                   1691:                   ifelse} def
                   1692:
                   1693: [(le) [(obj1 obj2 le bool) (less than or equal)]] putUsages
                   1694: /le  { dup 3 -1 roll dup 4 -2 roll 3 -1 roll 2 -1 roll
                   1695:                eq {pop pop 1}
                   1696:                   { lt {1}
                   1697:                        {0}
                   1698:                        ifelse}
                   1699:                   ifelse} def
                   1700:
                   1701: [(break)
                   1702:  [(bool break)]
                   1703: ] putUsages
                   1704: /break { {exit} { } ifelse } def
                   1705:
                   1706: /not { 0 eq {1} {0} ifelse} def
                   1707: /append { /arg2 set [arg2] join } def
                   1708:
                   1709: [(power)
                   1710:  [(obj1 obj2 power obj3)
                   1711:   $obj3 is (obj1)^(obj2). cf. npower$
                   1712:   $Example:  (2). 8 power ::  ===>  256 $
                   1713:  ]
                   1714: ] putUsages
                   1715: %% From SSWork/yacc/incmac.sm1
                   1716: %% f k power f^k
                   1717: /power {
                   1718:   /arg2 set
                   1719:   /arg1 set
                   1720:   [/f /k /i /ans] pushVariables
                   1721:   [
                   1722:      /ans (1).. def
                   1723:      /f arg1 def   /k arg2 ..int def
                   1724:      k 0 lt {
                   1725:        1 1 << 0 k sub >> {
                   1726:          /ans f ans {mul} sendmsg2 def
                   1727:        } for
                   1728:        /ans (1).. ans {div} sendmsg2 def
                   1729:      }
                   1730:      {
                   1731:        1 1 k {
                   1732:          /ans f ans {mul} sendmsg2 def
                   1733:        } for
                   1734:      } ifelse
                   1735:      /arg1 ans def
                   1736:   ] pop
                   1737:   popVariables
                   1738:   arg1
                   1739: } def
                   1740: [(..int)
                   1741:  [ (universalNumber ..int int)]] putUsages
                   1742: /..int { %% universal number to int
                   1743:   (integer) data_conversion
                   1744: } def
                   1745: [(SmallRing) [(SmallRing is the ring of polynomials Q[t,x,T,h].)]] putUsages
                   1746: /SmallRing  [(CurrentRingp)] system_variable  def
                   1747:
                   1748: %%% From SSWork/yacc/lib/printSVector.modified.sm1
                   1749: %%% supporting code for printSVector.
                   1750: /greaterThanOrEqual {
                   1751:   /arg2 set /arg1 set
                   1752:   arg1 arg2 gt { 1 }
                   1753:   { arg1 arg2 eq {1} {0} ifelse} ifelse
                   1754: } def
                   1755:
                   1756: /lengthUniv {
                   1757:  length (universalNumber) dc
                   1758: } def
                   1759:
                   1760: /getUniv {
                   1761:  (integer) dc get
                   1762: } def  %% Do not forget to thow away /.
                   1763:
                   1764: %%[(@@@.printSVector)
                   1765: %% [( vector @@@.printSVector   outputs the <<vector>> in a pretty way.)
                   1766: %%  ( The elements of the vector must be strings.)
                   1767: %% ]
                   1768: %%] putUsages
                   1769:
                   1770: %%% compiled code by d0, 1996, 8/17.
                   1771: /@@@.printSVector {
                   1772:  /arg1 set
                   1773: [ %%start of local variables
                   1774: /keys /i /j /n /max /width /m /k /kk /tmp0 ] pushVariables [ %%local variables
                   1775: /keys arg1 def
                   1776: /n
                   1777: keys lengthUniv
                   1778:  def
                   1779: /max (0)..  def
                   1780: /i (0)..  def
                   1781: %%for init.
                   1782: %%for
                   1783: { i n  lt
                   1784:  {  } {exit} ifelse
                   1785: [ {%%increment
                   1786: /i  i (1).. add def
                   1787: } %%end of increment{A}
                   1788: {%%start of B part{B}
                   1789: keys i  getUniv lengthUniv
                   1790: max  gt
                   1791:  %% if-condition
                   1792:   { %%ifbody
                   1793: /max
                   1794: keys i   getUniv lengthUniv
                   1795:  def
                   1796:   }%%end if if body
                   1797:   { %%if- else part
                   1798:   } ifelse
                   1799: } %% end of B part. {B}
                   1800:  2 1 roll] {exec} map
                   1801: } loop %%end of for
                   1802: /max max (3)..  add
                   1803:  def
                   1804: /width (80)..  def
                   1805: /m (0)..  def
                   1806:
                   1807: %%while
                   1808: { m max  mul
                   1809: (80)..  lt
                   1810:  { } {exit} ifelse
                   1811:  /m m (1)..  add
                   1812:  def
                   1813: } loop
                   1814: /k (0)..  def
                   1815: /kk (0)..  def
                   1816: /i (0)..  def
                   1817: %%for init.
                   1818: %%for
                   1819: { i n  lt
                   1820:  {  } {exit} ifelse
                   1821: [ {%%increment
                   1822: /i  i (1).. add def
                   1823: } %%end of increment{A}
                   1824: {%%start of B part{B}
                   1825: keys i getUniv messagen
                   1826: /kk kk (1)..  add
                   1827:  def
                   1828: /k k
                   1829: keys i getUniv lengthUniv
                   1830:  add
                   1831:  def
                   1832: /tmp0 max
                   1833: keys i  getUniv lengthUniv
                   1834:  sub
                   1835:  def
                   1836: /j (0)..  def
                   1837: %%for init.
                   1838: %%for
                   1839: { j tmp0  lt
                   1840:  {  } {exit} ifelse
                   1841: [ {%%increment
                   1842: /j  j (1).. add def
                   1843: } %%end of increment{A}
                   1844: {%%start of B part{B}
                   1845: /k k (1)..  add
                   1846:  def
                   1847: kk m  lt
                   1848:  %% if-condition
                   1849:   { %%ifbody
                   1850: ( ) messagen
                   1851:   }%%end if if body
                   1852:   { %%if- else part
                   1853:   } ifelse
                   1854: } %% end of B part. {B}
                   1855:  2 1 roll] {exec} map
                   1856: } loop %%end of for
                   1857: kk m  greaterThanOrEqual
                   1858:  %% if-condition
                   1859:   { %%ifbody
                   1860: /kk (0)..  def
                   1861: /k (0)..  def
                   1862: newline
                   1863:   }%%end if if body
                   1864:   { %%if- else part
                   1865:   } ifelse
                   1866: } %% end of B part. {B}
                   1867:  2 1 roll] {exec} map
                   1868: } loop %%end of for
                   1869: newline
                   1870: /ExitPoint ]pop popVariables %%pop the local variables
                   1871: } def
                   1872: %%end of function
                   1873:
                   1874: /rest { % returns remainder of a given list
                   1875:   [ 2 1 roll  aload length -1 roll pop ]
                   1876: } def
                   1877: [(rest)
                   1878:  [(array rest the-rest-of-the-array)
                   1879:   (Ex. [1 2 [3 0]] rest ===> [2 [3 0]])
                   1880:  ]
                   1881: ] putUsages
                   1882:
                   1883: %% from SSkan/develop/minbase.sm1
                   1884: /reducedBase {
                   1885:   /arg1 set
                   1886:   [/base /minbase /n /i /j /myring /zero /f] pushVariables
                   1887:   [
                   1888:      /base arg1 def
                   1889:      base isArray { }
                   1890:      { (The argument of reducedBase must be an array of polynomials)
                   1891:         error
                   1892:      } ifelse
                   1893:      base 0 get isPolynomial { }
                   1894:      { (The element of the argument of reducedBase must be polynomials)
                   1895:         error
                   1896:      } ifelse
                   1897:      /myring  base 0 get (ring) dc def
                   1898:      /zero (0) myring ,, def
                   1899:      base length 1 sub /n set
                   1900:      /minbase [ 0 1 n { /i set base i get } for ] def
                   1901:      0 1 n {
                   1902:        /i set
                   1903:        minbase i get  /f set
                   1904:        f zero eq {
                   1905:        }
                   1906:        {
                   1907:            0 1 n {
                   1908:                /j set
                   1909:               << minbase j get zero eq >> << i j eq >> or {
                   1910:               }
                   1911:               {
                   1912:                  [(isReducible) << minbase j get >> f] gbext
                   1913:                  {
                   1914:                      minbase j zero put
                   1915:                   }
                   1916:                  {  } ifelse
                   1917:               } ifelse
                   1918:            } for
                   1919:        } ifelse
                   1920:      } for
                   1921:      minbase { minbase.iszero } map /arg1 set
                   1922:   ] pop
                   1923:   popVariables
                   1924:   arg1
                   1925: } def
                   1926:
                   1927: [(reducedBase)
                   1928:  [(base reducedBase reducedBase)
                   1929:   (<<reducedBase>> prunes redundant elements in the Grobner basis <<base>> and)
                   1930:   (returns <<reducedBase>>.)
                   1931:   (Ex. [(x^2+1). (x+1). (x^3).] reducedBase ---> [(x+1).])
                   1932:  ]
                   1933: ] putUsages
                   1934:
                   1935: %% package functions
                   1936: /minbase.iszero {
                   1937:   dup (0). eq {
                   1938:     pop
                   1939:   }
                   1940:   { } ifelse
                   1941: } def
                   1942:
                   1943: /== {
                   1944:   message
                   1945: } def
                   1946: [(==)
                   1947:  [(obj ==)
                   1948:   (Print obj)
                   1949:  ]
                   1950: ] putUsages
                   1951:
                   1952: /@@@.all_variables {
                   1953:   [/n /i] pushVariables
                   1954:   [
                   1955:      /n [(N)] system_variable def
                   1956:      [
                   1957:       0 1 n 1 sub {
                   1958:           /i set
                   1959:           [(x) (var) i] system_variable
                   1960:       } for
                   1961:       0 1 n 1 sub {
                   1962:           /i set
                   1963:           [(D) (var) i] system_variable
                   1964:       } for
                   1965:      ] /arg1 set
                   1966:   ] pop
                   1967:   popVariables
                   1968:   arg1
                   1969: } def
                   1970:
                   1971: /weightv {
                   1972:   @@@.all_variables
                   1973:   2 1 roll w_to_vec
                   1974: } def
                   1975:
                   1976: [(weightv)
                   1977:  [(array weightv weight_vector_for_init)
                   1978:   (cf. init)
                   1979:   (Example: /w [(x) 10 (h) 2] weightv def)
                   1980:   (         ((x-h)^10).  w init ::)
                   1981:  ]
                   1982: ] putUsages
                   1983:
                   1984: /output_order {
                   1985:   /arg1 set
                   1986:   [/vars /vlist /perm /total /ans] pushVariables
                   1987:   [
                   1988:     /vlist arg1 def
                   1989:     /vars @@@.all_variables def
                   1990:     vlist { vars 2 1 roll position } map  /perm set
                   1991:     perm ==
                   1992:     /total [ 0 1 [(N)] system_variable 2 mul 1 sub { } for ] def
                   1993:     perm perm total complement join /ans set
                   1994:     [(outputOrder) ans] system_variable
                   1995:   ] pop
                   1996:   popVariables
                   1997: } def
                   1998:
                   1999: [(output_order)
                   2000:  [$ [(v1) (v2) ...] output_order $
                   2001:   (Set the order of variables to print for the current ring.)
                   2002:   (cf. system_variable)
                   2003:   (Example:  [(y) (x)] output_order)
                   2004:   $           (x*y). ::   ===> y*x $
                   2005:  ]
                   2006: ] putUsages
                   2007:
                   2008: %% destraction.   SSkan/Kan/debug/des.sm1, 1998, 2/27 ,  3/1
                   2009: %% should be included in dr.sm1
                   2010:
                   2011: /factorial {
                   2012:   /arg2 set
                   2013:   /arg1 set
                   2014:   [ /f /n ] pushVariables
                   2015:   [
                   2016:     /f arg1 def
                   2017:     /n arg2 def
                   2018:     /ans (1).. def
                   2019:     n 0 lt { (f n factorial : n must be a non-negative integer)
                   2020:               error } { } ifelse
                   2021:     0 1 n 1 sub {
                   2022:        (universalNumber) dc /i set
                   2023:          ans  << f  i sub >> mul /ans set
                   2024:     } for
                   2025:     /arg1 ans def
                   2026:    ] pop
                   2027:    popVariables
                   2028:    arg1
                   2029: } def
                   2030:
                   2031: [(factorial)
                   2032:  [(f n factorial g)
                   2033:   $integer n,  g is f (f-1) ... (f-n+1)$
                   2034:  ]
                   2035: ] putUsages
                   2036:
                   2037:
                   2038: /destraction1 {
                   2039:   /arg4 set
                   2040:   /arg3 set
                   2041:   /arg2 set
                   2042:   /arg1 set
                   2043:   [/ww /f  /dx /ss /xx /coeff0 /expvec
                   2044:    /coeffvec /expvec2 /ans /one] pushVariables
                   2045:   [
                   2046:     /f arg1 def /xx arg2 def /dx arg3 def /ss arg4 def
                   2047:     /one (1). def %%
                   2048:     /ww [ xx toString -1 dx toString 1 ] weightv  def
                   2049:     f ww init f sub (0). eq {   }
                   2050:     { [(destraction1 : inhomogeneous with respect to )
                   2051:         xx  ( and )  dx ] cat error } ifelse
                   2052:     f [[xx one]] replace dx coefficients  /coeff0 set
                   2053:     /expvec coeff0 0 get { (integer) dc } map def
                   2054:     /coeffvec coeff0 1 get def
                   2055:     expvec { ss 2 -1 roll factorial } map /expvec2 set
                   2056:     expvec2 coeffvec mul  /ans set
                   2057:     /arg1 ans def
                   2058:    ] pop
                   2059:    popVariables
                   2060:    arg1
                   2061: } def
                   2062:
                   2063:
                   2064: /distraction {
                   2065:   /arg4 set
                   2066:   /arg3 set
                   2067:   /arg2 set
                   2068:   /arg1 set
                   2069:   [/f  /dx /ss /xx  /ans /n /i] pushVariables
                   2070:   [(CurrentRingp)] pushEnv
                   2071:   [
                   2072:     /f arg1 def /xx arg2 def /dx arg3 def /ss arg4 def
                   2073:     f (0). eq { /dist1.L goto } { f (ring) dc ring_def } ifelse
                   2074:     /n xx length  def
                   2075:     0 1 n 1 sub {
                   2076:        /i set
                   2077:        /f  f xx i get dx i get ss i get destraction1 /f set
                   2078:     } for
                   2079:     /dist1.L
                   2080:     /arg1 f def
                   2081:   ]pop
                   2082:   popEnv
                   2083:   popVariables
                   2084:   arg1
                   2085: } def
                   2086: [(distraction)
                   2087:  [(f [ list of x-variables ] [ list of D-variables ] [ list of s-variables ])
                   2088:   (   distraction  result )
                   2089:   $Example: (x Dx Dy + Dy). [(x). (y).] [(Dx). (Dy).] [(x). (y).] distraction$
                   2090:  ]
                   2091: ] putUsages
                   2092: /destraction { distraction } def
                   2093:
                   2094:
                   2095:
                   2096:
                   2097: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   2098: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   2099: %%%%%%%%%%%%%%%% sorting
                   2100: %/N 1000 def
                   2101: %/a.shell [N -1 0 { } for ]  def
                   2102: %a.shell 0 -1000 put
                   2103: %% You need gate keeper.
                   2104: [(shell)
                   2105:  [([gate-keeper f1 f2 ... fm] shell result)
                   2106:   (Sort the list. Gate-keeper should be the smallest element)]
                   2107: ] putUsages
                   2108: /shell {
                   2109:  /arg1 set
                   2110:  [/N /a.shell /h /i /v /j] pushVariables
                   2111:  [
                   2112:   /a.shell arg1 def
                   2113:   /N a.shell length  1 sub def
                   2114:
                   2115:   /h 1 def
                   2116:   {/h h 3 mul 1 add def
                   2117:    << h N ge >> break
                   2118:   } loop
                   2119:   {
                   2120:      /h << h 3 idiv >> def
                   2121:      << h 1 add >> 1 N {
                   2122:         /i set
                   2123:         /v a.shell i get def
                   2124:         /j i def
                   2125:         {
                   2126:            %% a.shell print newline
                   2127:            << a.shell << j h sub >> get >>  v  le  break
                   2128:            a.shell j << a.shell << j h sub >> get >> put
                   2129:            /j j h sub def
                   2130:            j  h le break
                   2131:          } loop
                   2132:          a.shell j v put
                   2133:      } for
                   2134:      h 1 lt break
                   2135:   } loop
                   2136:   /arg1 a.shell def
                   2137:  ] pop
                   2138:  popVariables
                   2139:  arg1
                   2140: } def
                   2141: %%%% end of shell sort macro
                   2142:
                   2143: /variableNames {
                   2144:   /arg1 set
                   2145:   [/in-variableNames /rrr /nnn /i /cp] pushVariables
                   2146:   [
                   2147:     /rrr arg1 def
                   2148:     [(CurrentRingp)] system_variable /cp set
                   2149:     [(CurrentRingp) rrr] system_variable
                   2150:     [(N)] system_variable /nnn set
                   2151:     [ 0 1 nnn 1 sub {
                   2152:          /i set [(x) (var) i] system_variable } for ]
                   2153:     [ 0 1 nnn 1 sub {
                   2154:          /i set [(D) (var) i] system_variable } for ]
                   2155:     join /arg1 set
                   2156:     [(CurrentRingp) cp] system_variable
                   2157:    ] pop
                   2158:    popVariables
                   2159:    arg1
                   2160: } def
                   2161:
                   2162:
                   2163: /makeRingMap {
                   2164:   /arg3 set /arg2 set /arg1 set
                   2165:   [/in-makeRingMap /corres /M /N /corresM /corresN
                   2166:     /vars /vars-org /i /p /ans /cp] pushVariables
                   2167:   [
                   2168:     /corres arg1 def /M arg2 def /N arg3 def
                   2169:     /corresM corres 0 get def
                   2170:     /corresN corres 1 get def
                   2171:     [(CurrentRingp)] system_variable /cp set
                   2172:     [(CurrentRingp) M] system_variable
                   2173:     M variableNames /vars set  vars 1 copy /vars-org set
                   2174:     0 1 corresM length 1 sub {
                   2175:       /i set
                   2176:       vars corresM i get position /p set
                   2177:       p -1 gt {
                   2178:         vars p  $($ corresN i get $)$ 3 cat_n put
                   2179:       }  {   } ifelse
                   2180:     } for
                   2181:     /arg1 [vars M  N vars-org] def
                   2182:     [(CurrentRingp) cp] system_variable
                   2183:   ] pop
                   2184:   popVariables
                   2185:   arg1
                   2186: } def
                   2187:
                   2188:
                   2189:
                   2190: /ringmap {
                   2191:   /arg2 set /arg1 set
                   2192:   [/in-ringmap /f /M2N /cp /f2] pushVariables
                   2193:   [
                   2194:     /f arg1 def /M2N arg2 def
                   2195:     [(CurrentRingp)] system_variable /cp set
                   2196:     f (0). eq { /f2 f def }
                   2197:     {
                   2198:        %f (ring) dc M2N 1 get eq
                   2199:        %{ }
                   2200:        %{ (The argument polynomial does not belong to the domain ring.) message
                   2201:        %  error
                   2202:        % } ifelse
                   2203:         [(CurrentRingp) M2N 1 get] system_variable
                   2204:         [(variableNames) M2N 0 get] system_variable
                   2205:         f toString /f2 set
                   2206:         [(variableNames) M2N 3 get] system_variable
                   2207:         f2 M2N 2 get ,, /f2 set
                   2208:     } ifelse
                   2209:     [(CurrentRingp) cp] system_variable
                   2210:     /arg1 f2 def
                   2211:   ] pop
                   2212:   popVariables
                   2213:   arg1
                   2214: } def
                   2215:
                   2216: [(makeRingMap)
                   2217:  [( rule  ring1 ring2 makeRingMap maptable   )
                   2218:   (makeRingMap is an auxiliary function for the macro ringmap. See ringmap)
                   2219:  ]
                   2220: ] putUsages
                   2221: [(ringmap)
                   2222:  [(f mapTable ringmap r)
                   2223:   (f is mapped to r where the map is defined by the mapTable, which is generated)
                   2224:   (by makeRingMap as follows:)
                   2225:   ( rule  ring1 ring2 makeRingMap maptable   )
                   2226:   $Example:$
                   2227:   $[(x,y) ring_of_differential_operators ( ) elimination_order 0] define_ring$
                   2228:   $/R1 set$
                   2229:   $[(t,y,z) ring_of_differential_operators ( ) elimination_order 0] define_ring$
                   2230:   $/R2 set$
                   2231:   $[[(x) (Dx)] [((t-1) Dt) (z)]] /r0 set$
                   2232:   $r0 R1 R2 makeRingMap /maptable set$
                   2233:   $(Dx-1) R1 ,, /ff set$
                   2234:   $ ff maptable ringmap :: $
                   2235:  ]
                   2236: ] putUsages
                   2237:
                   2238:
                   2239: /getVariableNames {
                   2240:   [/in-getVariableNames /ans /i /n] pushVariables
                   2241:   [
                   2242:      /n [(N)] system_variable def
                   2243:      [
                   2244:        n 1 sub -1 0 {
                   2245:          /i set
                   2246:          [(x) (var) i] system_variable
                   2247:        } for
                   2248:        n 1 sub -1 0{
                   2249:          /i set
                   2250:          [(D) (var) i] system_variable
                   2251:        } for
                   2252:       ] /arg1 set
                   2253:    ] pop
                   2254:   popVariables
                   2255:   arg1
                   2256: } def
                   2257: [(getVariableNames)
                   2258:  [(getVariableNames list-of-variables)
                   2259:   (Example: getVariableNames :: [e,x,y,E,H,Dx,Dy,h])
                   2260:  ]
                   2261: ] putUsages
                   2262:
                   2263: /tolower {
                   2264:   /arg1 set
                   2265:   [/in-tolower /s /sl] pushVariables
                   2266:   [
                   2267:     /s arg1 def
                   2268:     s (array) dc /s set
                   2269:     s { tolower.aux (string) dc } map /sl set
                   2270:     sl aload length cat_n /arg1 set
                   2271:   ] pop
                   2272:   popVariables
                   2273:   arg1
                   2274: } def
                   2275:
                   2276: /tolower.aux {
                   2277:   /arg1 set
                   2278:   arg1 64 gt  arg1 96 lt and
                   2279:   { arg1 32 add }
                   2280:   { arg1 } ifelse
                   2281: } def
                   2282: [(tolower)
                   2283:  [(string tolower string2)
                   2284:   (Capital letters in string are converted to lower case letters.)
                   2285:   $Example:  (Hello World) tolower :: (hello world)$
                   2286:  ]
                   2287: ] putUsages
                   2288:
                   2289: /hilbert {
                   2290:   /arg2 set
                   2291:   /arg1 set
                   2292:   [/in-hilb /base /vlist /rrrorg /rrr /ff /strf] pushVariables
                   2293:   [
                   2294:      /base arg1 def
                   2295:      /vlist arg2 def
                   2296:      [(CurrentRingp)] system_variable /rrrorg set
                   2297:      /strf 0 def
                   2298:      vlist isString
                   2299:      {  /vlist [ vlist to_records pop ] def }
                   2300:      {  } ifelse
                   2301:      base isArray {  }
                   2302:      { (hilb : the first argument must be an array of polynomials.)
                   2303:         error
                   2304:      } ifelse
                   2305:      vlist isArray {  }
                   2306:      { (hilb : the second argument must be an array of polynomials.)
                   2307:         error
                   2308:      } ifelse
                   2309:
                   2310:      vlist 0 get isString{ /strf 1 def } { } ifelse
                   2311:      base 0 get isPolynomial {
                   2312:        base 0 get (ring) dc /rrr set
                   2313:      }
                   2314:      {
                   2315:        [  vlist { (,) } map  aload length cat_n ring_of_polynomials 0 ] define_ring
                   2316:        /rrr set
                   2317:        base { . } map /base set
                   2318:      } ifelse
                   2319:      vlist { dup isPolynomial {  } { rrr ,, } ifelse } map /vlist set
                   2320:
                   2321:      [(hilbert) base vlist] extension /ff set
                   2322:      [(CurrentRingp) rrrorg] system_variable
                   2323:      /arg1 ff def
                   2324:   ] pop
                   2325:   popVariables
                   2326:   arg1
                   2327: } def
                   2328:
                   2329: /hilbReduce {
                   2330:   /arg2 set
                   2331:   /arg1 set
                   2332:   [/hhh /f /d /vv /ans] pushVariables
                   2333:   [
                   2334:      /hhh arg1 def %% hilbert function
                   2335:      /vv arg2 def
                   2336:      /f hhh 1 get def
                   2337:      f (0). eq { /ans [0] def /hilbReduce.label goto } { } ifelse
                   2338:      f vv << f (ring) dc >> ,,  degree /vv set
                   2339:      hhh 0 get /d set
                   2340:      d   d  (integer) dc factorial /d set
                   2341:      d << vv (universalNumber) dc vv factorial >> idiv /d set
                   2342:      [(divByN) f d] gbext /ans set
                   2343:      ans 1 get (0). eq
                   2344:      {  }
                   2345:      { (hilbReduce : Invalid hilbert function ) error } ifelse
                   2346:      /hilbReduce.label
                   2347:      ans 0 get /arg1 set
                   2348:   ]  pop
                   2349:   popVariables
                   2350:   arg1
                   2351: } def
                   2352:
                   2353:
                   2354: [(hilbReduce)
                   2355:  [([f,g] v hilbReduce p)
                   2356:   (output of hilbert [f,g];  string v; poly p)
                   2357:   (p is  (g/(f!))*deg(g)!)
                   2358:   $ [(x) (y^3)] (x,y,z) hilbert (h) hilbReduce $
                   2359:  ]
                   2360: ] putUsages
                   2361: [(hilbert)
                   2362:  [(base vlist hilbert [m f])
                   2363:   (array of poly base; array of poly vlist; number m; poly f;)
                   2364:   (array of string base; array of string vlist; number m; poly f;)
                   2365:   (array of string base; string vlist; number m; poly f;)
                   2366:   ([m f] represents the hilbert function (a_d x^d + ...)/m! where f=a_d x^d + ...)
                   2367:   (The << base >> should be a reduced Grobner basis.)
                   2368:   (Or, when the << base >> is an array of string,)
                   2369:   (all entries should be monomials.)
                   2370:   (Example: [(x^2) (x y )] (x,y)  hilbert ::  [2, 2 h + 4] )
                   2371:   (Example: [(x^2) (y^2)] (x,y) hilbert (h) hilbReduce ::  4)
                   2372:   (Example: [(x^2) (y^2) (x y)] [(x) (y)] hilbert (h) hilbReduce ::  3)
                   2373:   (cf. hilb,    hilbReduce)
                   2374:  ]
                   2375: ] putUsages
                   2376:
                   2377: /hilb {
                   2378:   hilbert (h) hilbReduce
                   2379: } def
                   2380: [(hilb)
                   2381:  [(base vlist hilb f)
                   2382:   (array of poly base; array of poly vlist;  poly f;)
                   2383:   (array of string base; array of string vlist; poly f;)
                   2384:   (array of string base; string vlist; number m; poly f;)
                   2385:   (f is the hilbert function (a_d x^d + ...)/m!)
                   2386:   (The << base >> should be a reduced Grobner basis.)
                   2387:   (Or, when the << base >> is an array of string,)
                   2388:   (all entries should be monomials.)
                   2389:   (Example: [(x^2) (x y )] (x,y)  hilb ::   h + 2 )
                   2390:   (Example: [(x^2) (y^2)] (x,y) hilb  4)
                   2391:   (Example: [(x^2) (y^2) (x y)] [(x) (y)] hilb ::  3)
                   2392:   (cf. hilbert,    hilbReduce)
                   2393:  ]
                   2394: ] putUsages
                   2395:
                   2396: [(diff0)
                   2397:  [ (f v n diff0 fn)
                   2398:    (<poly> fn, v ; <integer>  n ; <poly> fn)
                   2399:    (fn = v^n f where v^n is the operator to take the n-th differential.)
                   2400:    (We can use diff0 only in the ring of differential operators.)
                   2401:    (Example: [(x) ring_of_differential_operators 0] define_ring )
                   2402:    (         (x^10-x). (Dx). 1 diff0 ::)
                   2403:  ]
                   2404: ] putUsages
                   2405: /diff0 {
                   2406:   /arg3 set /arg2 set /arg1 set
                   2407:   [/in-diff /f /v /n /fn /rrr] pushVariables
                   2408:   [
                   2409:     /f arg1 def /v arg2 def /n arg3 def
                   2410:     f (0). eq
                   2411:     { /fn (0). def }
                   2412:     {
                   2413:        f (ring) dc /rrr set
                   2414:        v toString (^) n toString 3 cat_n rrr ,,
                   2415:        f mul
                   2416:        [[v (0).] [(h) rrr ,, (1) rrr ,,]] replace /fn set
                   2417:      } ifelse
                   2418:      fn /arg1 set
                   2419:   ] pop
                   2420:   popVariables
                   2421:   arg1
                   2422: } def
                   2423:
                   2424: [(action)
                   2425:  [( f g action p )
                   2426:   (<poly> f,g,p)
                   2427:   (Act f on g. The result is p. The homogenization variable h is put to 1.)
                   2428:   (We can use diff0 only in the ring of differential operators.)
                   2429:   (Example: [(x) ring_of_differential_operators 0] define_ring )
                   2430:   (         (Dx^2). (x^2). action ::)
                   2431:  ]
                   2432: ] putUsages
                   2433: /action {
                   2434:   /arg2 set /arg1 set
                   2435:   [/in-action /f /g /h /rr /rr.org /rule] pushVariables
                   2436:   [
                   2437:     /f arg1 def /g arg2 def
                   2438:     /rr.org [(CurrentRingp)] system_variable def
                   2439:     f (0). eq
                   2440:     { /h (0). def }
                   2441:     {
                   2442:         f (ring) dc /rr set
                   2443:         [(CurrentRingp) rr] system_variable
                   2444:         f g mul /h set
                   2445:         /rule getVariableNames def
                   2446:         0 1 rule length 2 idiv { rule rest /rule set } for
                   2447:         rule { . [ 2 1 roll (0). ] } map /rule set
                   2448:         rule << rule length 1 sub >> [(h). (1).] put
                   2449:         %%ex. rule = [[(Dx1). (0).] [(Dx2). (0).] [(h). (1).]]
                   2450:         /h h rule replace def
                   2451:     } ifelse
                   2452:     [(CurrentRingp) rr.org ] system_variable
                   2453:     /arg1 h def
                   2454:   ] pop
                   2455:   popVariables
                   2456:   arg1
                   2457: } def
                   2458:
                   2459: [(ord_w)
                   2460:  [(ff [v1 w1 v2 w2 ... vm wm] ord_w d)
                   2461:   (poly ff; string v1; integer w1; ...)
                   2462:   (order of ff by the weight vector [w1 w2 ...])
                   2463:   (Example: [(x,y) ring_of_polynomials 0] define_ring )
                   2464:   (          (x^2 y^3-x). [(x) 2 (y) 1] ord_w ::)
                   2465:  ]
                   2466: ] putUsages
                   2467: /ord_w {
                   2468:   /arg2 set /arg1 set
                   2469:   [/ord_w-in /fff /www /rrr /iii /ddd] pushVariables
                   2470:   [
                   2471:     /fff arg1 def
                   2472:     /www arg2 def
                   2473:     fff (0). eq { /ddd -intInfinity def /ord_w.LLL goto} { } ifelse
                   2474:     fff (ring) dc /rrr set
                   2475:     fff init /fff set
                   2476:     /ddd 0 def
                   2477:     0 2 www length 1 sub {
                   2478:       /iii set
                   2479:       fff << www iii get rrr ,, >> degree
                   2480:       << www iii 1 add get >> mul
                   2481:       ddd add /ddd set
                   2482:     } for
                   2483:     /ord_w.LLL
                   2484:     /arg1 ddd def
                   2485:   ] pop
                   2486:   popVariables
                   2487:   arg1
                   2488: } def
                   2489:
                   2490: [(laplace0)
                   2491:  [
                   2492:  (f [v1 ... vn] laplace0 g)
                   2493:  (poly f ; string v1 ... vn ; poly g;)
                   2494:  (array of poly f ; string v1 ... vn ; array of poly g;)
                   2495:  ( g is the lapalce transform of f with respect to variables v1, ..., vn.)
                   2496:  $Example: (x Dx + y Dy + z Dz). [(x) (y) (Dx) (Dy)] laplace0$
                   2497:  $ x --> -Dx, Dx --> x,  y --> -Dy, Dy --> y. $
                   2498:  ]
                   2499: ] putUsages
                   2500: /laplace0 {
                   2501:   /arg2 set /arg1 set
                   2502:   [/in-laplace0 /ff /rule /vv /nn /ii /v0 /v1 /rr /ans1 /Dascii
                   2503:   ] pushVariables
                   2504:   [
                   2505:   /ff arg1 def /vv arg2 def
                   2506:   /Dascii @@@.Dsymbol (array) dc 0 get def %%D-clean
                   2507:   /rule [ ] def
                   2508:   ff isPolynomial {
                   2509:    ff (0). eq { /ans1 (0). def }
                   2510:    {
                   2511:      ff (ring) dc /rr set
                   2512:      /nn vv length def
                   2513:      0 1 nn 1 sub {
                   2514:       /ii set
                   2515:       vv ii get (type?) dc 1 eq
                   2516:       {  }  % skip, may be weight [(x) 2 ] is OK.
                   2517:       {
                   2518:          /v0 vv ii get (string) dc def
                   2519:          v0 (array) dc 0 get Dascii eq  %% If the first character is D?
                   2520:          {  rule  %% Dx-->x
                   2521:             [v0 rr ,,
                   2522:             v0 (array) dc rest { (string) dc} map aload length cat_n rr ,,]
                   2523:             append /rule set
                   2524:          }
                   2525:          { rule   %% x --> -Dx
                   2526:            [v0 rr ,,
                   2527:             (0).
                   2528:             [Dascii] v0 (array) dc join { (string) dc } map aload length
                   2529:             cat_n rr ,,  sub
                   2530:            ]
                   2531:            append /rule set
                   2532:          } ifelse
                   2533:       } ifelse
                   2534:      } for
                   2535:      % rule message
                   2536:      ff rule replace [[(h) rr ,, (1) rr ,,]] replace /ans1 set
                   2537:      } ifelse
                   2538:     }
                   2539:    {
                   2540:        ff isArray { /ans1 ff {vv laplace0 } map def }
                   2541:        {
                   2542:          (laplace0 : the first argument must be a polynomial.) error
                   2543:        }ifelse
                   2544:     } ifelse
                   2545:     /arg1 ans1 def
                   2546:   ] pop
                   2547:   popVariables
                   2548:   arg1
                   2549: } def
                   2550:
                   2551: [(ip1)
                   2552:  [( [v1 ... vn] [w1 ... wn] m ip1 [f1 ... fs])
                   2553:   (<poly> v1 ... vn ; <integer> w1 ... wn m)
                   2554:   (<poly> f1 ... fs )
                   2555:   (Example: [(x,y) ring_of_differential_operators 0] define_ring )
                   2556:   (         [(Dx). (Dy).] [2 1] 3 ip1  ::    [(2 Dx Dy). (Dy^3).])
                   2557:   (         Returns Dx^p Dy^q such that  2 p + 1 q = 3.)
                   2558:  ]
                   2559: ] putUsages
                   2560: /ip1 {
                   2561:   /arg3 set /arg2 set /arg1 set
                   2562:   [/in-ip1 /vv /ww /m /ans /k /tt /rr /rr.org /ff /tmp1] pushVariables
                   2563:   [
                   2564:      /vv arg1 def /ww arg2 def /m arg3 def
                   2565:      vv 0 get (ring) dc /rr set
                   2566:      /rr.org [(CurrentRingp)] system_variable def
                   2567:      [(CurrentRingp) rr] system_variable
                   2568:      [(x) (var) [(N)] system_variable 1 sub ] system_variable . /tt set
                   2569:      /ans [ ] def
                   2570:      m 0 lt
                   2571:      {  }
                   2572:      {
                   2573:        vv
                   2574:        ww { tt 2 1 roll power } map mul /tmp1 set
                   2575:  %%      (tmp1 = ) messagen tmp1 message
                   2576:        0 1 m {
                   2577:          /k set
                   2578:          k 0 eq {
                   2579:            /ff (1). def
                   2580:          }
                   2581:          { tmp1 k power /ff set } ifelse
                   2582:          ff [[(h). (1).]] replace /ff set
                   2583:  %%        ff message
                   2584:          {
                   2585:            ff init tt degree m eq {
                   2586:              /ans ans [ ff init [[tt (1).]] replace ] join def
                   2587:            } { } ifelse
                   2588:            ff ff init sub /ff set
                   2589:            ff (0). eq { exit } {  } ifelse
                   2590:          } loop
                   2591:         } for
                   2592:       } ifelse
                   2593:      [(CurrentRingp) rr.org] system_variable
                   2594:      /arg1 ans def
                   2595:   ] pop
                   2596:   popVariables
                   2597:   arg1
                   2598: } def
                   2599:
                   2600: [(findIntegralRoots)
                   2601:  [( f findIntegralRoots vlist)
                   2602:   (poly f; list of integers vlist;)
                   2603:   (string f; list of integers vlist;)
                   2604:   (f is a polynomials in one variable s. vlist the list of integral roots sorted.)
                   2605:   (Example: (s^4-1) findIntegralRoots )
                   2606:  ]
                   2607: ] putUsages
                   2608:
                   2609: /findIntegralRoots { findIntegralRoots.slow } def
                   2610:
                   2611: /findIntegralRoots.slow {  %% by a stupid algorithm
                   2612:   /arg1 set
                   2613:   [/in-findIntegralRoots
                   2614:    /ff /kk /roots /rrr /nn /k0 /d.find
                   2615:   ] pushVariables
                   2616:   [
                   2617:     /ff arg1 def
                   2618:     /roots [  ] def
                   2619:     /rrr [(CurrentRingp)] system_variable def
                   2620:     ff toString /ff set
                   2621:     [(s) ring_of_polynomials ( ) elimination_order 0] define_ring
                   2622:     ff . /ff set
                   2623:
                   2624:     %%ff message  %% Cancel the common numerical factor of the polynomial ff.
                   2625:     ff (s). coeff 1 get { (universalNumber) dc } map ngcd /d.find set
                   2626:     [(divByN) ff d.find] gbext 0 get /ff set
                   2627:     %% d.find message
                   2628:     %% ff message
                   2629:
                   2630:     ff [[(s). (0).]] replace /k0 set
                   2631:     k0 (universalNumber) dc /k0 set
                   2632:     k0 (0).. eq { roots (0).. append /roots set } { } ifelse
                   2633:
                   2634:     {
                   2635:       ff [[(s). (0).]] replace /nn set
                   2636:       nn (universalNumber) dc /nn set
                   2637:       nn (0).. eq
                   2638:       { (s^(-1)). ff mul /ff set }
                   2639:       { exit }
                   2640:       ifelse
                   2641:     } loop
                   2642:     ff [[(s). (0).]] replace /k0 set
                   2643:     k0 (universalNumber) dc /k0 set
                   2644:     k0 (-40000).. gt k0 (40000).. lt and not {
                   2645:      [(Roots of b-function cannot be obtained by a stupid method.) nl
                   2646:       (Use ox_asir for efficient factorizations, or restall and bfm manually.)
                   2647:        nl
                   2648:       (ox_asir server will be distributed from the asir ftp cite.) nl
                   2649:       (See lib/ttt.tex for details.) nl
                   2650:       ] cat
                   2651:       error
                   2652:     } {  } ifelse
                   2653:     nn (0).. lt { (0).. nn sub /nn set } {  } ifelse
                   2654:     /kk  (0).. nn sub  def
                   2655:     /roots [ kk (1).. sub ] roots join def
                   2656:     {
                   2657:        kk nn gt { exit } {  } ifelse
                   2658:        ff [[(s). kk (poly) dc]] replace
                   2659:        (0). eq
                   2660:        { /roots roots kk append def }
                   2661:        {  } ifelse
                   2662:        kk (1).. add /kk set
                   2663:     }  loop
                   2664:     [(CurrentRingp) rrr] system_variable
                   2665:     roots { (integer) dc } map /roots set %% ??  OK?
                   2666:     roots shell rest /roots set
                   2667:     /arg1 roots def
                   2668:   ] pop
                   2669:   popVariables
                   2670:   arg1
                   2671: } def
                   2672:
                   2673: /ngcd {
                   2674:   /arg1 set
                   2675:   [/in-ngcd /nlist /g.ngcd /ans] pushVariables
                   2676:   [
                   2677:      /nlist arg1 def
                   2678:      nlist length 2 lt
                   2679:      { /ans nlist 0 get def /L.ngcd goto }
                   2680:      {
                   2681:         [(gcd) nlist 0 get nlist 1 get] mpzext /g.ngcd set
                   2682:         g.ngcd (1).. eq { /ans (1).. def /L.ngcd goto } { } ifelse
                   2683:         [g.ngcd] nlist rest rest join ngcd /ans set
                   2684:       } ifelse
                   2685:      /L.ngcd
                   2686:      ans /arg1 set
                   2687:   ] pop
                   2688:   popVariables
                   2689:   arg1
                   2690: } def
                   2691:
                   2692: [(ngcd)
                   2693:  [(nlist ngcd d )
                   2694:   (list of numbers nlist; number d;)
                   2695:   (d is the gcd of the numbers in nlist.)
                   2696:   (Example: [(12345).. (67890).. (98765)..] ngcd )
                   2697: ]] putUsages
                   2698:
                   2699: /dehomogenize {
                   2700:   /arg1 set
                   2701:   [/in-dehomogenize /f /rr /ans /cring] pushVariables
                   2702:   [
                   2703:      /f arg1 def
                   2704:      f isPolynomial {
                   2705:        f (0). eq
                   2706:        { f /ans set }
                   2707:        {
                   2708:           f (ring) dc /rr set
                   2709:           [(CurrentRingp)] system_variable /cring set
                   2710:           [(CurrentRingp) rr] system_variable
                   2711:           f [[[(D) (var) 0] system_variable . (1). ]] replace /ans set
                   2712:           [(CurrentRingp) cring] system_variable
                   2713:        } ifelse
                   2714:      }
                   2715:      {
                   2716:         f isArray {
                   2717:          f { dehomogenize } map /ans set
                   2718:         }
                   2719:         {(dehomogenize: argument should be a polynomial.) error }
                   2720:         ifelse
                   2721:      } ifelse
                   2722:      /arg1 ans def
                   2723:   ] pop
                   2724:   popVariables
                   2725:   arg1
                   2726: } def
                   2727:
                   2728: [(dehomogenize)
                   2729:  [(obj dehomogenize obj2)
                   2730:   (dehomogenize puts the homogenization variable to 1.)
                   2731:   (Example:  (x*h+h^2). dehomogenize ::    x+1 )
                   2732:  ]
                   2733: ] putUsages
                   2734:
                   2735:
                   2736: /from_records { { (,) } map aload length cat_n } def
                   2737: [(from_records)
                   2738:  [ ([s1 s2 s3 ... sn] from_records (s1,s2,...,sn,))
                   2739:    (Example : [(x) (y)] from_records ::    (x,y,))
                   2740:    (cf. to_records)
                   2741:  ]
                   2742: ] putUsages
                   2743: /popEnv {
                   2744:   { system_variable pop } map pop
                   2745: } def
                   2746:
                   2747: /pushEnv {
                   2748:    %% opt=[(CurrentRingp) (NN)] ==> [[(CurrentRingp) val] [(NN) val]]
                   2749:    { [ 2 1 roll dup [ 2 1 roll ] system_variable ] } map
                   2750: } def
                   2751: [(pushEnv)
                   2752:  [(keylist pushEnv envlist)
                   2753:   (array of string keylist, array of [string object] envlist;)
                   2754:   (Values <<envlist>> of the global system variables specified )
                   2755:   (by the <<keylist>> is push on the stack.)
                   2756:   (keylist is an array of keywords for system_variable.)
                   2757:   (cf. system_variable, popEnv)
                   2758:   (Example:  [(CurrentRingp) (KanGBmessage)] pushEnv)
                   2759:  ]
                   2760: ] putUsages
                   2761: [(popEnv)
                   2762:  [(envlist popEnv)
                   2763:   (cf. pushEnv)
                   2764:  ]
                   2765: ] putUsages
                   2766:
                   2767: /npower {
                   2768:   /arg2 set
                   2769:   /arg1 set
                   2770:   [/f /k /i /ans] pushVariables
                   2771:   [
                   2772:      /f arg1 def   /k arg2 ..int def
                   2773:      f tag PolyP eq {
                   2774:        /ans (1). def
                   2775:      } {
                   2776:        /ans (1).. def
                   2777:      } ifelse
                   2778:      k 0 lt {
                   2779:        1 1 << 0 k sub >> {
                   2780:          /ans f ans {mul} sendmsg2 def
                   2781:        } for
                   2782:        /ans (1).. ans {div} sendmsg2 def
                   2783:      }
                   2784:      {
                   2785:        1 1 k {
                   2786:          /ans f ans {mul} sendmsg2 def
                   2787:        } for
                   2788:      } ifelse
                   2789:      /arg1 ans def
                   2790:   ] pop
                   2791:   popVariables
                   2792:   arg1
                   2793: } def
                   2794: [(npower)
                   2795:  [(obj1 obj2 npower obj3)
                   2796:   (npower returns obj1^obj2 as obj3)
                   2797:   (The difference between power and npower occurs when we compute f^0)
                   2798:   (where f is a polynomial.)
                   2799:   $power returns number(universalNumber) 1, but npower returns 1$
                   2800:   (in the current ring.)
                   2801:  ]
                   2802: ] putUsages
                   2803:
                   2804: /gensym {
                   2805:   (dollar) dc 2 cat_n
                   2806: } def
                   2807: [(gensym)
                   2808:  [(x i gensym xi)
                   2809:   (string x; integer i; string xi)
                   2810:   (It generate a string x indexed with the number i.)
                   2811:   $Example:  (Dx) 12 gensym (Dx12)$
                   2812:  ]
                   2813: ] putUsages
                   2814:
                   2815: /cat {
                   2816:   { toString } map aload length cat_n
                   2817: } def
                   2818: [(cat)
                   2819:  [(a cat s)
                   2820:   (array a ; string s;)
                   2821:   (cat converts each entry of << a >> to a string and concatenates them.)
                   2822:   (Example: [ (x) 1 2] cat ==> (x12))
                   2823:  ]
                   2824: ] putUsages
                   2825:
                   2826:
                   2827: %%%%%%%%%%%%%%%%%%% pmat-level
                   2828: /pmat-level {
                   2829:   /arg2 set
                   2830:   /arg1 set
                   2831:   [/n /i /m /lev /flag] pushVariables
                   2832:   [
                   2833:     /m arg1 def
                   2834:     /lev arg2 def
                   2835:     m isArray {
                   2836:        /n m length def
                   2837:        n 0 eq { /flag 0 def }
                   2838:        { m 0 get isArray { /flag 1 def } { /flag 0 def} ifelse } ifelse
                   2839:     } {  /flag 0 def } ifelse
                   2840:
                   2841:     flag {
                   2842:       0 1 lev {
                   2843:         pop ( ) messagen
                   2844:       } for
                   2845:       ([ ) message
                   2846:       0 1 n 1 sub {
                   2847:         /i set
                   2848:         m i get lev 1 add pmat-level
                   2849:       } for
                   2850:       0 1 lev {
                   2851:         pop ( ) messagen
                   2852:       } for
                   2853:       (]) message
                   2854:     }
                   2855:     {
                   2856:        0 1 lev {
                   2857:          pop ( ) messagen
                   2858:        } for
                   2859:        ( ) messagen
                   2860:        m message
                   2861:     } ifelse
                   2862:   ] pop
                   2863:   popVariables
                   2864: } def
                   2865:
                   2866: /pmat {  0 pmat-level } def
                   2867:
                   2868: [(pmat)
                   2869:  [(f pmat)
                   2870:   (array f;)
                   2871:   (f is pretty printed.)
                   2872:  ]
                   2873: ] putUsages
                   2874:
                   2875:
                   2876: /adjoint1 {
                   2877:   /arg2 set
                   2878:   /arg1 set
                   2879:   [/in-adjoint1 /f /p /q /xx /dxx /ans /g /one] pushVariables
                   2880:   [
                   2881:      /f arg1 def
                   2882:      /xx arg2 def
                   2883:      f isPolynomial {  }
                   2884:      { (adjoint1: the first argument must be a polynomial.) message
                   2885:        pop popVariables
                   2886:        (adjoint1: the first argument must be a polynomial.)  error
                   2887:      } ifelse
                   2888:      /ans (0). def
                   2889:      f (0). eq {   }
                   2890:      {
                   2891:         /xx xx (string) dc def
                   2892:         /dxx [@@@.Dsymbol xx] cat def
                   2893:         /xx xx f (ring) dc ,, def
                   2894:         /dxx dxx f (ring) dc ,, def
                   2895:         /one (1) f (ring) dc ,, def
                   2896:
                   2897:         {
                   2898:           /g f init def
                   2899:           /f f g sub def
                   2900:           /p g xx degree def
                   2901:           /q g dxx degree def
                   2902:           g [[xx one] [dxx one]] replace /g set
                   2903:           g
                   2904:           << (0). dxx sub q npower    xx p npower mul >>
                   2905:           mul
                   2906:           ans add /ans set
                   2907:           f (0). eq { exit } { } ifelse
                   2908:         } loop
                   2909:         ans dehomogenize /ans set
                   2910:      } ifelse
                   2911:      /arg1 ans def
                   2912:   ] pop
                   2913:   popVariables
                   2914:   arg1
                   2915: } def
                   2916:
                   2917: /adjoint {
                   2918:   /arg2 set
                   2919:   /arg1 set
                   2920:   [/in-adjoint /f /xx /xx0] pushVariables
                   2921:   [
                   2922:      /f arg1 def /xx arg2 def
                   2923:      xx toString /xx set
                   2924:      [xx to_records pop] /xx set
                   2925:      xx { /xx0 set f xx0 adjoint1 /f set } map
                   2926:      /arg1 f def
                   2927:   ]pop
                   2928:   popVariables
                   2929:   arg1
                   2930: } def
                   2931:
                   2932: [(adjoint)
                   2933:  [(f xlist adjoint g)
                   2934:   (poly f; string xlist; poly g;)
                   2935:   (g is the adjoint operator of f.)
                   2936:   (The variables to take adjoint are specified by xlist.)
                   2937:   (Example: [(x,y) ring_of_differential_operators 0] define_ring)
                   2938:   (          (x^2 Dx - y x Dx Dy-2). (x,y) adjoint )
                   2939:   $          ((-Dx) x^2 - (-Dx) (-Dy) x y -2). dehomogenize sub :: ==> 0$
                   2940: ]] putUsages
                   2941:
                   2942: %%%%% diagonal for tensor products
                   2943: %% 1998, 12/4 (Sat)
                   2944: %% s_i = x_i, t_i = x_i - y_i,    Restrict to t_i = 0.
                   2945: %% x_i = x_i, y_i = s_i - t_i,
                   2946: %% Dx_i = Dt_i + Ds_i, Dy_i = -Dt_i.
                   2947: /diagonalx {
                   2948:   /arg2 set
                   2949:   /arg1 set
                   2950:   [/in-diagonalx /f] pushVariables
                   2951:   [
                   2952:     (Not implemented yet.) message
                   2953:   ] pop
                   2954:   popVariables
                   2955:   arg1
                   2956: } def
                   2957:
                   2958:
                   2959:
                   2960: %%%%%%%%%%%  distraction2 for b-function
                   2961: /distraction2 {
                   2962:   /arg4 set
                   2963:   /arg3 set
                   2964:   /arg2 set
                   2965:   /arg1 set
                   2966:   [/f  /dx /ss /xx  /ans /n /i /rr] pushVariables
                   2967:   [
                   2968:     /f arg1 def /xx arg2 def /dx arg3 def /ss arg4 def
                   2969:     f (0). eq {  }
                   2970:     {
                   2971:       /rr f (ring) dc def
                   2972:       xx {toString rr ,, } map /xx set
                   2973:       dx {toString rr ,, } map /dx set
                   2974:       ss {toString rr ,, } map /ss set
                   2975:       /n xx length  def
                   2976:       0 1 n 1 sub {
                   2977:          /i set
                   2978:          /f  f xx i get dx i get ss i get destraction2.1 /f set
                   2979:       } for
                   2980:     } ifelse
                   2981:     /arg1 f def
                   2982:   ]pop
                   2983:   popVariables
                   2984:   arg1
                   2985: } def
                   2986: [(distraction2)
                   2987:  [(f [ list of x-variables ] [ list of D-variables ] [ list of s-variables ])
                   2988:   (   distraction2  result )
                   2989:   $Example 1: [(x,y) ring_of_differential_operators 0] define_ring $
                   2990:   $  (x^2 Dx Dy + x Dy). [(x). (y).] [(Dx). (Dy).] [(x). (y).] distraction2$
                   2991:   $Example 2: (x^4 Dx^2 + x^2). [(x).] [(Dx). ] [(x).] distraction2$
                   2992:  ]
                   2993: ] putUsages
                   2994: /destraction2.1 {
                   2995:   /arg4 set
                   2996:   /arg3 set
                   2997:   /arg2 set
                   2998:   /arg1 set
                   2999:   [/ww /f  /dx /ss /xx /coeff0 /expvec
                   3000:    /coeffvec /expvec2 /ans /one /rr /dd] pushVariables
                   3001:   [
                   3002:     /f arg1 def /xx arg2 def /dx arg3 def /ss arg4 def
                   3003:     f (ring) dc /rr set
                   3004:     /one (1) rr ,, def %%
                   3005:     /ww [ xx toString -1 dx toString 1 ] weightv  def
                   3006:     f ww init f sub (0). eq {   }
                   3007:     { [(destraction2.1 : inhomogeneous with respect to )
                   3008:         xx  ( and )  dx  nl
                   3009:        (Your weight vector may not be generic.)
                   3010:       ] cat error } ifelse
                   3011:     /dd << f dx degree >> << f xx degree >> sub def
                   3012:     f [[xx one]] replace dx coefficients  /coeff0 set
                   3013:     /expvec coeff0 0 get { (integer) dc } map def
                   3014:     /coeffvec coeff0 1 get def
                   3015:     expvec { ss 2 -1 roll factorial } map /expvec2 set
                   3016:     expvec2 coeffvec mul  /ans set
                   3017:     %% x^p d^q, (p > q) case.  x^2( x^2 Dx^2 + x Dx + 1)
                   3018:     dd 0 lt {
                   3019:       %% (ss+1) (ss+2) ... (ss+d)
                   3020:       one 1 1 0 dd sub { (universalNumber) dc ss add mul} for
                   3021:       ans mul /ans set
                   3022:     }
                   3023:     {  } ifelse
                   3024:     /arg1 ans def
                   3025:    ] pop
                   3026:    popVariables
                   3027:    arg1
                   3028: } def
                   3029:
                   3030: /message-quiet  {
                   3031:   @@@.quiet { pop } { message } ifelse
                   3032: } def
                   3033: [(message-quiet)
                   3034:  [(s message-quiet )
                   3035:  (string s;)
                   3036:  (It outputs the message s when @@@.quiet is not equal to 1.)
                   3037:  (@@@.quiet is set to 1 when you start sm1 with the option -q.)
                   3038: ]] putUsages
                   3039: /messagen-quiet  {
                   3040:   @@@.quiet { pop } { messagen } ifelse
                   3041: } def
                   3042: [(messagen-quiet)
                   3043:  [(s messagen-quiet )
                   3044:  (string s;)
                   3045:  (It outputs the message s without the newline when @@@.quiet is not equal to 1.)
                   3046:  (@@@.quiet is set to 1 when you start sm1 with the option -q.)
                   3047: ]] putUsages
                   3048:
                   3049: /getvNames0 {
                   3050:   /arg1 set
                   3051:   [/in-getvNames0 /nlist /nn /i] pushVariables
                   3052:   [
                   3053:     /nlist arg1 def
                   3054:     [(N)] system_variable /nn set
                   3055:     nlist { /i set
                   3056:        i nn lt {
                   3057:          [(x) (var) i] system_variable
                   3058:        } {
                   3059:          [(D) (var) i nn sub] system_variable
                   3060:        } ifelse
                   3061:     } map
                   3062:     /arg1 set
                   3063:   ] pop
                   3064:   popVariables
                   3065:   arg1
                   3066: } def
                   3067:
                   3068: /getvNames {
                   3069:   [/in-getvNames /nn] pushVariables
                   3070:   [
                   3071:     [(N)] system_variable /nn set
                   3072:     [0 1 nn 2 mul 1 sub {  } for] getvNames0 /arg1 set
                   3073:   ] pop
                   3074:   popVariables
                   3075:   arg1
                   3076: } def
                   3077: [(getvNames)
                   3078: [(getvNames vlist)
                   3079:  (list vlist)
                   3080:  (It returns of the list of the variables in the order x0, x1, ..., D0, ...)
                   3081:  (Use with [(variableNames) vlist] system_variable.)
                   3082:  (cf. nlist getvNames0 vlist is used internally. cf. getvNamesC)
                   3083: ]] putUsages
                   3084:
                   3085: /getvNamesC {
                   3086:   [/in-getvNamesC /nn /i] pushVariables
                   3087:   [
                   3088:     [(N)] system_variable /nn set
                   3089:     [nn 1 sub -1 0 {  } for nn 2 mul 1 sub -1 nn { } for ] getvNames0 /arg1 set
                   3090:   ] pop
                   3091:   popVariables
                   3092:   arg1
                   3093: } def
                   3094: [(getvNamesC)
                   3095: [(getvNamesC vlist)
                   3096:  (list vlist)
                   3097:  $It returns of the list of the variables in the order 0, 1, 2, ... $
                   3098:  $(cmo-order and output_order).$
                   3099:  (cf. getvNames)
                   3100: ]] putUsages
                   3101:
                   3102: /getvNamesCR {
                   3103:   /arg1 set
                   3104:   [/in-getvNamesCR /rrr] pushVariables
                   3105:   [(CurrentRingp)] pushEnv
                   3106:   [
                   3107:     /rrr arg1 def
                   3108:     rrr isPolynomial {
                   3109:       rrr (0). eq { (No name field for 0 polynomial.) error }
                   3110:       { rrr (ring) dc /rrr set } ifelse
                   3111:     } { } ifelse
                   3112:     [(CurrentRingp) rrr] system_variable
                   3113:     getvNamesC /arg1 set
                   3114:   ] pop
                   3115:   popEnv
                   3116:   popVariables
                   3117:   arg1
                   3118: } def
                   3119: [(getvNamesCR)
                   3120: [(obj getvNamesCR vlist)
                   3121:  (obj ring | poly ; list vlist)
                   3122:  $It returns of the list of the variables in the order 0, 1, 2, ... (cmo-order)$
                   3123:  (for <<obj>>.)
                   3124:  (Example: ( (x-2)^3 ). /ff set )
                   3125:  (         [(x) ring_of_differential_operators 0] define_ring ff getvNamesCR ::)
                   3126: ]] putUsages
                   3127:
                   3128:
                   3129: /reduction-noH {
                   3130:   /arg2 set
                   3131:   /arg1 set
                   3132:   [/in-reduction-noH /ff /gg] pushVariables
                   3133:   [(Homogenize)] pushEnv
                   3134:   [
                   3135:     /ff arg1 def
                   3136:     /gg arg2 def
                   3137:     [(Homogenize) 0] system_variable
                   3138:     ff gg reduction /arg1 set
                   3139:   ] pop
                   3140:   popEnv
                   3141:   popVariables
                   3142:   arg1
                   3143: } def
                   3144: [(reduction-noH)
                   3145: [(f g reduction-noH r)
                   3146:  (poly f; array g; array r;)
                   3147:  (Apply the normal form algorithm for f with the set g. All computations are)
                   3148:  (done with the rule Dx x = x Dx +1, i.e., no homogenization, but other)
                   3149:  (specifications are the same with reduction. cf. reduction)
                   3150:  (g should be dehomogenized.)
                   3151: ]] putUsages
                   3152:
                   3153: /-intInfinity -999999999  def
                   3154: /intInfinity   999999999  def
                   3155: [(intInfinity)
                   3156: [(intInfinity = 999999999)]
                   3157: ] putUsages
                   3158: [(-intInfinity)
                   3159: [(-intInfinity = -999999999)]
                   3160: ] putUsages
                   3161:
                   3162:
                   3163: /maxInArray {
                   3164:   /arg1 set
                   3165:   [/in-maxInArray /v /ans /i /n] pushVariables
                   3166:   [
                   3167:     /v arg1 def
                   3168:     /n v length def
                   3169:     /maxInArray.pos 0 def
                   3170:     n 0 eq {
                   3171:       /ans null def
                   3172:     } {
                   3173:       /ans v 0 get def
                   3174:       1 1 n 1 sub {
                   3175:         /i set
                   3176:         v i get ans gt {
                   3177:            /ans v i get def
                   3178:            /maxInArray.pos i def
                   3179:         } { } ifelse
                   3180:       } for
                   3181:     } ifelse
                   3182:     /arg1 ans def
                   3183:   ] pop
                   3184:   popVariables
                   3185:   arg1
                   3186: } def
                   3187: [(maxInArray)
                   3188: [( [v1 v2 ....] maxInArray m )
                   3189:  (m is the maximum in [v1 v2 ...].)
                   3190:  (The position of m is stored in the global variable maxInArray.pos.)
                   3191: ]] putUsages
                   3192:
                   3193: /cancelCoeff {
                   3194:  /arg1 set
                   3195:  [/in-cancelCoeff /ff /gg /dd /dd2] pushVariables
                   3196:  [  /ff arg1 def
                   3197:     ff (0). eq {
                   3198:       /label.cancelCoeff2 goto
                   3199:     } {  } ifelse
                   3200:     /gg ff def
                   3201:     /dd [(lcoeff) ff init ] gbext (universalNumber) dc def
                   3202:     {
                   3203:        gg (0). eq { exit} {  } ifelse
                   3204:        [(lcoeff) gg init] gbext (universalNumber) dc  /dd2 set
                   3205:        [(gcd) dd dd2] mpzext /dd set
                   3206:        dd (1).. eq {
                   3207:          /label.cancelCoeff goto
                   3208:        } {  } ifelse
                   3209:        /gg gg gg init sub def
                   3210:      } loop
                   3211:      [(divByN)  ff dd] gbext 0 get /ff set
                   3212:     /label.cancelCoeff
                   3213:      [(lcoeff) ff init] gbext (universalNumber) dc (0).. lt
                   3214:      { ff (-1).. mul /ff set } {  } ifelse
                   3215:     /label.cancelCoeff2
                   3216:     /arg1 ff def
                   3217:  ] pop
                   3218:  popVariables
                   3219:  arg1
                   3220: } def
                   3221: [(cancelCoeff)
                   3222:  [(f cancelcoeff g)
                   3223:   (poly f,g;)
                   3224:   (Factor out the gcd of the coefficients.)
                   3225:   (Example: (6 x^2 - 10 x). cancelCoeff)
                   3226:   (See also gbext.)
                   3227: ]] putUsages
                   3228:
                   3229:
                   3230: /flatten {
                   3231:   /arg1 set
                   3232:   [/in-flatten /mylist] pushVariables
                   3233:   [
                   3234:      /mylist arg1 def
                   3235:      mylist isArray {
                   3236:        mylist { dup isArray { aload pop } { } ifelse } map /mylist set
                   3237:      }{ } ifelse
                   3238:      /arg1 mylist def
                   3239:   ] pop
                   3240:   popVariables
                   3241:   arg1
                   3242: } def
                   3243: [(flatten)
                   3244:  [(list flatten list2)
                   3245:   (Flatten the list.)
                   3246:   (Example 1: [ [1 2 3] 4 [2]] flatten    ===> [1 2 3 4 2])
                   3247: ]] putUsages
                   3248:
                   3249: %% Take first N elements.
                   3250: /carN {
                   3251:   /arg2 set
                   3252:   /arg1 set
                   3253:   [/in-res-getN /pp /nn /ans] pushVariables
                   3254:   [
                   3255:      /nn arg2 def
                   3256:      /pp arg1 def
                   3257:      pp isArray {
                   3258:        pp length nn lt {
                   3259:          /ans pp def
                   3260:        } {
                   3261:          [pp aload length nn sub /nn set 1 1 nn { pop pop } for ] /ans set
                   3262:        } ifelse
                   3263:      } {
                   3264:        /ans pp def
                   3265:      } ifelse
                   3266:      /arg1 ans def
                   3267:   ] pop
                   3268:   popVariables
                   3269:   arg1
                   3270: } def
                   3271: [(carN)
                   3272: [([f1 ... fm]  n carN  [f1 ... fn])
                   3273:  (carN extracts the first n elements from the list.)
                   3274: ]] putUsages
                   3275:
                   3276: /getRing {
                   3277:   /arg1 set
                   3278:   [/in-getRing /aa /n /i /ans] pushVariables
                   3279:   [
                   3280:     /aa arg1 def
                   3281:     /ans null def
                   3282:     aa isPolynomial {
                   3283:       aa (0). eq {
                   3284:       } {
                   3285:          /ans aa (ring) dc def
                   3286:       } ifelse
                   3287:     } {
                   3288:      aa isArray {
                   3289:        /n aa length 1 sub def
                   3290:        0 1 n { /i set aa i get getRing /ans set
                   3291:                ans tag 0 eq {  } { /getRing.LLL goto } ifelse
                   3292:        } for
                   3293:      }{ } ifelse
                   3294:     } ifelse
                   3295:     /getRing.LLL
                   3296:     /arg1 ans def
                   3297:   ] pop
                   3298:   popVariables
                   3299:   arg1
                   3300: } def
                   3301: [(getRing)
                   3302: [(obj getRing rr)
                   3303:  (ring rr;)
                   3304:  (getRing obtains the ring structure from obj.)
                   3305:  (If obj is a polynomial, it returns the ring structure associated to)
                   3306:  (the polynomial.)
                   3307:  (If obj is an array, it recursively looks for the ring structure.)
                   3308: ]] putUsages
                   3309: /toVectors {
                   3310:   /arg1 set
                   3311:   [/in-toVectors /gg /n /ans] pushVariables
                   3312:   [
                   3313:     /gg arg1 def
                   3314:     gg isArray {
                   3315:       gg length 0 eq {
                   3316:         /ans [ ] def
                   3317:         /toVectors.LLL goto
                   3318:       } {
                   3319:         gg 0 get isInteger {
                   3320:           gg @@@.toVectors2 /ans set
                   3321:         } {
                   3322:           gg @@@.toVectors /ans set
                   3323:         } ifelse
                   3324:         /toVectors.LLL goto
                   3325:       } ifelse
                   3326:     } {
                   3327:       %% It is not array.
                   3328:       gg (array) dc /ans set
                   3329:     } ifelse
                   3330:     /toVectors.LLL
                   3331:     /arg1 ans def
                   3332:    ] pop
                   3333:    popVariables
                   3334:    arg1
                   3335: } def
                   3336: /@@@.toVectors2 {
                   3337:   /arg1 set
                   3338:   [/in-@@@.toVectors2 /gg /ans /n /tmp /notarray] pushVariables
                   3339:   [
                   3340:     /gg arg1 def
                   3341:     /ans gg 1 get @@@.toVectors def
                   3342:     /n   gg 0 get def
                   3343:     gg 1 get isArray not {
                   3344:        /ans [ans] def
                   3345:        /notarray 1 def
                   3346:     }{ /notarray 0 def} ifelse
                   3347:     ans {
                   3348:       /tmp set
                   3349:       tmp length n lt {
                   3350:         tmp
                   3351:         [1 1 n tmp length sub { pop (0). } for ]
                   3352:         join /tmp set
                   3353:       } {  } ifelse
                   3354:       tmp
                   3355:     } map
                   3356:     /ans set
                   3357:     notarray { ans 0 get /ans set } { } ifelse
                   3358:     /arg1 ans def
                   3359:   ] pop
                   3360:   popVariables
                   3361:   arg1
                   3362: } def
                   3363:
                   3364: /@@@.toVectors {
                   3365:   /arg1 set
                   3366:   [/in-@@@.toVectors /gg ] pushVariables
                   3367:   [
                   3368:     /gg arg1 def
                   3369:     gg isArray {
                   3370:       gg { $array$ data_conversion } map
                   3371:     } {
                   3372:       gg (array) data_conversion
                   3373:     }ifelse
                   3374:     /arg1 set
                   3375:    ] pop
                   3376:    popVariables
                   3377:    arg1
                   3378: } def
                   3379:
                   3380: /toVectors2 { toVectors } def
                   3381:
                   3382: /fromVectors { { fromVectors.aux } map } def
                   3383: /fromVectors.aux {
                   3384:   /arg1 set
                   3385:   [/in-fromVector.aux /vv /mm /ans /i /ee] pushVariables
                   3386:   [(CurrentRingp)] pushEnv
                   3387:   [
                   3388:     /vv arg1 def
                   3389:     /mm vv length def
                   3390:     /ans (0). def
                   3391:     /ee (0). def
                   3392:     0 1 mm 1 sub {
                   3393:       /i set
                   3394:       vv i get (0). eq {
                   3395:       } {
                   3396:         [(CurrentRingp) vv i get (ring) dc] system_variable
                   3397:         [(x) (var) [(N)] system_variable 1 sub] system_variable . /ee set
                   3398:         /fromVector.LLL  goto
                   3399:       } ifelse
                   3400:     } for
                   3401:     /fromVector.LLL
                   3402:     %% vv message
                   3403:     0 1 mm 1 sub {
                   3404:       /i set
                   3405:       vv i get (0). eq {
                   3406:       } {
                   3407:         /ans ans
                   3408:             << vv i get >> << ee i npower >> mul
                   3409:          add def
                   3410:       } ifelse
                   3411:       %% [i ans] message
                   3412:     } for
                   3413:     /arg1 ans def
                   3414:   ] pop
                   3415:   popEnv
                   3416:   popVariables
                   3417:   arg1
                   3418: } def
                   3419: [(fromVectors)
                   3420: [
                   3421: ([v1 v2 ...] fromVectors [s1 s2 ...])
                   3422: (array of poly : v1, v2, ... ; poly : s1, s2 ....)
                   3423: (cf. toVectors. <<e_>> varaible is assumed to be the last )
                   3424: (    variable in x.  @@@.esymbol)
                   3425: $Example: [(x,y) ring_of_differential_operators 0] define_ring$
                   3426: $ [(x).  (y).] /ff set  $
                   3427: $ [ff ff] fromVectors :: $
                   3428: ]] putUsages
                   3429:
                   3430: /getOrderMatrix {
                   3431:   /arg1 set
                   3432:   [/in-getOrderMatrix /obj /rr /ans /ans2 /i] pushVariables
                   3433:   [(CurrentRingp)] pushEnv
                   3434:   [
                   3435:     /obj arg1 def
                   3436:     obj isArray {
                   3437:       obj { getOrderMatrix } map /ans set
                   3438:       ans length 0 {
                   3439:          /ans null def
                   3440:       } {
                   3441:          /ans2 null def
                   3442:          0 1 ans length 1 sub {
                   3443:            /i set
                   3444:            ans i get tag 0 eq
                   3445:            {   }
                   3446:            { /ans2 ans i get def } ifelse
                   3447:          } for
                   3448:          /ans ans2 def
                   3449:       } ifelse
                   3450:       /getOrderMatrix.LLL goto
                   3451:     } {  } ifelse
                   3452:     obj tag 14 eq {
                   3453:       [(CurrentRingp) obj] system_variable
                   3454:       [(orderMatrix)] system_variable /ans set
                   3455:       /getOrderMatrix.LLL goto
                   3456:     } {  } ifelse
                   3457:     obj isPolynomial {
                   3458:       obj (0). eq
                   3459:       { /ans null def
                   3460:       } { obj getRing /rr set
                   3461:         [(CurrentRingp) rr] system_variable
                   3462:         [(orderMatrix)] system_variable /ans set
                   3463:       } ifelse
                   3464:       /getOrderMatrix.LLL goto
                   3465:     } { (getOrderMatrix: wrong argument.)  error } ifelse
                   3466:     /getOrderMatrix.LLL
                   3467:     /arg1 ans def
                   3468:   ] pop
                   3469:   popEnv
                   3470:   popVariables
                   3471:   arg1
                   3472: } def
                   3473:
                   3474:
                   3475: [(getOrderMatrix)
                   3476: [(obj getOrderMatrix m)
                   3477:  (array  m)
                   3478:  (getOrderMatrix obtains the order matrix from obj.)
                   3479:  (If obj is a polynomial, it returns the order matrix associated to)
                   3480:  (the polynomial.)
                   3481:  (If obj is an array, it returns an order matrix of an element.)
                   3482: ]] putUsages
                   3483:
                   3484: /nl {
                   3485:    10 $string$ data_conversion
                   3486: } def
                   3487: [(nl)
                   3488: [(nl is the newline character.)
                   3489:  $Example: [(You can break line) nl (here.)] cat message$
                   3490: ]] putUsages
                   3491:
                   3492: ;
                   3493:
                   3494:
                   3495:
                   3496:
                   3497:
                   3498:

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