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

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

1.1       maekawa     1: %% dr.sm1 (Define Ring) 1994/9/25, 26
                      2:
                      3: (dr.sm1  Version 10/8/1994. ) message
                      4: %% n evenQ  bool
                      5: /evenQ {
                      6:   /arg1 set
                      7:   arg1 2 idiv  2 mul arg1 sub 0 eq
                      8:   { true }
                      9:   { false } ifelse
                     10: } def
                     11:
                     12: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                     13: /ring_of_polynomials {
                     14:   /arg1 set
                     15:   [/vars /n /i /xList /dList /param] pushVariables
                     16:   %dup print (-----) message
                     17:   [
                     18:      (mmLarger) (matrix) switch_function
                     19:      (mpMult)   (poly) switch_function
                     20:      (red@)     (module1) switch_function
                     21:      (groebner) (standard) switch_function
                     22:
                     23:      [arg1 to_records pop] /vars set
                     24:      vars length evenQ
                     25:      { }
                     26:      { vars [(PAD)] join /vars set }
                     27:      ifelse
                     28:      vars length 2 idiv /n set
                     29:      [ << n 1 sub >> -1 0
                     30:           { /i set
                     31:             vars i get
                     32:           } for
                     33:      ] /xList set
                     34:      [ << n 1 sub >> -1 0
                     35:           { /i set
                     36:             vars << i n add >> get
                     37:           } for
                     38:      ] /dList set
                     39:
                     40:      [(H)] xList join [(e)] join /xList set
                     41:      [(h)] dList join [(E)] join /dList set
                     42:      [0 %% dummy characteristic
                     43:       << xList length >> << xList length >> << xList length >>
                     44:                                             << xList length >>
                     45:       << xList length 1 sub >> << xList length >> << xList length >>
                     46:                                                   << xList length >>
                     47:      ] /param set
                     48:
                     49:      [xList dList param] /arg1 set
                     50:    ] pop
                     51:    popVariables
                     52:    arg1
                     53: } def
                     54:
                     55: %% (x,y,z) polynomial_ring [x-list, d-list , paramList]
                     56: %% with no graduation and homogenization variables.
                     57: /ring_of_polynomials2 {
                     58:   /arg1 set
                     59:   [/vars /n /i /xList /dList /param] pushVariables
                     60:   %dup print (-----) message
                     61:   [
                     62:      (mmLarger) (matrix) switch_function
                     63:      (mpMult)   (poly) switch_function
                     64:      (red@)     (module1) switch_function
                     65:      (groebner) (standard) switch_function
                     66:
                     67:      [arg1 to_records pop] /vars set
                     68:      vars length evenQ
                     69:      { }
                     70:      { vars [(PAD)] join /vars set }
                     71:      ifelse
                     72:      vars length 2 idiv /n set
                     73:      [ << n 1 sub >> -1 0
                     74:           { /i set
                     75:             vars i get
                     76:           } for
                     77:      ] /xList set
                     78:      [ << n 1 sub >> -1 0
                     79:           { /i set
                     80:             vars << i n add >> get
                     81:           } for
                     82:      ] /dList set
                     83:
                     84:      [0 %% dummy characteristic
                     85:       << xList length >> << xList length >> << xList length >>
                     86:                                             << xList length >>
                     87:       << xList length >> << xList length >> << xList length >>
                     88:                                             << xList length >>
                     89:      ] /param set
                     90:
                     91:      [xList dList param] /arg1 set
                     92:    ] pop
                     93:    popVariables
                     94:    arg1
                     95: } def
                     96:
                     97: /ring_of_differential_operators {
                     98:   /arg1 set
                     99:   [/vars /n /i /xList /dList /param] pushVariables
                    100:   [
                    101:      (mmLarger) (matrix) switch_function
                    102:      (mpMult)   (diff) switch_function
                    103:      (red@)     (module1) switch_function
                    104:      (groebner) (standard) switch_function
                    105:
                    106:      [arg1 to_records pop] /vars set %[x y z]
                    107:      vars reverse /xList set         %[z y x]
                    108:      vars {(D) 2 1 roll 2 cat_n} map
                    109:      reverse /dList set              %[Dz Dy Dx]
                    110:      [(H)] xList join [(e)] join /xList set
                    111:      [(h)] dList join [(E)] join /dList set
                    112:      [0 1 1 1 << xList length >>
                    113:         1 1 1 << xList length 1 sub >> ] /param set
                    114:      [ xList dList param ] /arg1 set
                    115:   ] pop
                    116:   popVariables
                    117:   arg1
                    118: } def
                    119:
                    120: /ring_of_differential_operators3 {
                    121: %% with no homogenization variables.
                    122:   /arg1 set
                    123:   [/vars /n /i /xList /dList /param] pushVariables
                    124:   [
                    125:      (mmLarger) (matrix) switch_function
                    126:      (mpMult)   (diff) switch_function
                    127:      (red@)     (module1) switch_function
                    128:      (groebner) (standard) switch_function
                    129:
                    130:      [arg1 to_records pop] /vars set %[x y z]
                    131:      vars reverse /xList set         %[z y x]
                    132:      vars {(D) 2 1 roll 2 cat_n} map
                    133:      reverse /dList set              %[Dz Dy Dx]
                    134:      xList [(e)] join /xList set
                    135:      dList [(E)] join /dList set
                    136:      [0 0 0 0 << xList length >>
                    137:         0 0 0 << xList length 1 sub >> ] /param set
                    138:      [ xList dList param ] /arg1 set
                    139:   ] pop
                    140:   popVariables
                    141:   arg1
                    142: } def
                    143:
                    144: /ring_of_q_difference_operators {
                    145:   /arg1 set
                    146:   [/vars /n /i /xList /dList /param] pushVariables
                    147:   [
                    148:      (mmLarger) (qmatrix) switch_function
                    149:      (mpMult)   (diff) switch_function
                    150:      (red@)     (qmodule1) switch_function
                    151:      (groebner) (standard) switch_function
                    152:
                    153:      [arg1 to_records pop] /vars set %[x y z]
                    154:      vars reverse /xList set         %[z y x]
                    155:      vars {(Q) 2 1 roll 2 cat_n} map
                    156:      reverse /dList set              %[Dz Dy Dx]
                    157:      [(q)] xList join [(e)] join /xList set
                    158:      [(h)] dList join [(E)] join /dList set
                    159:      [0 1 << xList length >> << xList length >> << xList length >>
                    160:         1 << xList length 1 sub >> << xList length >> << xList length >> ]
                    161:      /param set
                    162:      [ xList dList param ] /arg1 set
                    163:   ] pop
                    164:   popVariables
                    165:   arg1
                    166: } def
                    167:
                    168: /ring_of_q_difference_operators3 {
                    169: %% with no homogenization and q variables.
                    170:   /arg1 set
                    171:   [/vars /n /i /xList /dList /param] pushVariables
                    172:   [
                    173:      (mmLarger) (qmatrix) switch_function
                    174:      (mpMult)   (diff) switch_function
                    175:      (red@)     (qmodule1) switch_function
                    176:      (groebner) (standard) switch_function
                    177:
                    178:      [arg1 to_records pop] /vars set %[x y z]
                    179:      vars reverse /xList set         %[z y x]
                    180:      vars {(Q) 2 1 roll 2 cat_n} map
                    181:      reverse /dList set              %[Dz Dy Dx]
                    182:      xList  [(e)] join /xList set
                    183:      dList  [(E)] join /dList set
                    184:      [0 0 << xList length >> << xList length >> << xList length >>
                    185:         0 << xList length 1 sub >> << xList length >> << xList length >> ]
                    186:      /param set
                    187:      [ xList dList param ] /arg1 set
                    188:   ] pop
                    189:   popVariables
                    190:   arg1
                    191: } def
                    192:
                    193: /reverse {
                    194:   /arg1 set
                    195:   arg1 length 1 lt
                    196:   { [ ] }
                    197:   {
                    198:     [
                    199:      <<  arg1 length 1 sub >> -1 0
                    200:      {
                    201:         arg1 2 1 roll get
                    202:       } for
                    203:      ]
                    204:    } ifelse
                    205: } def
                    206:
                    207: /memberQ {
                    208: %% a set0 memberQ bool
                    209:   /arg2 set  /arg1 set
                    210:   [/a /set0 /flag /i ] pushVariables
                    211:   [
                    212:      /a arg1 def  /set0 arg2 def
                    213:      /flag 0 def
                    214:      0 1 << set0 length 1 sub >>
                    215:      {
                    216:         /i set
                    217:         << set0 i get >> a eq
                    218:         {
                    219:            /flag 1 def
                    220:          }
                    221:         { }
                    222:         ifelse
                    223:      } for
                    224:   ] pop
                    225:   /arg1 flag def
                    226:   popVariables
                    227:   arg1
                    228: } def
                    229:
                    230: /transpose {
                    231: %% mat transpose  mat2
                    232:   /arg1 set
                    233:   [/i /j /m /n /flat /mat] pushVariables
                    234:   [
                    235:     /mat arg1 def
                    236:     /n mat length def
                    237:     /m mat 0 get length def
                    238:
                    239:     [
                    240:       0 1 << n 1 sub >>
                    241:       {
                    242:          /i set
                    243:          mat i get aload pop
                    244:       } for
                    245:     ] /flat set
                    246:     %% [[1 2] [3 4]] ---> flat == [1 2 3 4]
                    247:
                    248:     [
                    249:        0 1 << m 1 sub >>
                    250:        {
                    251:           /i set
                    252:           [
                    253:              0 1 << n 1 sub >>
                    254:              {
                    255:                 /j set
                    256:                 flat
                    257:                 << j m mul >> i add
                    258:                 get
                    259:              } for
                    260:            ]
                    261:         } for
                    262:      ] /arg1 set
                    263:    ] pop
                    264:    popVariables
                    265:    arg1
                    266: } def
                    267:
                    268:
                    269: /getPerm {
                    270: %% old new getPerm perm
                    271:   /arg2 set /arg1 set
                    272:   [/old /new /i /j /p] pushVariables
                    273:   [
                    274:     /old arg1 def
                    275:     /new arg2 def
                    276:     [
                    277:         /p old length def
                    278:         0 1 << p 1 sub >>
                    279:         {
                    280:            /i set
                    281:            0 1 << p 1 sub >>
                    282:            {
                    283:               /j set
                    284:               old i get
                    285:               new j get
                    286:               eq
                    287:               { j }
                    288:               {   } ifelse
                    289:             } for
                    290:          } for
                    291:      ] /arg1 set
                    292:    ] pop
                    293:    popVariables
                    294:    arg1
                    295: } def
                    296:
                    297: /permuteOrderMatrix {
                    298: %% order perm puermuteOrderMatrix newOrder
                    299:   /arg2 set /arg1 set
                    300:   [/order /perm /newOrder /k ] pushVariables
                    301:   [
                    302:     /order arg1 def
                    303:     /perm arg2 def
                    304:     order transpose /order set
                    305:     order 1 copy /newOrder set pop
                    306:
                    307:     0 1 << perm length 1 sub >>
                    308:     {
                    309:        /k set
                    310:        newOrder << perm k get >> << order k get >> put
                    311:     } for
                    312:     newOrder transpose /newOrder set
                    313:   ] pop
                    314:   /arg1 newOrder def
                    315:   popVariables
                    316:   arg1
                    317: } def
                    318:
                    319:
                    320:
                    321: /complement {
                    322: %% set0 universe complement compl
                    323:   /arg2 set /arg1 set
                    324:   [/set0 /universe /compl /i] pushVariables
                    325:    /set0 arg1 def  /universe arg2 def
                    326:   [
                    327:      0 1 << universe length 1 sub >>
                    328:      {
                    329:         /i set
                    330:         << universe i get >> set0 memberQ
                    331:         {   }
                    332:         { universe i get }
                    333:         ifelse
                    334:       } for
                    335:    ] /arg1 set
                    336:    popVariables
                    337:    arg1
                    338: } def
                    339:
                    340:
                    341: %%% from order.sm1
                    342:
                    343: %% size i evec [0 0 ... 0 1 0 ... 0]
                    344: /evec {
                    345:  /arg2 set /arg1 set
                    346:  [/size /iii] pushVariables
                    347:  /size arg1 def  /iii arg2 def
                    348:  [
                    349:    0 1 << size 1 sub >>
                    350:    {
                    351:       iii eq
                    352:       {  1 }
                    353:       {  0 }
                    354:       ifelse
                    355:    } for
                    356:   ] /arg1 set
                    357:   popVariables
                    358:   arg1
                    359: } def
                    360:
                    361: %% size i evec_neg [0 0 ... 0 -1 0 ... 0]
                    362: /evec_neg {
                    363:  /arg2 set /arg1 set
                    364:  [/size /iii] pushVariables
                    365:  /size arg1 def  /iii arg2 def
                    366:  [
                    367:    0 1 << size 1 sub >>
                    368:    {
                    369:       iii eq
                    370:       {  -1 }
                    371:       {  0 }
                    372:       ifelse
                    373:    } for
                    374:   ] /arg1 set
                    375:   popVariables
                    376:   arg1
                    377: } def
                    378:
                    379:
                    380: %% size i j e_ij  << matrix e(i,j) >>
                    381: /e_ij {
                    382:   /arg3 set /arg2 set /arg1 set
                    383:   [/size /k /i /j] pushVariables
                    384:   [
                    385:     /size arg1 def  /i arg2 def /j arg3 def
                    386:     [ 0 1 << size 1 sub >>
                    387:       {
                    388:          /k set
                    389:          k i eq
                    390:          { size j evec }
                    391:          {
                    392:             k j eq
                    393:             { size i evec }
                    394:             { size k evec }
                    395:             ifelse
                    396:           } ifelse
                    397:        } for
                    398:      ] /arg1 set
                    399:    ] pop
                    400:    popVariables
                    401:    arg1
                    402: } def
                    403:
                    404:
                    405: %% m1 m2 oplus
                    406: /oplus {
                    407:   /arg2 set /arg1 set
                    408:   [/m1 /m2 /n /m  /k ] pushVariables
                    409:   [
                    410:     /m1 arg1 def  /m2 arg2 def
                    411:     m1 length /n set
                    412:     m2 length /m set
                    413:     [
                    414:       0 1 << n m add 1 sub >>
                    415:       {
                    416:         /k set
                    417:         k n lt
                    418:         {
                    419:             << m1 k get >> << m -1 evec >> join
                    420:         }
                    421:         {
                    422:             << n -1 evec >> << m2 << k n sub >> get >> join
                    423:         } ifelse
                    424:       } for
                    425:      ] /arg1 set
                    426:    ] pop
                    427:    popVariables
                    428:    arg1
                    429: } def
                    430:
                    431: %%%%%%%%%%%%%%%%%%%%%%%
                    432:
                    433: /eliminationOrderTemplate  { %% esize >= 1
                    434: %% if esize == 0, it returns reverse lexicographic order.
                    435: %%  m esize eliminationOrderTemplate mat
                    436:   /arg2 set /arg1 set
                    437:   [/m  /esize /m1 /m2 /k ] pushVariables
                    438:   [
                    439:     /m arg1 def  /esize arg2 def
                    440:     /m1 m esize sub 1 sub def
                    441:     /m2 esize 1 sub def
                    442:      [esize 0 gt
                    443:       {
                    444:        [1 1 esize
                    445:         { pop 1 } for
                    446:         esize 1 << m 1 sub >>
                    447:         { pop 0 } for
                    448:        ]  %% 1st vector
                    449:       }
                    450:       { } ifelse
                    451:
                    452:       m esize gt
                    453:       {
                    454:        [1 1  esize
                    455:         { pop 0 } for
                    456:         esize 1 << m 1 sub >>
                    457:         { pop 1 } for
                    458:        ]  %% 2nd vector
                    459:       }
                    460:       { } ifelse
                    461:
                    462:       m1 0 gt
                    463:       {
                    464:          m 1 sub -1 << m m1 sub >>
                    465:          {
                    466:               /k set
                    467:               m  k  evec_neg
                    468:          } for
                    469:       }
                    470:       { } ifelse
                    471:
                    472:       m2 0 gt
                    473:       {
                    474:          << esize 1 sub >> -1 1
                    475:          {
                    476:               /k set
                    477:               m  k  evec_neg
                    478:          } for
                    479:       }
                    480:       { } ifelse
                    481:
                    482:     ] /arg1 set
                    483:    ] pop
                    484:    popVariables
                    485:    arg1
                    486: } def
                    487:
                    488:
                    489: /elimination_order {
                    490: %% [x-list d-list params]  (x,y,z) elimination_order
                    491: %%  vars                    evars
                    492: %% [x-list d-list params order]
                    493:   /arg2 set  /arg1 set
                    494:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    495:   /vars arg1 def /evars [arg2 to_records pop] def
                    496:   [
                    497:     /univ vars 0 get reverse
                    498:           vars 1 get reverse join
                    499:     def
                    500:
                    501:     << univ length 2 sub >>
                    502:     << evars length >>
                    503:     eliminationOrderTemplate /order set
                    504:
                    505:     [[1]] order oplus [[1]] oplus /order set
                    506:
                    507:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    508:
                    509:     /compl
                    510:       [univ 0 get] evars join evars univ0 complement join
                    511:     def
                    512:     compl univ
                    513:     getPerm /perm set
                    514:     %%perm :: univ :: compl ::
                    515:
                    516:     order perm permuteOrderMatrix /order set
                    517:
                    518:     vars [order] join /arg1 set
                    519:   ] pop
                    520:   popVariables
                    521:   arg1
                    522: } def
                    523:
                    524: /elimination_order2 {
                    525: %% [x-list d-list params]  (x,y,z) elimination_order
                    526: %%  vars                    evars
                    527: %% [x-list d-list params order]
                    528: %% with no graduation and homogenization variables.
                    529:   /arg2 set  /arg1 set
                    530:   [/vars /evars /univ /order /perm /compl] pushVariables
                    531:   /vars arg1 def /evars [arg2 to_records pop] def
                    532:   [
                    533:     /univ vars 0 get reverse
                    534:           vars 1 get reverse join
                    535:     def
                    536:
                    537:     << univ length  >>
                    538:     << evars length >>
                    539:     eliminationOrderTemplate /order set
                    540:     /compl
                    541:       evars << evars univ complement >> join
                    542:     def
                    543:     compl univ
                    544:     getPerm /perm set
                    545:     %%perm :: univ :: compl ::
                    546:
                    547:     order perm permuteOrderMatrix /order set
                    548:
                    549:     vars [order] join /arg1 set
                    550:   ] pop
                    551:   popVariables
                    552:   arg1
                    553: } def
                    554:
                    555:
                    556: /elimination_order3 {
                    557: %% [x-list d-list params]  (x,y,z) elimination_order
                    558: %%  vars                    evars
                    559: %% [x-list d-list params order]
                    560:   /arg2 set  /arg1 set
                    561:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    562:   /vars arg1 def /evars [arg2 to_records pop] def
                    563:   [
                    564:     /univ vars 0 get reverse
                    565:           vars 1 get reverse join
                    566:     def
                    567:
                    568:     << univ length 1 sub >>
                    569:     << evars length >>
                    570:     eliminationOrderTemplate /order set
                    571:
                    572:     [[1]] order oplus  /order set
                    573:
                    574:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    575:
                    576:     /compl
                    577:       [univ 0 get] evars join evars univ0 complement join
                    578:     def
                    579:     compl univ
                    580:     getPerm /perm set
                    581:     %%perm :: univ :: compl ::
                    582:
                    583:     order perm permuteOrderMatrix /order set
                    584:
                    585:     vars [order] join /arg1 set
                    586:   ] pop
                    587:   popVariables
                    588:   arg1
                    589: } def
                    590:
                    591:
                    592: /define_ring {
                    593: %[  (x,y,z) ring_of_polynominals
                    594: %   (x,y) elimination_order
                    595: %   17
                    596: %] define_ring
                    597:    /arg1 set
                    598:    [/rp /param /foo] pushVariables
                    599:    [/rp arg1 def
                    600:     [
                    601:       rp 0 get 0 get
                    602:       rp 0 get 1 get
                    603:       rp 0 get 2 get /param set
                    604:       param 0 << rp 1 get >> put
                    605:       param
                    606:       rp 0 get 3 get
                    607:     ]  /foo set
                    608:     foo aload pop set_up_ring@
                    609:    ] pop
                    610:    popVariables
                    611: } def
                    612:
                    613: /defineTests1 {
                    614: /test {
                    615:    [[1 2 3]
                    616:     [0 1 0]
                    617:     [0 1 2]]
                    618:    [0 2 1] permuteOrderMatrix ::
                    619: } def
                    620:
                    621: /test2 { (x,y,z) ring_of_polynomials (z,y) elimination_order /ans set } def
                    622:
                    623: /test3 {
                    624:  [ (x,y,z) ring_of_polynomials
                    625:   (x,y) elimination_order
                    626:   17
                    627:  ] define_ring
                    628: } def
                    629:
                    630: /test4 {
                    631:  [ (x,y,z) ring_of_polynomials
                    632:   ( ) elimination_order
                    633:   17
                    634:  ] define_ring
                    635: } def
                    636:
                    637: } def
                    638:
                    639: %% misterious bug  (x,y) miss
                    640: /miss {
                    641:   /arg1 set
                    642:   %[/vars /n /i /xList /dList /param] pushVariables
                    643:   [/vars /i] pushVariables
                    644:   [  arg1 print
                    645:      [arg1 to_records pop] /vars set
                    646:
                    647:    ] pop
                    648:    dup print
                    649:    popVariables
                    650:    arg1
                    651: } def
                    652:
                    653:
                    654: /lexicographicOrderTemplate {
                    655: % size lexicographicOrderTemplate matrix
                    656:   /arg1 set
                    657:   [/k /size] pushVariables
                    658:   [
                    659:     /size arg1 def
                    660:     [ 0 1 << size 1 sub >>
                    661:       {
                    662:          /k set
                    663:          size k evec
                    664:        } for
                    665:     ] /arg1 set
                    666:   ] pop
                    667:   popVariables
                    668:   arg1
                    669: } def
                    670:
                    671: /lexicographic_order {
                    672: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    673: %%  vars                    evars
                    674: %% [x-list d-list params order]
                    675:   /arg2 set  /arg1 set
                    676:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    677:   /vars arg1 def /evars [arg2 to_records pop] def
                    678:   [
                    679:     /univ vars 0 get reverse
                    680:           vars 1 get reverse join
                    681:     def
                    682:
                    683:     << univ length 2 sub >>
                    684:     lexicographicOrderTemplate /order set
                    685:
                    686:     [[1]] order oplus [[1]] oplus /order set
                    687:
                    688:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y,h] --> [x,y,h]
                    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: /lexicographic_order2 {
                    706: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    707: %%  vars                    evars
                    708: %% [x-list d-list params order]
                    709: %% with no graduation and homogenization variables
                    710:   /arg2 set  /arg1 set
                    711:   [/vars /evars /univ /order /perm /compl] pushVariables
                    712:   /vars arg1 def /evars [arg2 to_records pop] def
                    713:   [
                    714:     /univ vars 0 get reverse
                    715:           vars 1 get reverse join
                    716:     def
                    717:
                    718:     << univ length  >>
                    719:     lexicographicOrderTemplate /order set
                    720:
                    721:     /compl
                    722:       evars << evars univ complement >> join
                    723:     def
                    724:     compl univ
                    725:     getPerm /perm set
                    726:
                    727:     order perm permuteOrderMatrix /order set
                    728:
                    729:     vars [order] join /arg1 set
                    730:   ] pop
                    731:   popVariables
                    732:   arg1
                    733: } def
                    734:
                    735: /lexicographic_order3 {
                    736: %% [x-list d-list params]  (x,y,z) lexicograhic_order
                    737: %%  vars                    evars
                    738: %% [x-list d-list params order]
                    739: %% with no homogenization variable.
                    740:   /arg2 set  /arg1 set
                    741:   [/vars /evars /univ /order /perm /univ0 /compl] pushVariables
                    742:   /vars arg1 def /evars [arg2 to_records pop] def
                    743:   [
                    744:     /univ vars 0 get reverse
                    745:           vars 1 get reverse join
                    746:     def
                    747:
                    748:     << univ length 1 sub >>
                    749:     lexicographicOrderTemplate /order set
                    750:
                    751:     [[1]] order oplus /order set
                    752:
                    753:     /univ0 [univ reverse aload pop pop] reverse def %% [e,x,y] --> [x,y]
                    754:
                    755:     /compl
                    756:       [univ 0 get] evars join evars univ0 complement join
                    757:     def
                    758:     compl univ
                    759:     getPerm /perm set
                    760:     %%perm :: univ :: compl ::
                    761:
                    762:     order perm permuteOrderMatrix /order set
                    763:
                    764:     vars [order] join /arg1 set
                    765:   ] pop
                    766:   popVariables
                    767:   arg1
                    768: } def
                    769:
                    770: %%%%%%   add_rings %%%%%%%%%%%%%% 10/5
                    771:
                    772:
                    773: /getX {
                    774: %% param [1|2|3|4] getX [var-lists]  ;  1->c,2->l,3->m,4->n
                    775:   /arg2 set /arg1 set
                    776:   [/k /param /func /low /top] pushVariables
                    777:   [
                    778:      /param arg1 def  /func arg2 def
                    779:      func 1 eq
                    780:      {
                    781:        /low 0 def
                    782:      }
                    783:      {
                    784:        /low << param 2 get >> << func 1 sub >> get def
                    785:      } ifelse
                    786:      /top << param 2 get >> << func 4 add >> get 1 sub def
                    787:      [
                    788:        low 1 top
                    789:        {
                    790:            /k set
                    791:           param 0 get k get
                    792:         } for
                    793:      ] /arg1 set
                    794:   ] pop
                    795:   popVariables
                    796:   arg1
                    797: } def
                    798:
                    799: /getD {
                    800: %% param [1|2|3|4] getD [var-lists]  ;  1->c,2->l,3->m,4->n
                    801:   /arg2 set /arg1 set
                    802:   [/k /param /func /low /top] pushVariables
                    803:   [
                    804:      /param arg1 def  /func arg2 def
                    805:      func 1 eq
                    806:      {
                    807:        /low 0 def
                    808:      }
                    809:      {
                    810:        /low << param 2 get >> << func 1 sub >> get def
                    811:      } ifelse
                    812:      /top << param 2 get >> << func 4 add >> get 1 sub def
                    813:      [
                    814:        low 1 top
                    815:        {
                    816:            /k set
                    817:           param 1 get k get
                    818:         } for
                    819:      ] /arg1 set
                    820:   ] pop
                    821:   popVariables
                    822:   arg1
                    823: } def
                    824:
                    825: /getXV {
                    826: %% param [1|2|3|4] getXV [var-lists]  ;  1->c,2->l,3->m,4->n
                    827:   /arg2 set /arg1 set
                    828:   [/k /param /func /low /top] pushVariables
                    829:   [
                    830:      /param arg1 def  /func arg2 def
                    831:      /low << param 2 get >> << func 4 add >> get def
                    832:      /top << param 2 get >>  func get 1 sub def
                    833:      [
                    834:        low 1 top
                    835:        {
                    836:            /k set
                    837:           param 0 get k get
                    838:         } for
                    839:      ] /arg1 set
                    840:   ] pop
                    841:   popVariables
                    842:   arg1
                    843: } def
                    844:
                    845: /getDV {
                    846: %% param [1|2|3|4] getDV [var-lists]  ;  1->c,2->l,3->m,4->n
                    847:   /arg2 set /arg1 set
                    848:   [/k /param /func /low /top] pushVariables
                    849:   [
                    850:      /param arg1 def  /func arg2 def
                    851:      /low << param 2 get >> << func 4 add >> get def
                    852:      /top << param 2 get >>  func get 1 sub def
                    853:      [
                    854:        low 1 top
                    855:        {
                    856:            /k set
                    857:           param 1 get k get
                    858:         } for
                    859:      ] /arg1 set
                    860:   ] pop
                    861:   popVariables
                    862:   arg1
                    863: } def
                    864:
                    865: /reNaming {
                    866:   %% It also changes oldx2 and oldd2, which are globals.
                    867:   /arg1 set
                    868:   [/i /j /new /count /ostr /k] pushVariables
                    869:   [
                    870:     /new arg1 def
                    871:     /count 0 def
                    872:     0 1 << new length 1 sub >> {
                    873:        /i set
                    874:       << i 1 add >> 1 << new length 1 sub >> {
                    875:           /j set
                    876:           << new i get >> << new j get >> eq
                    877:           {
                    878:              new j get /ostr set
                    879:              (The two rings have the same name :) messagen
                    880:              new i get messagen (.) message
                    881:              (The name ) messagen
                    882:              new i get messagen ( is changed into ) messagen
                    883:              new j << new i get << 48 count add $string$ data_conversion >>
                    884:                       2 cat_n >> put
                    885:              new j get messagen (.) message
                    886:              /oldx2 ostr << new j get >> reNaming2
                    887:              /oldd2 ostr << new j get >> reNaming2
                    888:              /count count 1 add def
                    889:            }
                    890:            { }
                    891:            ifelse
                    892:       } for
                    893:     } for
                    894:     /arg1 new def
                    895:   ] pop
                    896:   popVariables
                    897:   arg1
                    898: } def
                    899:
                    900: /reNaming2 {
                    901:   %% array oldString newString reNaming2
                    902:   %% /aa (x) (y) reNaming2
                    903:   /arg3 set /arg2 set /arg1 set
                    904:   [/array /oldString /newString /k] pushVariables
                    905:   [
                    906:     /array arg1 def /oldString arg2 def /newString arg3 def
                    907:       0 1 << array load length 1 sub >>
                    908:       {
                    909:          /k set
                    910:          << array load k get  >> oldString eq
                    911:          {
                    912:             array load k newString put
                    913:           }
                    914:           { } ifelse
                    915:       } for
                    916:    ] pop
                    917:    popVariables
                    918: } def
                    919:
                    920: /add_rings {
                    921:   /arg2 set /arg1 set
                    922:   [/param1 /param2
                    923:    /newx /newd  /newv
                    924:    /k /const /od1 /od2 /od
                    925:    /oldx2 /oldd2  % these will be changed in reNaming.
                    926:    /oldv
                    927:   ] pushVariables
                    928:   [
                    929:      /param1 arg1 def /param2 arg2 def
                    930:    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                    931:      /newx
                    932:        [ ]
                    933:        param2 1 getX join  param1 1 getX join
                    934:        param2 1 getXV join param1 1 getXV join
                    935:
                    936:        param2 2 getX join  param1 2 getX join
                    937:        param2 2 getXV join param1 2 getXV join
                    938:
                    939:        param2 3 getX join  param1 3 getX join
                    940:        param2 3 getXV join param1 3 getXV join
                    941:
                    942:        param2 4 getX join  param1 4 getX join
                    943:        param2 4 getXV join param1 4 getXV join
                    944:      def
                    945:      /newd
                    946:        [ ]
                    947:        param2 1 getD join  param1 1 getD join
                    948:        param2 1 getDV join param1 1 getDV join
                    949:
                    950:        param2 2 getD join  param1 2 getD join
                    951:        param2 2 getDV join param1 2 getDV join
                    952:
                    953:        param2 3 getD join  param1 3 getD join
                    954:        param2 3 getDV join param1 3 getDV join
                    955:
                    956:        param2 4 getD join  param1 4 getD join
                    957:        param2 4 getDV join param1 4 getDV join
                    958:      def
                    959:
                    960:      /newv  newx newd join def
                    961:      /oldx2 param2 0 get def  /oldd2 param2 1 get def
                    962:      /oldx2 oldx2 {1 copy 2 1 roll pop} map def
                    963:      /oldd2 oldd2 {1 copy 2 1 roll pop} map def
                    964:      /newv newv reNaming def
                    965:
                    966:      /newx [
                    967:        0 1 << newv length 2 idiv 1 sub >>
                    968:        {
                    969:           /k set
                    970:           newv k get
                    971:        } for
                    972:      ] def
                    973:      /newd [
                    974:        0 1 << newv length 2 idiv 1 sub >>
                    975:        {
                    976:           /k set
                    977:           newv << newv length 2 idiv k add >> get
                    978:        } for
                    979:      ] def
                    980:      /const [
                    981:         << param1 2 get 0 get >>
                    982:         << param1 2 get 1 get  param2 2 get 1 get add >>
                    983:         << param1 2 get 2 get  param2 2 get 2 get add >>
                    984:         << param1 2 get 3 get  param2 2 get 3 get add >>
                    985:         << param1 2 get 4 get  param2 2 get 4 get add >>
                    986:         << param1 2 get 5 get  param2 2 get 5 get add >>
                    987:         << param1 2 get 6 get  param2 2 get 6 get add >>
                    988:         << param1 2 get 7 get  param2 2 get 7 get add >>
                    989:         << param1 2 get 8 get  param2 2 get 8 get add >>
                    990:     ] def
                    991:
                    992:     /od1 param1 3 get def /od2 param2 3 get def
                    993:     od1 od2 oplus /od set
                    994:
                    995:     %%oldx2 :: oldd2 ::
                    996:     << param1 0 get reverse >> << param1 1 get reverse >> join
                    997:     << oldx2 reverse >> << oldd2 reverse >> join
                    998:     join /oldv set
                    999:
                   1000:
                   1001:     od << oldv << newx reverse newd reverse join >> getPerm >>
                   1002:     permuteOrderMatrix /od set
                   1003:
                   1004:      /arg1 [newx newd const od] def
                   1005:   ] pop
                   1006:   popVariables
                   1007:   arg1
                   1008: } def
                   1009:
                   1010:
                   1011: /test5 {
                   1012:   (t) ring_of_polynomials ( ) elimination_order /r1 set
                   1013:   (x) ring_of_differential_operators (Dx) elimination_order /r2 set
                   1014:   r2 r1 add_rings
                   1015: } def
                   1016:
                   1017: /test6 {
                   1018:   (H,h) ring_of_polynomials2 (H,h) lexicographic_order2 /r0 set
                   1019:   (x,y,z) ring_of_polynomials2 (x,y) elimination_order2 /r1 set
                   1020:   (t) ring_of_differential_operators3 (Dt) elimination_order3 /r2 set
                   1021:   [r2 r1 add_rings r0 add_rings 0] define_ring
                   1022: } def
                   1023:
                   1024: /test7 {
                   1025:   (H,h) ring_of_polynomials2 (H,h) lexicographic_order2 /r0 set
                   1026:   (a,b,c,cp) ring_of_polynomials2 ( ) elimination_order2 /r1 set
                   1027:   (x,y) ring_of_differential_operators3 (Dx,Dy) elimination_order3 /r2 set
                   1028:   [r2 r1 add_rings r0 add_rings 0] define_ring
                   1029:   [(Dx (x Dx + c-1) - (x Dx + y Dy + a) (x Dx + y Dy + b)).
                   1030:    (Dy (y Dy + cp-1) - (x Dx + y Dy + a) (x Dx + y Dy + b)).] /ff set
                   1031:   ff {[[$h$. $1$.]] replace} map homogenize /ff set
                   1032: } def
                   1033: %%%% end of add_rings
                   1034:
                   1035: ;

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