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

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

1.1       maekawa     1: /; %%% prompt of the sm1
                      2: {
                      3:    [$PrintDollar$ 0] system_variable pop
                      4:    $sm1>$ print
                      5:    [$PrintDollar$ 1] system_variable pop
                      6: } def
                      7:
                      8: /?
                      9: {
                     10:    show_systemdictionary
                     11:    (------------ Use  show_user_dictionary  to see the user dictionary.---)
                     12:    message
                     13:    (------------ Use $keyWord$ usage  to see the usages. ---------------)
                     14:      message
                     15: } def
                     16:
                     17: /??
                     18: {
                     19:    show_systemdictionary
                     20:    (------------ system macros defined in the UserDictionary -----------)
                     21:      message
                     22:    show_user_dictionary  %% it should use other command
                     23:    (------------ Use $keyWord$ usage  to see the usages. ---------------)
                     24:      message
                     25: } def
                     26:
                     27: /::
                     28: {
                     29:    print  newline ;
                     30: } def
                     31:
                     32: /. {expand} def
                     33:
                     34: /, {   } def
                     35:
                     36: /false 0 def
                     37:
                     38: /expand {
                     39:   $poly$ data_conversion
                     40: } def
                     41:
                     42: /<< {  } def
                     43: />> {  } def
                     44:
                     45: % v1 v2 join
                     46: /join {
                     47:  /arg2 set /arg1 set
                     48:  [/v1 /v2] pushVariables
                     49:  /v1 arg1 def /v2 arg2 def
                     50:  [
                     51:    [v1 aload pop v2 aload pop] /arg1 set
                     52:  ] pop
                     53:  popVariables
                     54:  arg1
                     55: } def
                     56:
                     57: /n.map 0 def  /i.map 0 def /ar.map 0 def /res.map 0 def  %% declare variables
                     58: /map.old {  %% recursive
                     59:  /arg1.map set %%  arg1.map = {   }
                     60:  /arg2.map set %%  arg2.map = [   ]
                     61:  %%%debug: /arg1.map load print arg2.map print
                     62:  [n.map /com.map load i.map ar.map %% local variables.  Don't push com!
                     63:   %%It's better to use load for all variables.
                     64:  /com.map /arg1.map load def
                     65:  /ar.map arg2.map def %% set variables
                     66:  /n.map ar.map length 1 sub def
                     67:  [
                     68:    0 1 n.map {
                     69:      /i.map set
                     70:      << ar.map i.map get >> com.map
                     71:    } for
                     72:  ] /res.map set
                     73:  /ar.map set /i.map set /com.map set /n.map set ] pop %% pop local variables
                     74:  res.map %% push the result
                     75: } def
                     76:
                     77: /message {
                     78:    [$PrintDollar$ 0] system_variable pop
                     79:    print newline
                     80:    [$PrintDollar$ 1] system_variable pop
                     81: } def
                     82:
                     83: /messagen {
                     84:    [$PrintDollar$ 0] system_variable pop
                     85:    print
                     86:    [$PrintDollar$ 1] system_variable pop
                     87: } def
                     88:
                     89: /newline {
                     90:    [$PrintDollar$ 0] system_variable pop
                     91:    10 $string$ data_conversion print
                     92:    [$PrintDollar$ 1] system_variable pop
                     93: } def
                     94:
                     95: /pushVariables {
                     96:   { dup [ 3 1 roll load ] } map
                     97: } def
                     98:
                     99: /popVariables {
                    100:   % dup print
                    101:   { aload pop def } map pop
                    102: } def
                    103:
                    104:
                    105:
                    106: /timer {
                    107:   set_timer
                    108:   exec
                    109:   set_timer
                    110: } def
                    111:
                    112: /true 1 def
                    113:
                    114:
                    115:
                    116: %%% prompter
                    117: ;
                    118:
                    119:
                    120:
                    121:
                    122: %% dr.sm1 (Define Ring) 1994/9/25, 26
                    123:
                    124: (dr.sm1  Version 11/9,1994. ) message
                    125: %% n evenQ  bool
                    126: /evenQ {
                    127:   /arg1 set
                    128:   arg1 2 idiv  2 mul arg1 sub 0 eq
                    129:   { true }
                    130:   { false } ifelse
                    131: } def
                    132:
                    133: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                    134: /ring_of_polynomials {
                    135:   /arg1 set
                    136:   [/vars /n /i /xList /dList /param] pushVariables
                    137:   %dup print (-----) message
                    138:   [
                    139:      (mmLarger) (matrix) switch_function
                    140:      (mpMult)   (poly) switch_function
                    141:      (red@)     (module1) switch_function
                    142:      (groebner) (standard) switch_function
                    143:
                    144:      [arg1 to_records pop] /vars set
                    145:      vars length evenQ
                    146:      { }
                    147:      { vars [(PAD)] join /vars set }
                    148:      ifelse
                    149:      vars length 2 idiv /n set
                    150:      [ << n 1 sub >> -1 0
                    151:           { /i set
                    152:             vars i get
                    153:           } for
                    154:      ] /xList set
                    155:      [ << n 1 sub >> -1 0
                    156:           { /i set
                    157:             vars << i n add >> get
                    158:           } for
                    159:      ] /dList set
                    160:
                    161:      [(H)] xList join [(e)] join /xList set
                    162:      [(h)] dList join [(E)] join /dList set
                    163:      [0 %% dummy characteristic
                    164:       << xList length >> << xList length >> << xList length >>
                    165:                                             << xList length >>
                    166:       << xList length 1 sub >> << xList length >> << xList length >>
                    167:                                                   << xList length >>
                    168:      ] /param set
                    169:
                    170:      [xList dList param] /arg1 set
                    171:    ] pop
                    172:    popVariables
                    173:    arg1
                    174: } def
                    175:
                    176: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                    177: %% with no graduation and homogenization variables.
                    178: /ring_of_polynomials2 {
                    179:   /arg1 set
                    180:   [/vars /n /i /xList /dList /param] pushVariables
                    181:   %dup print (-----) message
                    182:   [
                    183:      (mmLarger) (matrix) switch_function
                    184:      (mpMult)   (poly) switch_function
                    185:      (red@)     (module1) switch_function
                    186:      (groebner) (standard) switch_function
                    187:
                    188:      [arg1 to_records pop] /vars set
                    189:      vars length evenQ
                    190:      { }
                    191:      { vars [(PAD)] join /vars set }
                    192:      ifelse
                    193:      vars length 2 idiv /n set
                    194:      [ << n 1 sub >> -1 0
                    195:           { /i set
                    196:             vars i get
                    197:           } for
                    198:      ] /xList set
                    199:      [ << n 1 sub >> -1 0
                    200:           { /i set
                    201:             vars << i n add >> get
                    202:           } for
                    203:      ] /dList set
                    204:
                    205:      [0 %% dummy characteristic
                    206:       << xList length >> << xList length >> << xList length >>
                    207:                                             << xList length >>
                    208:       << xList length >> << xList length >> << xList length >>
                    209:                                             << xList length >>
                    210:      ] /param set
                    211:
                    212:      [xList dList param] /arg1 set
                    213:    ] pop
                    214:    popVariables
                    215:    arg1
                    216: } def
                    217:
                    218: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                    219: %% with no homogenization variables.
                    220: /ring_of_polynomials3 {
                    221:   /arg1 set
                    222:   [/vars /n /i /xList /dList /param] pushVariables
                    223:   %dup print (-----) message
                    224:   [
                    225:      (mmLarger) (matrix) switch_function
                    226:      (mpMult)   (poly) switch_function
                    227:      (red@)     (module1) switch_function
                    228:      (groebner) (standard) switch_function
                    229:
                    230:      [arg1 to_records pop] /vars set
                    231:      vars length evenQ
                    232:      { }
                    233:      { vars [(PAD)] join /vars set }
                    234:      ifelse
                    235:      vars length 2 idiv /n set
                    236:      [ << n 1 sub >> -1 0
                    237:           { /i set
                    238:             vars i get
                    239:           } for
                    240:      ] /xList set
                    241:      xList [(e)] join /xList set
                    242:      [ << n 1 sub >> -1 0
                    243:           { /i set
                    244:             vars << i n add >> get
                    245:           } for
                    246:      ] /dList set
                    247:      dList [(E)] join /dList set
                    248:
                    249:      [0 %% dummy characteristic
                    250:       << xList length >> << xList length >> << xList length >>
                    251:                                             << xList length >>
                    252:       << xList length >> << xList length >> << xList length >>
                    253:                                             << xList length >>
                    254:      ] /param set
                    255:
                    256:      [xList dList param] /arg1 set
                    257:    ] pop
                    258:    popVariables
                    259:    arg1
                    260: } def
                    261:
                    262: /ring_of_differential_operators {
                    263:   /arg1 set
                    264:   [/vars /n /i /xList /dList /param] pushVariables
                    265:   [
                    266:      (mmLarger) (matrix) switch_function
                    267:      (mpMult)   (diff) switch_function
                    268:      (red@)     (module1) switch_function
                    269:      (groebner) (standard) switch_function
                    270:
                    271:      [arg1 to_records pop] /vars set %[x y z]
                    272:      vars reverse /xList set         %[z y x]
                    273:      vars {(D) 2 1 roll 2 cat_n} map
                    274:      reverse /dList set              %[Dz Dy Dx]
                    275:      [(H)] xList join [(e)] join /xList set
                    276:      [(h)] dList join [(E)] join /dList set
                    277:      [0 1 1 1 << xList length >>
                    278:         1 1 1 << xList length 1 sub >> ] /param set
                    279:      [ xList dList param ] /arg1 set
                    280:   ] pop
                    281:   popVariables
                    282:   arg1
                    283: } def
                    284:
                    285: /ring_of_differential_operators3 {
                    286: %% with no homogenization variables.
                    287:   /arg1 set
                    288:   [/vars /n /i /xList /dList /param] pushVariables
                    289:   [
                    290:      (mmLarger) (matrix) switch_function
                    291:      (mpMult)   (diff) switch_function
                    292:      (red@)     (module1) switch_function
                    293:      (groebner) (standard) switch_function
                    294:
                    295:      [arg1 to_records pop] /vars set %[x y z]
                    296:      vars reverse /xList set         %[z y x]
                    297:      vars {(D) 2 1 roll 2 cat_n} map
                    298:      reverse /dList set              %[Dz Dy Dx]
                    299:      xList [(e)] join /xList set
                    300:      dList [(E)] join /dList set
                    301:      [0 0 0 0 << xList length >>
                    302:         0 0 0 << xList length 1 sub >> ] /param set
                    303:      [ xList dList param ] /arg1 set
                    304:   ] pop
                    305:   popVariables
                    306:   arg1
                    307: } def
                    308:
                    309: /ring_of_q_difference_operators {
                    310:   /arg1 set
                    311:   [/vars /n /i /xList /dList /param] pushVariables
                    312:   [
                    313:      (mmLarger) (qmatrix) switch_function
                    314:      (mpMult)   (diff) switch_function
                    315:      (red@)     (qmodule1) switch_function
                    316:      (groebner) (standard) switch_function
                    317:
                    318:      [arg1 to_records pop] /vars set %[x y z]
                    319:      vars reverse /xList set         %[z y x]
                    320:      vars {(Q) 2 1 roll 2 cat_n} map
                    321:      reverse /dList set              %[Dz Dy Dx]
                    322:      [(q)] xList join [(e)] join /xList set
                    323:      [(h)] dList join [(E)] join /dList set
                    324:      [0 1 << xList length >> << xList length >> << xList length >>
                    325:         1 << xList length 1 sub >> << xList length >> << xList length >> ]
                    326:      /param set
                    327:      [ xList dList param ] /arg1 set
                    328:   ] pop
                    329:   popVariables
                    330:   arg1
                    331: } def
                    332:
                    333: /ring_of_q_difference_operators3 {
                    334: %% with no homogenization and q variables.
                    335:   /arg1 set
                    336:   [/vars /n /i /xList /dList /param] pushVariables
                    337:   [
                    338:      (mmLarger) (qmatrix) switch_function
                    339:      (mpMult)   (diff) switch_function
                    340:      (red@)     (qmodule1) switch_function
                    341:      (groebner) (standard) switch_function
                    342:
                    343:      [arg1 to_records pop] /vars set %[x y z]
                    344:      vars reverse /xList set         %[z y x]
                    345:      vars {(Q) 2 1 roll 2 cat_n} map
                    346:      reverse /dList set              %[Dz Dy Dx]
                    347:      xList  [(e)] join /xList set
                    348:      dList  [(E)] join /dList set
                    349:      [0 0 << xList length >> << xList length >> << xList length >>
                    350:         0 << xList length 1 sub >> << xList length >> << xList length >> ]
                    351:      /param set
                    352:      [ xList dList param ] /arg1 set
                    353:   ] pop
                    354:   popVariables
                    355:   arg1
                    356: } def
                    357:
                    358: /reverse {
                    359:   /arg1 set
                    360:   arg1 length 1 lt
                    361:   { [ ] }
                    362:   {
                    363:     [
                    364:      <<  arg1 length 1 sub >> -1 0
                    365:      {
                    366:         arg1 2 1 roll get
                    367:       } for
                    368:      ]
                    369:    } ifelse
                    370: } def
                    371:
                    372: /memberQ {
                    373: %% a set0 memberQ bool
                    374:   /arg2 set  /arg1 set
                    375:   [/a /set0 /flag /i ] pushVariables
                    376:   [
                    377:      /a arg1 def  /set0 arg2 def
                    378:      /flag 0 def
                    379:      0 1 << set0 length 1 sub >>
                    380:      {
                    381:         /i set
                    382:         << set0 i get >> a eq
                    383:         {
                    384:            /flag 1 def
                    385:          }
                    386:         { }
                    387:         ifelse
                    388:      } for
                    389:   ] pop
                    390:   /arg1 flag def
                    391:   popVariables
                    392:   arg1
                    393: } def
                    394:
                    395: /transpose {
                    396: %% mat transpose  mat2
                    397:   /arg1 set
                    398:   [/i /j /m /n /flat /mat] pushVariables
                    399:   [
                    400:     /mat arg1 def
                    401:     /n mat length def
                    402:     /m mat 0 get length def
                    403:
                    404:     [
                    405:       0 1 << n 1 sub >>
                    406:       {
                    407:          /i set
                    408:          mat i get aload pop
                    409:       } for
                    410:     ] /flat set
                    411:     %% [[1 2] [3 4]] ---> flat == [1 2 3 4]
                    412:
                    413:     [
                    414:        0 1 << m 1 sub >>
                    415:        {
                    416:           /i set
                    417:           [
                    418:              0 1 << n 1 sub >>
                    419:              {
                    420:                 /j set
                    421:                 flat
                    422:                 << j m mul >> i add
                    423:                 get
                    424:              } for
                    425:            ]
                    426:         } for
                    427:      ] /arg1 set
                    428:    ] pop
                    429:    popVariables
                    430:    arg1
                    431: } def
                    432:
                    433:
                    434: /getPerm {
                    435: %% old new getPerm perm
                    436:   /arg2 set /arg1 set
                    437:   [/old /new /i /j /p] pushVariables
                    438:   [
                    439:     /old arg1 def
                    440:     /new arg2 def
                    441:     [
                    442:         /p old length def
                    443:         0 1 << p 1 sub >>
                    444:         {
                    445:            /i set
                    446:            0 1 << p 1 sub >>
                    447:            {
                    448:               /j set
                    449:               old i get
                    450:               new j get
                    451:               eq
                    452:               { j }
                    453:               {   } ifelse
                    454:             } for
                    455:          } for
                    456:      ] /arg1 set
                    457:    ] pop
                    458:    popVariables
                    459:    arg1
                    460: } def
                    461:
                    462: /permuteOrderMatrix {
                    463: %% order perm puermuteOrderMatrix newOrder
                    464:   /arg2 set /arg1 set
                    465:   [/order /perm /newOrder /k ] pushVariables
                    466:   [
                    467:     /order arg1 def
                    468:     /perm arg2 def
                    469:     order transpose /order set
                    470:     order 1 copy /newOrder set pop
                    471:
                    472:     0 1 << perm length 1 sub >>
                    473:     {
                    474:        /k set
                    475:        newOrder << perm k get >> << order k get >> put
                    476:     } for
                    477:     newOrder transpose /newOrder set
                    478:   ] pop
                    479:   /arg1 newOrder def
                    480:   popVariables
                    481:   arg1
                    482: } def
                    483:
                    484:
                    485:
                    486: /complement {
                    487: %% set0 universe complement compl
                    488:   /arg2 set /arg1 set
                    489:   [/set0 /universe /compl /i] pushVariables
                    490:    /set0 arg1 def  /universe arg2 def
                    491:   [
                    492:      0 1 << universe length 1 sub >>
                    493:      {
                    494:         /i set
                    495:         << universe i get >> set0 memberQ
                    496:         {   }
                    497:         { universe i get }
                    498:         ifelse
                    499:       } for
                    500:    ] /arg1 set
                    501:    popVariables
                    502:    arg1
                    503: } def
                    504:
                    505:
                    506: %%% from order.sm1
                    507:
                    508: %% size i evec [0 0 ... 0 1 0 ... 0]
                    509: /evec {
                    510:  /arg2 set /arg1 set
                    511:  [/size /iii] pushVariables
                    512:  /size arg1 def  /iii arg2 def
                    513:  [
                    514:    0 1 << size 1 sub >>
                    515:    {
                    516:       iii eq
                    517:       {  1 }
                    518:       {  0 }
                    519:       ifelse
                    520:    } for
                    521:   ] /arg1 set
                    522:   popVariables
                    523:   arg1
                    524: } def
                    525:
                    526: %% size i evec_neg [0 0 ... 0 -1 0 ... 0]
                    527: /evec_neg {
                    528:  /arg2 set /arg1 set
                    529:  [/size /iii] pushVariables
                    530:  /size arg1 def  /iii arg2 def
                    531:  [
                    532:    0 1 << size 1 sub >>
                    533:    {
                    534:       iii eq
                    535:       {  -1 }
                    536:       {  0 }
                    537:       ifelse
                    538:    } for
                    539:   ] /arg1 set
                    540:   popVariables
                    541:   arg1
                    542: } def
                    543:
                    544:
                    545: %% size i j e_ij  << matrix e(i,j) >>
                    546: /e_ij {
                    547:   /arg3 set /arg2 set /arg1 set
                    548:   [/size /k /i /j] pushVariables
                    549:   [
                    550:     /size arg1 def  /i arg2 def /j arg3 def
                    551:     [ 0 1 << size 1 sub >>
                    552:       {
                    553:          /k set
                    554:          k i eq
                    555:          { size j evec }
                    556:          {
                    557:             k j eq
                    558:             { size i evec }
                    559:             { size k evec }
                    560:             ifelse
                    561:           } ifelse
                    562:        } for
                    563:      ] /arg1 set
                    564:    ] pop
                    565:    popVariables
                    566:    arg1
                    567: } def
                    568:
                    569:
                    570: %% size i j d_ij  << matrix E_{ij} >>
                    571: /d_ij {
                    572:   /arg3 set /arg2 set /arg1 set
                    573:   [/size /k /i /j] pushVariables
                    574:   [
                    575:     /size arg1 def  /i arg2 def /j arg3 def
                    576:     [ 0 1 << size 1 sub >>
                    577:       {
                    578:          /k set
                    579:          k i eq
                    580:          { size j evec }
                    581:          {
                    582:             [ 0 1 << size 1 sub >> { pop 0} for ]
                    583:           } ifelse
                    584:        } for
                    585:      ] /arg1 set
                    586:    ] pop
                    587:    popVariables
                    588:    arg1
                    589: } def
                    590:
                    591: %% size matid << id matrix  >>
                    592: /matid {
                    593:   /arg1 set
                    594:   [/size /k ] pushVariables
                    595:   [
                    596:     /size arg1 def
                    597:     [ 0 1 << size 1 sub >>
                    598:       {
                    599:          /k set
                    600:          size k evec
                    601:        } for
                    602:      ] /arg1 set
                    603:    ] pop
                    604:    popVariables
                    605:    arg1
                    606: } def
                    607:
                    608:
                    609: %% m1 m2 oplus
                    610: /oplus {
                    611:   /arg2 set /arg1 set
                    612:   [/m1 /m2 /n /m  /k ] pushVariables
                    613:   [
                    614:     /m1 arg1 def  /m2 arg2 def
                    615:     m1 length /n set
                    616:     m2 length /m set
                    617:     [
                    618:       0 1 << n m add 1 sub >>
                    619:       {
                    620:         /k set
                    621:         k n lt
                    622:         {
                    623:             << m1 k get >> << m -1 evec >> join
                    624:         }
                    625:         {
                    626:             << n -1 evec >> << m2 << k n sub >> get >> join
                    627:         } ifelse
                    628:       } for
                    629:      ] /arg1 set
                    630:    ] pop
                    631:    popVariables
                    632:    arg1
                    633: } def
                    634:
                    635: %%%%%%%%%%%%%%%%%%%%%%%
                    636:
                    637: /eliminationOrderTemplate  { %% esize >= 1
                    638: %% if esize == 0, it returns reverse lexicographic order.
                    639: %%  m esize eliminationOrderTemplate mat
                    640:   /arg2 set /arg1 set
                    641:   [/m  /esize /m1 /m2 /k ] pushVariables
                    642:   [
                    643:     /m arg1 def  /esize arg2 def
                    644:     /m1 m esize sub 1 sub def
                    645:     /m2 esize 1 sub def
                    646:      [esize 0 gt
                    647:       {
                    648:        [1 1 esize
                    649:         { pop 1 } for
                    650:         esize 1 << m 1 sub >>
                    651:         { pop 0 } for
                    652:        ]  %% 1st vector
                    653:       }
                    654:       { } ifelse
                    655:
                    656:       m esize gt
                    657:       {
                    658:        [1 1  esize
                    659:         { pop 0 } for
                    660:         esize 1 << m 1 sub >>
                    661:         { pop 1 } for
                    662:        ]  %% 2nd vector
                    663:       }
                    664:       { } ifelse
                    665:
                    666:       m1 0 gt
                    667:       {
                    668:          m 1 sub -1 << m m1 sub >>
                    669:          {
                    670:               /k set
                    671:               m  k  evec_neg
                    672:          } for
                    673:       }
                    674:       { } ifelse
                    675:
                    676:       m2 0 gt
                    677:       {
                    678:          << esize 1 sub >> -1 1
                    679:          {
                    680:               /k set
                    681:               m  k  evec_neg
                    682:          } for
                    683:       }
                    684:       { } ifelse
                    685:
                    686:     ] /arg1 set
                    687:    ] pop
                    688:    popVariables
                    689:    arg1
                    690: } def
                    691:
                    692: /elimination_order {
                    693: %% [x-list d-list params]  (x,y,z) elimination_order
                    694: %%  vars                    evars
                    695: %% [x-list d-list params order]
                    696:   /arg2 set  /arg1 set
                    697:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    698:   /vars arg1 def /evars [arg2 to_records pop] def
                    699:   [
                    700:     /univ vars 0 get reverse
                    701:           vars 1 get reverse join
                    702:     def
                    703:
                    704:     << univ length 2 sub >>
                    705:     << evars length >>
                    706:     eliminationOrderTemplate /order set
                    707:
                    708:     [[1]] order oplus [[1]] oplus /order set
                    709:
                    710:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    711:
                    712:     /compl
                    713:       [univ 0 get] evars join evars univ0 complement join
                    714:     def
                    715:     compl univ
                    716:     getPerm /perm set
                    717:     %%perm :: univ :: compl ::
                    718:
                    719:     order perm permuteOrderMatrix /order set
                    720:
                    721:
                    722:     vars [order] join /arg1 set
                    723:   ] pop
                    724:   popVariables
                    725:   arg1
                    726: } def
                    727:
                    728: /elimination_order2 {
                    729: %% [x-list d-list params]  (x,y,z) elimination_order
                    730: %%  vars                    evars
                    731: %% [x-list d-list params order]
                    732: %% with no graduation and homogenization variables.
                    733:   /arg2 set  /arg1 set
                    734:   [/vars /evars /univ /order /perm /compl] pushVariables
                    735:   /vars arg1 def /evars [arg2 to_records pop] def
                    736:   [
                    737:     /univ vars 0 get reverse
                    738:           vars 1 get reverse join
                    739:     def
                    740:
                    741:     << univ length  >>
                    742:     << evars length >>
                    743:     eliminationOrderTemplate /order set
                    744:     /compl
                    745:       evars << evars univ complement >> join
                    746:     def
                    747:     compl univ
                    748:     getPerm /perm set
                    749:     %%perm :: univ :: compl ::
                    750:
                    751:     order perm permuteOrderMatrix /order set
                    752:
                    753:     vars [order] join /arg1 set
                    754:   ] pop
                    755:   popVariables
                    756:   arg1
                    757: } def
                    758:
                    759:
                    760: /elimination_order3 {
                    761: %% [x-list d-list params]  (x,y,z) elimination_order
                    762: %%  vars                    evars
                    763: %% [x-list d-list params order]
                    764:   /arg2 set  /arg1 set
                    765:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    766:   /vars arg1 def /evars [arg2 to_records pop] def
                    767:   [
                    768:     /univ vars 0 get reverse
                    769:           vars 1 get reverse join
                    770:     def
                    771:
                    772:     << univ length 1 sub >>
                    773:     << evars length >>
                    774:     eliminationOrderTemplate /order set
                    775:
                    776:     [[1]] order oplus  /order set
                    777:
                    778:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    779:
                    780:     /compl
                    781:       [univ 0 get] evars join evars univ0 complement join
                    782:     def
                    783:     compl univ
                    784:     getPerm /perm set
                    785:     %%perm :: univ :: compl ::
                    786:
                    787:     order perm permuteOrderMatrix /order set
                    788:
                    789:     vars [order] join /arg1 set
                    790:   ] pop
                    791:   popVariables
                    792:   arg1
                    793: } def
                    794:
                    795:
                    796: /define_ring {
                    797: %[  (x,y,z) ring_of_polynominals
                    798: %   (x,y) elimination_order
                    799: %   17
                    800: %] define_ring
                    801:    /arg1 set
                    802:    [/rp /param /foo] pushVariables
                    803:    [/rp arg1 def
                    804:     [
                    805:       rp 0 get 0 get
                    806:       rp 0 get 1 get
                    807:       rp 0 get 2 get /param set
                    808:       param 0 << rp 1 get >> put
                    809:       param
                    810:       rp 0 get 3 get
                    811:     ]  /foo set
                    812:     foo aload pop set_up_ring@
                    813:    ] pop
                    814:    popVariables
                    815: } def
                    816:
                    817: /defineTests1 {
                    818: /test {
                    819:    [[1 2 3]
                    820:     [0 1 0]
                    821:     [0 1 2]]
                    822:    [0 2 1] permuteOrderMatrix ::
                    823: } def
                    824:
                    825: /test2 { (x,y,z) ring_of_polynomials (z,y) elimination_order /ans set } def
                    826:
                    827: /test3 {
                    828:  [ (x,y,z) ring_of_polynomials
                    829:   (x,y) elimination_order
                    830:   17
                    831:  ] define_ring
                    832: } def
                    833:
                    834: /test4 {
                    835:  [ (x,y,z) ring_of_polynomials
                    836:   ( ) elimination_order
                    837:   17
                    838:  ] define_ring
                    839: } def
                    840:
                    841: } def
                    842:
                    843: %% misterious bug  (x,y) miss
                    844: /miss {
                    845:   /arg1 set
                    846:   %[/vars /n /i /xList /dList /param] pushVariables
                    847:   [/vars /i] pushVariables
                    848:   [  arg1 print
                    849:      [arg1 to_records pop] /vars set
                    850:
                    851:    ] pop
                    852:    dup print
                    853:    popVariables
                    854:    arg1
                    855: } def
                    856:
                    857:
                    858: /lexicographicOrderTemplate {
                    859: % size lexicographicOrderTemplate matrix
                    860:   /arg1 set
                    861:   [/k /size] pushVariables
                    862:   [
                    863:     /size arg1 def
                    864:     [ 0 1 << size 1 sub >>
                    865:       {
                    866:          /k set
                    867:          size k evec
                    868:        } for
                    869:     ] /arg1 set
                    870:   ] pop
                    871:   popVariables
                    872:   arg1
                    873: } def
                    874:
                    875: /lexicographic_order {
                    876: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    877: %%  vars                    evars
                    878: %% [x-list d-list params order]
                    879:   /arg2 set  /arg1 set
                    880:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    881:   /vars arg1 def /evars [arg2 to_records pop] def
                    882:   [
                    883:     /univ vars 0 get reverse
                    884:           vars 1 get reverse join
                    885:     def
                    886:
                    887:     << univ length 2 sub >>
                    888:     lexicographicOrderTemplate /order set
                    889:
                    890:     [[1]] order oplus [[1]] oplus /order set
                    891:
                    892:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    893:
                    894:     /compl
                    895:       [univ 0 get] evars join evars univ0 complement join
                    896:     def
                    897:     compl univ
                    898:     getPerm /perm set
                    899:     %%perm :: univ :: compl ::
                    900:
                    901:     order perm permuteOrderMatrix /order set
                    902:
                    903:     vars [order] join /arg1 set
                    904:   ] pop
                    905:   popVariables
                    906:   arg1
                    907: } def
                    908:
                    909: /lexicographic_order2 {
                    910: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    911: %%  vars                    evars
                    912: %% [x-list d-list params order]
                    913: %% with no graduation and homogenization variables
                    914:   /arg2 set  /arg1 set
                    915:   [/vars /evars /univ /order /perm /compl] pushVariables
                    916:   /vars arg1 def /evars [arg2 to_records pop] def
                    917:   [
                    918:     /univ vars 0 get reverse
                    919:           vars 1 get reverse join
                    920:     def
                    921:
                    922:     << univ length  >>
                    923:     lexicographicOrderTemplate /order set
                    924:
                    925:     /compl
                    926:       evars << evars univ complement >> join
                    927:     def
                    928:     compl univ
                    929:     getPerm /perm set
                    930:
                    931:     order perm permuteOrderMatrix /order set
                    932:
                    933:     vars [order] join /arg1 set
                    934:   ] pop
                    935:   popVariables
                    936:   arg1
                    937: } def
                    938:
                    939: /lexicographic_order3 {
                    940: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    941: %%  vars                    evars
                    942: %% [x-list d-list params order]
                    943: %% with no homogenization variable.
                    944:   /arg2 set  /arg1 set
                    945:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    946:   /vars arg1 def /evars [arg2 to_records pop] def
                    947:   [
                    948:     /univ vars 0 get reverse
                    949:           vars 1 get reverse join
                    950:     def
                    951:
                    952:     << univ length 1 sub >>
                    953:     lexicographicOrderTemplate /order set
                    954:
                    955:     [[1]] order oplus /order set
                    956:
                    957:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    958:
                    959:     /compl
                    960:       [univ 0 get] evars join evars univ0 complement join
                    961:     def
                    962:     compl univ
                    963:     getPerm /perm set
                    964:     %%perm :: univ :: compl ::
                    965:
                    966:     order perm permuteOrderMatrix /order set
                    967:
                    968:     vars [order] join /arg1 set
                    969:   ] pop
                    970:   popVariables
                    971:   arg1
                    972: } def
                    973:
                    974: %%%%%%   add_rings %%%%%%%%%%%%%% 10/5
                    975:
                    976: /graded_reverse_lexicographic_order {
                    977:   (  ) elimination_order
                    978: } def
                    979:
                    980:
                    981: /getX {
                    982: %% param [1|2|3|4] getX [var-lists]  ;  1->c,2->l,3->m,4->n
                    983:   /arg2 set /arg1 set
                    984:   [/k /param /func /low /top] pushVariables
                    985:   [
                    986:      /param arg1 def  /func arg2 def
                    987:      func 1 eq
                    988:      {
                    989:        /low 0 def
                    990:      }
                    991:      {
                    992:        /low << param 2 get >> << func 1 sub >> get def
                    993:      } ifelse
                    994:      /top << param 2 get >> << func 4 add >> get 1 sub def
                    995:      [
                    996:        low 1 top
                    997:        {
                    998:            /k set
                    999:           param 0 get k get
                   1000:         } for
                   1001:      ] /arg1 set
                   1002:   ] pop
                   1003:   popVariables
                   1004:   arg1
                   1005: } def
                   1006:
                   1007: /getD {
                   1008: %% param [1|2|3|4] getD [var-lists]  ;  1->c,2->l,3->m,4->n
                   1009:   /arg2 set /arg1 set
                   1010:   [/k /param /func /low /top] pushVariables
                   1011:   [
                   1012:      /param arg1 def  /func arg2 def
                   1013:      func 1 eq
                   1014:      {
                   1015:        /low 0 def
                   1016:      }
                   1017:      {
                   1018:        /low << param 2 get >> << func 1 sub >> get def
                   1019:      } ifelse
                   1020:      /top << param 2 get >> << func 4 add >> get 1 sub def
                   1021:      [
                   1022:        low 1 top
                   1023:        {
                   1024:            /k set
                   1025:           param 1 get k get
                   1026:         } for
                   1027:      ] /arg1 set
                   1028:   ] pop
                   1029:   popVariables
                   1030:   arg1
                   1031: } def
                   1032:
                   1033: /getXV {
                   1034: %% param [1|2|3|4] getXV [var-lists]  ;  1->c,2->l,3->m,4->n
                   1035:   /arg2 set /arg1 set
                   1036:   [/k /param /func /low /top] pushVariables
                   1037:   [
                   1038:      /param arg1 def  /func arg2 def
                   1039:      /low << param 2 get >> << func 4 add >> get def
                   1040:      /top << param 2 get >>  func get 1 sub def
                   1041:      [
                   1042:        low 1 top
                   1043:        {
                   1044:            /k set
                   1045:           param 0 get k get
                   1046:         } for
                   1047:      ] /arg1 set
                   1048:   ] pop
                   1049:   popVariables
                   1050:   arg1
                   1051: } def
                   1052:
                   1053: /getDV {
                   1054: %% param [1|2|3|4] getDV [var-lists]  ;  1->c,2->l,3->m,4->n
                   1055:   /arg2 set /arg1 set
                   1056:   [/k /param /func /low /top] pushVariables
                   1057:   [
                   1058:      /param arg1 def  /func arg2 def
                   1059:      /low << param 2 get >> << func 4 add >> get def
                   1060:      /top << param 2 get >>  func get 1 sub def
                   1061:      [
                   1062:        low 1 top
                   1063:        {
                   1064:            /k set
                   1065:           param 1 get k get
                   1066:         } for
                   1067:      ] /arg1 set
                   1068:   ] pop
                   1069:   popVariables
                   1070:   arg1
                   1071: } def
                   1072:
                   1073: /reNaming {
                   1074:   %% It also changes oldx2 and oldd2, which are globals.
                   1075:   /arg1 set
                   1076:   [/i /j /new /count /ostr /k] pushVariables
                   1077:   [
                   1078:     /new arg1 def
                   1079:     /count 0 def
                   1080:     0 1 << new length 1 sub >> {
                   1081:        /i set
                   1082:       << i 1 add >> 1 << new length 1 sub >> {
                   1083:           /j set
                   1084:           << new i get >> << new j get >> eq
                   1085:           {
                   1086:              new j get /ostr set
                   1087:              (The two rings have the same name :) messagen
                   1088:              new i get messagen (.) message
                   1089:              (The name ) messagen
                   1090:              new i get messagen ( is changed into ) messagen
                   1091:              new j << new i get << 48 count add $string$ data_conversion >>
                   1092:                       2 cat_n >> put
                   1093:              new j get messagen (.) message
                   1094:              /oldx2 ostr << new j get >> reNaming2
                   1095:              /oldd2 ostr << new j get >> reNaming2
                   1096:              /count count 1 add def
                   1097:            }
                   1098:            { }
                   1099:            ifelse
                   1100:       } for
                   1101:     } for
                   1102:     /arg1 new def
                   1103:   ] pop
                   1104:   popVariables
                   1105:   arg1
                   1106: } def
                   1107:
                   1108: /reNaming2 {
                   1109:   %% array oldString newString reNaming2
                   1110:   %% /aa (x) (y) reNaming2
                   1111:   /arg3 set /arg2 set /arg1 set
                   1112:   [/array /oldString /newString /k] pushVariables
                   1113:   [
                   1114:     /array arg1 def /oldString arg2 def /newString arg3 def
                   1115:       0 1 << array load length 1 sub >>
                   1116:       {
                   1117:          /k set
                   1118:          << array load k get  >> oldString eq
                   1119:          {
                   1120:             array load k newString put
                   1121:           }
                   1122:           { } ifelse
                   1123:       } for
                   1124:    ] pop
                   1125:    popVariables
                   1126: } def
                   1127:
                   1128: /add_rings {
                   1129:   /arg2 set /arg1 set
                   1130:   [/param1 /param2
                   1131:    /newx /newd  /newv
                   1132:    /k /const /od1 /od2 /od
                   1133:    /oldx2 /oldd2  % these will be changed in reNaming.
                   1134:    /oldv
                   1135:   ] pushVariables
                   1136:   [
                   1137:      /param1 arg1 def /param2 arg2 def
                   1138:    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   1139:      /newx
                   1140:        [ ]
                   1141:        param2 1 getX join  param1 1 getX join
                   1142:        param2 1 getXV join param1 1 getXV join
                   1143:
                   1144:        param2 2 getX join  param1 2 getX join
                   1145:        param2 2 getXV join param1 2 getXV join
                   1146:
                   1147:        param2 3 getX join  param1 3 getX join
                   1148:        param2 3 getXV join param1 3 getXV join
                   1149:
                   1150:        param2 4 getX join  param1 4 getX join
                   1151:        param2 4 getXV join param1 4 getXV join
                   1152:      def
                   1153:      /newd
                   1154:        [ ]
                   1155:        param2 1 getD join  param1 1 getD join
                   1156:        param2 1 getDV join param1 1 getDV join
                   1157:
                   1158:        param2 2 getD join  param1 2 getD join
                   1159:        param2 2 getDV join param1 2 getDV join
                   1160:
                   1161:        param2 3 getD join  param1 3 getD join
                   1162:        param2 3 getDV join param1 3 getDV join
                   1163:
                   1164:        param2 4 getD join  param1 4 getD join
                   1165:        param2 4 getDV join param1 4 getDV join
                   1166:      def
                   1167:
                   1168:      /newv  newx newd join def
                   1169:      /oldx2 param2 0 get def  /oldd2 param2 1 get def
                   1170:      /oldx2 oldx2 {1 copy 2 1 roll pop} map def
                   1171:      /oldd2 oldd2 {1 copy 2 1 roll pop} map def
                   1172:      /newv newv reNaming def
                   1173:
                   1174:      /newx [
                   1175:        0 1 << newv length 2 idiv 1 sub >>
                   1176:        {
                   1177:           /k set
                   1178:           newv k get
                   1179:        } for
                   1180:      ] def
                   1181:      /newd [
                   1182:        0 1 << newv length 2 idiv 1 sub >>
                   1183:        {
                   1184:           /k set
                   1185:           newv << newv length 2 idiv k add >> get
                   1186:        } for
                   1187:      ] def
                   1188:      /const [
                   1189:         << param1 2 get 0 get >>
                   1190:         << param1 2 get 1 get  param2 2 get 1 get add >>
                   1191:         << param1 2 get 2 get  param2 2 get 2 get add >>
                   1192:         << param1 2 get 3 get  param2 2 get 3 get add >>
                   1193:         << param1 2 get 4 get  param2 2 get 4 get add >>
                   1194:         << param1 2 get 5 get  param2 2 get 5 get add >>
                   1195:         << param1 2 get 6 get  param2 2 get 6 get add >>
                   1196:         << param1 2 get 7 get  param2 2 get 7 get add >>
                   1197:         << param1 2 get 8 get  param2 2 get 8 get add >>
                   1198:     ] def
                   1199:
                   1200:     /od1 param1 3 get def /od2 param2 3 get def
                   1201:     od1 od2 oplus /od set
                   1202:
                   1203:     %%oldx2 :: oldd2 ::
                   1204:     << param1 0 get reverse >> << param1 1 get reverse >> join
                   1205:     << oldx2 reverse >> << oldd2 reverse >> join
                   1206:     join /oldv set
                   1207:
                   1208:
                   1209:     od << oldv << newx reverse newd reverse join >> getPerm >>
                   1210:     permuteOrderMatrix /od set
                   1211:
                   1212:      /arg1 [newx newd const od] def
                   1213:   ] pop
                   1214:   popVariables
                   1215:   arg1
                   1216: } def
                   1217:
                   1218:
                   1219: /test5 {
                   1220:   (t) ring_of_polynomials ( ) elimination_order /r1 set
                   1221:   (x) ring_of_differential_operators (Dx) elimination_order /r2 set
                   1222:   r2 r1 add_rings
                   1223: } def
                   1224:
                   1225: /test6 {
                   1226:   (H,h) ring_of_polynomials2 (H,h) lexicographic_order2 /r0 set
                   1227:   (x,y,z) ring_of_polynomials2 (x,y) elimination_order2 /r1 set
                   1228:   (t) ring_of_differential_operators3 (Dt) elimination_order3 /r2 set
                   1229:   [r2 r1 add_rings r0 add_rings 0] define_ring
                   1230: } def
                   1231:
                   1232: /test7 {
                   1233:   (H,h) ring_of_polynomials2 (H,h) lexicographic_order2 /r0 set
                   1234:   (a,b,c,cp) ring_of_polynomials2 ( ) elimination_order2 /r1 set
                   1235:   (x,y) ring_of_differential_operators3 (Dx,Dy) elimination_order3 /r2 set
                   1236:   [r2 r1 add_rings r0 add_rings 0] define_ring
                   1237:   [(Dx (x Dx + c-1) - (x Dx + y Dy + a) (x Dx + y Dy + b)).
                   1238:    (Dy (y Dy + cp-1) - (x Dx + y Dy + a) (x Dx + y Dy + b)).] /ff set
                   1239:   ff {[[$h$. $1$.]] replace} map homogenize /ff set
                   1240: } def
                   1241: %%%% end of add_rings
                   1242:
                   1243: %%%%%%%% usages %%%%%%%%%%%%%%%%
                   1244: /@.usages [  ] def
                   1245: /putUsages {
                   1246:    /arg1 set
                   1247:    /@.usages @.usages [ arg1 ] join def
                   1248: } def
                   1249:
                   1250: /showKeywords {
                   1251:   @.usages { 0 get } map print ( ) message
                   1252: } def
                   1253:
                   1254: /Usage {
                   1255:   /arg1 set
                   1256:   [/name /flag /n /k /slist /m /i] pushVariables
                   1257:   [
                   1258:     /name arg1 def
                   1259:     /flag true def
                   1260:    @.usages length /n set
                   1261:    0 1 << n 1 sub >>
                   1262:    {
                   1263:       /k set
                   1264:       name << @.usages k get 0 get >> eq
                   1265:       {
                   1266:         /slist @.usages k get 1 get def
                   1267:         /m slist length def
                   1268:         0 1 << m 1 sub >> {
                   1269:           /i set
                   1270:           slist i get message
                   1271:         } for
                   1272:         /flag false def
                   1273:       }
                   1274:       { }
                   1275:       ifelse
                   1276:    } for
                   1277:
                   1278:    flag
                   1279:    {name usage}
                   1280:    { }
                   1281:    ifelse
                   1282:    ] pop
                   1283:    popVariables
                   1284: } def
                   1285:
                   1286:
                   1287: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   1288:
                   1289:
                   1290: [(swap01) [
                   1291:    $[ .... ] swap01 [....]$
                   1292:    $Examples: [(x,y) ring_of_polynomials (x) elmination_order 0] swap01 $
                   1293:    $          define_ring$
                   1294: ]] putUsages
                   1295: %
                   1296: /swap01 {
                   1297:   /arg1 set
                   1298:   [/rg /ch ] pushVariables
                   1299:   [
                   1300:     arg1 0 get /rg set  % ring
                   1301:     arg1 1 get /ch set  % characteristics
                   1302:     [rg 0 get , rg 1 get , rg 2 get ,
                   1303:      << rg 3 get length >> 0 1 e_ij << rg 3 get >> mul ] /rg set
                   1304:     /arg1 [ rg ch ] def
                   1305:   ] pop
                   1306:   popVariables
                   1307:   arg1
                   1308: } def
                   1309:
                   1310: [(swap0k) [
                   1311:    $[ .... ] k swap0k [....]$
                   1312:    $Examples: [(x,y) ring_of_polynomials (x) elmination_order 0] 1 swap0k $
                   1313:    $          define_ring$
                   1314:    $swap01 == 1 swap0k$
                   1315: ]] putUsages
                   1316: %
                   1317: /swap0k {
                   1318:   /arg2 set
                   1319:   /arg1 set
                   1320:   [/rg /ch /kk] pushVariables
                   1321:   [
                   1322:     arg2 /kk set
                   1323:     arg1 0 get /rg set  % ring
                   1324:     arg1 1 get /ch set  % characteristics
                   1325:     [rg 0 get , rg 1 get , rg 2 get ,
                   1326:      << rg 3 get length >> 0 kk e_ij << rg 3 get >> mul ] /rg set
                   1327:     /arg1 [ rg ch ] def
                   1328:   ] pop
                   1329:   popVariables
                   1330:   arg1
                   1331: } def
                   1332:
                   1333:
                   1334: ;
                   1335: /toVectors {
                   1336:   { $array$ data_conversion } map
                   1337: } def
                   1338:
                   1339: /resolution {
                   1340:   /arg1 set
                   1341:   [/resol /gen /syz /maxLength] pushVariables
                   1342:   [
                   1343:     /gen arg1 0 get def
                   1344:     arg1 length 1 eq
                   1345:     { /maxLength -1 def }
                   1346:     { /maxLength arg1 1 get def }
                   1347:     ifelse
                   1348:     /resol [ ] def
                   1349:     {
                   1350:       resol [gen] join /resol set
                   1351:       (Betti Number = ) messagen
                   1352:       gen length print
                   1353:       (    ) message
                   1354:
                   1355:       /maxLength maxLength 1 sub def
                   1356:       maxLength 0 eq
                   1357:       {(<<Stop the resolution because of the given max depth.>>) message exit}
                   1358:       {   }
                   1359:       ifelse
                   1360:
                   1361:       [gen [$needBack$ $needSyz$]] groebner 2 get /syz set
                   1362:
                   1363:       syz length 0 eq
                   1364:       {exit}
                   1365:       { }
                   1366:       ifelse
                   1367:
                   1368:       /gen syz def
                   1369:       %% homogenization %%%%%%%%%%%%%%%%%%
                   1370:       (Note: The next line is removed for a test. 11/9.) message
                   1371:       %gen { {[[$h$. $1$.]] replace} map } map /gen set
                   1372:       gen {homogenize} map /gen set
                   1373:       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                   1374:     } loop
                   1375:     /arg1 resol def
                   1376:    ] pop
                   1377:    popVariables
                   1378:    arg1
                   1379: } def
                   1380:
                   1381: /TESTS {
                   1382: /test1 {
                   1383:   $red@$ $module1$ switch_function
                   1384:   [ [ (x^2) . (x^2-x h) . ] [ (x) . (x-h) . ] ] /ff set ;
                   1385:   (ff is the input data.) message
                   1386: } def
                   1387:
                   1388: /test2 {
                   1389:   $red@$ $module1$ switch_function
                   1390:   [ [ (1) . (0) . ] [ (0) . (1) . ] ] /ff set ;
                   1391:   (ff is the input data.) message
                   1392: } def
                   1393:
                   1394: /test3 {
                   1395:   $red@$ $module1$ switch_function
                   1396:   [ (x,y) ring_of_polynomials
                   1397:     ( ) elimination_order
                   1398:     0
                   1399:   ] define_ring
                   1400:   [ [ (h) . (x) . (y ) .]
                   1401:     [ (y) . (0) . (h) .]
                   1402:     [ (x^2) . (x h) . (0) .]] /ff set
                   1403:   (ff is the input data.) message
                   1404:
                   1405: } def
                   1406:
                   1407: /test4 {
                   1408:   $red@$ $module1$ switch_function
                   1409:   [ ${x,y}$ ring_of_polynomials
                   1410:     ( ) elimination_order
                   1411:     0
                   1412:   ] define_ring
                   1413:   [ [ (x^2 + y^2 - h^2) . ]
                   1414:     [ (x y - h^2) . ] ] /ff set
                   1415:   (ff is the input data.) message
                   1416:
                   1417: } def
                   1418: %% characteristic variety
                   1419: /test4 {
                   1420:   %% Test 1.
                   1421:   [(x,y) ring_of_differential_operators (Dx,Dy) elimination_order 0]
                   1422:   swap01 define_ring
                   1423:
                   1424:   [((x Dx^2+Dy^2-1)+e*(Dx)).  (0+e*(Dx^2)).  (Dx+Dy+1). ] /ff set
                   1425:
                   1426:   ff print ( ------------------ ) message
                   1427:   ff characteristic print ( ) message ( ) message
                   1428:
                   1429:   %% Test 2.
                   1430:   [(a,b,c,d,x) ring_of_differential_operators (Dx) elimination_order 0]
                   1431:   swap01 define_ring
                   1432:
                   1433:   [[(x*Dx-a). (-b).] [(-c). ((x-1)*Dx-d).]] /ff set
                   1434:   /ff ff homogenize  def
                   1435:   [ff] groebner /ans set
                   1436:   ans 0 get toVectors print ( ) message
                   1437:   ans 0 get characteristic print (  ) message ( ) message
                   1438:
                   1439:   %% Test 3.
                   1440:   [(a,b,c,d,x) ring_of_differential_operators (Dx) elimination_order 0]
                   1441:   define_ring
                   1442:
                   1443:   [[(x*Dx-a). (-b).] [(-c). ((x-1)*Dx-d).]] /ff set
                   1444:   /ff ff homogenize  def
                   1445:   [ff] groebner /ans set
                   1446:   ans 0 get toVectors print ( ) message ( ) message
                   1447:
                   1448: } def
                   1449:
                   1450:
                   1451: %%%%%%%%%%%%%%%%%%%%%%%%%%
                   1452:
                   1453: (type in test1,2,3.) message
                   1454: (Use toVectors to get vector representations.) message
                   1455:
                   1456: } def
                   1457:
                   1458:
                   1459:
                   1460: /lpoint { init (e). degree } def
                   1461: /characteristic {
                   1462:   /arg1 set
                   1463:   [/gb  /lps /i /n /ans /maxp /ansp /k] pushVariables
                   1464:   [  /gb arg1 def
                   1465:      /ans [ ] def
                   1466:      /maxp 0 def
                   1467:      /lps gb {lpoint} map def
                   1468:      0 1 << lps length 1 sub >>
                   1469:      {
                   1470:        /i set
                   1471:        lps i get maxp gt
                   1472:        { /maxp lps i get def }
                   1473:        {  }
                   1474:        ifelse
                   1475:      } for
                   1476:
                   1477:      %%lps print
                   1478:      /ans [
                   1479:       0 1 maxp { pop [ ]   } for
                   1480:      ] def
                   1481:
                   1482:      gb toVectors /gb set
                   1483:
                   1484:      0 1 << lps length 1 sub >>
                   1485:      {
                   1486:        /i set  /k lps i get def
                   1487:        /ansp ans k get def
                   1488:        << gb i get >> k  get principal /f set
                   1489:        /ansp ansp [f] join def
                   1490:        ans k ansp put
                   1491:      } for
                   1492:
                   1493:      /arg1 ans def
                   1494:   ] pop
                   1495:   popVariables
                   1496:   arg1
                   1497: } def
                   1498:
                   1499: ;

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