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