Annotation of OpenXM/src/kan96xx/Doc/restall.sm1, Revision 1.1.1.1
1.1 maekawa 1: %% changed the following names.
2: %% complement ---> complement.oaku
3: %% syz ==> o.syz
4:
5: %%%%%%%%%%%%%%%%%%%%%%% restall.sm1 (Version 19980415) %%%%%%%%%%%%%%%%%%%%%%%
6: (restall.sm1 ... compute all the cohomology groups of the restriction) message-quiet
7: ( of a D-module to tt = (t_1,...,t_d) = (0,...,0).) message-quiet
8: (non-Schreyer Version: 19980415 by T.Oaku) message-quiet
9: (usage: [(P1)...] [(t1)...] bfm --> the b-function) message-quiet
10: ( [(P1)...] [(t1)...] k0 k1 deg restall --> cohomologies of restriction)
11: message-quiet
12: ( [(P1)...] [(t1)...] intbfm --> the b-function for integration) message-quiet
13: ( [(P1)...] [(t1)...] k0 k1 deg intall --> cohomologies of integration)
14: message-quiet
15: % History: Oct.23, Nov.1, Nov.11: bug fix for m2vec, Nov.13: bug fix for psi1
16: % Apr.15,1998 bug fix for truncation from below
17: %%%%%%%%%%%%%%%%%%%%%%%%%%%% Global variables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18: /BFvarlist %% Set all the variables (except s and the parameters) here.
19: [(x) (y) (z)]
20: def
21: /BFparlist %% Set the parameters here if any.
22: [ ]
23: def
24: /BFs (s) def
25: /BFth (s) def
26: /BFu (u) def
27: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28: %% [(P1) ...] [(t1) ...] bfm --> the b-function along t1 = ... = 0.
29: %% the variables and parameters are assumed to be given by the global variables
30: %% BFvarlist and BFparlist
31:
32: /bfm {
33: /arg2 set
34: /arg1 set
35: [ /ff /tt ] pushVariables
36: [
37: arg1 /ff set
38: arg2 /tt set
39: ff tt bfm1 bfm2 {(string) dc} map /arg1 set
40: ] pop
41: popVariables
42: arg1
43: } def
44:
45: /bfm1 {
46: /arg2 set
47: /arg1 set
48: [
49: /ff /tt /d /nff /gg /gg0 /xvarlist /n /i /xtvarlist /xtusvarlist
50: /sxtusvarlist /allvarlist /gg1 /si /gg1 /j /ui /uu /ss /su1
51: /input /ggpsi0 /ggpsi /dxvarlist /sxvarlist /ggpsi1
52: /sxallvarlist /sxpoly_weight /hh /bb /us_weight
53: ] pushVariables
54: [
55: arg1 /ff set
56: arg2 /tt set
57: tt length /d set
58: ff length /nff set
59:
60: ff tt fwd /gg set
61: gg {fw_symbol (string) dc} map /gg0 set
62:
63: BFvarlist tt setminus /xvarlist set
64: xvarlist length /n set
65:
66: /uu %% uu = [u_1,...,u_d]
67: [ 1 1 d {/i set
68: BFu i toString 2 cat_n
69: } for
70: ] def
71: /ss %% ss = [s_1,...,s_d]
72: [ 1 1 d {/i set
73: BFth i toString 2 cat_n
74: } for
75: ] def
76:
77: tt xvarlist join /xtvarlist set
78: uu ss join xtvarlist join /xtusvarlist set
79: [BFth] xtusvarlist join /sxtusvarlist set
80: sxtusvarlist BFparlist join /allvarlist set
81:
82: sxtusvarlist setupDring
83:
84: 0 1 d 1 sub { /i set
85: gg0 {tt i get fw_homogenize} map /gg1 set
86: ss i get expand /si set
87: gg1 {expand} map /gg1 set
88: gg1 {[[BFs expand si]] replace} map /gg1 set
89: gg1 {(string) dc} map /gg1 set
90: } for
91:
92: /us_weight [ [
93: 0 1 d 1 sub { /i set
94: uu i get 1 ss i get 1
95: } for ]
96: [
97: 0 1 d 1 sub { /i set tt i get 1 } for
98: 0 1 n 1 sub { /j set
99: xvarlist j get xtoDx 1
100: xvarlist j get 1
101: } for
102: ] ] def
103:
104: [ allvarlist listtostring ring_of_differential_operators
105: us_weight weight_vector 0 ] define_ring
106:
107: gg1 {expand} map /gg1 set
108:
109: /su1 [ 0 1 d 1 sub { /i set %% [(1-s1*u1).,...]
110: ss i get expand /si set
111: uu i get expand /ui set
112: si ui mul (1). sub
113: } for ] def
114:
115: su1 gg1 join /input set
116: input {[[(h). (1).]] replace homogenize} map /input set
117: [input] groebner 0 get {[[(h). (1).]] replace} map /gg set
118: gg uu eliminatev /gg set
119: gg ss eliminatev /gg set
120: gg reducedBase /gg set
121:
122: gg /ggpsi0 set
123: 0 1 d 1 sub { /i set
124: ggpsi0 {tt i get fw_psi} map /ggpsi0 set
125: ss i get expand /si set
126: ggpsi0 {[[BFth expand si]] replace} map /ggpsi0 set
127: } for
128: ggpsi0 {(string) dc} map /ggpsi set
129:
130: xvarlist {xtoDx} map /dxvarlist set
131: ss xvarlist join /sxvarlist set
132: sxvarlist setupDring
133:
134: ggpsi {expand [[(h). (1).]] replace homogenize} map /ggpsi set
135: [ggpsi] groebner 0 get /ggpsi set
136: ggpsi dxvarlist eliminatev /ggpsi1 set
137: ggpsi1 {(string) dc} map /ggpsi1 set
138:
139: /sxpoly_weight [
140: [ 0 1 n 1 sub {/i set xvarlist i get 1} for ]
141: [ 0 1 d 1 sub {/i set ss i get 1} for ]
142: ] def
143:
144: sxvarlist BFparlist join /sxallvarlist set
145: [ sxallvarlist listtostring ring_of_polynomials
146: sxpoly_weight weight_vector 0 ] define_ring
147: ggpsi1 {expand} map /ggpsi1 set ;
148: [ggpsi1] groebner 0 get {[[(h). (1).]] replace} map /hh set
149: hh xvarlist eliminatev /bb set
150: [bb {(string) dc} map ss] /arg1 set
151: ] pop
152: popVariables
153: arg1
154: } def
155:
156: /bfm2 {
157: /arg1 set
158: [ /ff /ss /d /sspoly_weight /ssallvarlist /si /hh ] pushVariables
159: [
160: arg1 0 get /ff set
161: arg1 1 get /ss set
162: ss length /d set
163:
164: /sspoly_weight [
165: [ 0 1 d 1 sub {/i set ss i get 1} for ]
166: ] def
167:
168: [BFth] ss join BFparlist join /ssallvarlist set
169: [ ssallvarlist listtostring ring_of_polynomials
170: sspoly_weight weight_vector 0 ] define_ring
171: ff {expand homogenize} map /ff set ;
172: BFth expand /si set
173: 1 1 d 1 sub {/i set
174: si << ss i get expand >> sub /si set
175: } for
176: ff {[[ss 0 get expand si]] replace} map /ff set
177: [ff] groebner 0 get {[[(h). (1).]] replace} map /hh set
178: hh ss eliminatev /arg1 set
179: ] pop
180: popVariables
181: arg1
182: } def
183:
184: %% V-Groebner basis by V-filtration (using the variable s)
185: /fwd {
186: /arg2 set %% bftt
187: /arg1 set %% BFequations
188: [ /bfs /bftt /bfh /bf1 /ff /n /i /d /GG /gbase /o.syz
189: /BFDvarlist /BFs_weight ] pushVariables
190: [
191: /ff arg1 def
192: /bftt arg2 def
193: /BFallvarlist
194: [ BFs ] BFvarlist join BFparlist join
195: def
196: BFvarlist length /n set
197: BFvarlist {xtoDx} map /BFDvarlist set
198: /BFs_weight
199: [ [ BFs 1 ]
200: [ 0 1 n 1 sub
201: { /i set BFDvarlist i get 1 }
202: for
203: 0 1 n 1 sub
204: { /i set BFvarlist i get 1 }
205: for ]
206: ] def
207:
208: [ BFallvarlist listtostring ring_of_differential_operators
209: BFs_weight weight_vector
210: 0] define_ring /BFring set
211:
212: /bfh (h) BFring ,, def
213: /bfs BFs BFring ,, def
214: /bf1 (1) BFring ,, def
215: ff { bftt fwm_homogenize } map /ff set
216: ff {expand} map /ff set
217: ff {[[bfh bf1]] replace} map {homogenize} map /ff set
218: [ff] groebner 0 get reducedBase /gbase set
219: gbase /arg1 set
220: ] pop
221: popVariables
222: arg1
223: } def
224:
225: %% The "b-function" w.r.t. (Dt1),...
226: %% (for integration w.r.t. (t1),...
227: %% [(P1)...] [(t1)...] intbfm
228:
229: /intbfm {
230: /arg2 set /arg1 set
231: [ ] pushVariables
232: [
233: arg1 /ff set
234: arg2 /tt set
235: BFvarlist setupDring
236: ff {tt fourier} map /gg set
237: gg tt bfm /arg1 set
238: ] pop
239: popVariables
240: arg1
241: } def
242:
243: /intall {
244: /arg5 set %% degmax
245: /arg4 set %% k1
246: /arg3 set %% k0
247: /arg2 set %% [(t1) ... (td)]
248: /arg1 set %% BFequations
249: [ /ff /bftt /k0 /k1 /degmax /ffdx ] pushVariables
250: [
251: /ff arg1 def /bftt arg2 def /k0 arg3 def /k1 arg4 def
252: /degmax arg5 def
253: BFvarlist setupDring
254: ff {bftt fourier} map /ffdx set
255: ffdx bftt k0 k1 degmax restall /arg1 set
256: ] pop
257: popVariables
258: arg1
259: } def
260:
261: /intall1 {
262: /arg5 set %% degmax
263: /arg4 set %% k1
264: /arg2 set %% [(t1) ... (td)]
265: /arg1 set %% BFequations
266: [ /ff /bftt /k0 /k1 /degmax /ffdx ] pushVariables
267: [
268: /ff arg1 def /bftt arg2 def /k1 arg4 def
269: /degmax arg5 def
270: BFvarlist setupDring
271: ff {bftt fourier} map /ffdx set
272: ffdx bftt k1 degmax restall1 /arg1 set
273: ] pop
274: popVariables
275: arg1
276: } def
277:
278: %% (P) [(t_1),...,(t_d)] fourier
279: /fourier {
280: /arg2 set /arg1 set
281: [ /P /tt /d /i] pushVariables
282: [
283: arg1 /P set
284: arg2 /tt set
285: tt length /d set
286: 0 1 d 1 sub {/i set
287: P << tt i get >> fourier1 /P set
288: } for
289: P /arg1 set
290: ] pop
291: popVariables
292: arg1
293: } def
294:
295: %% (P) (t) fourier : t --> -Dt, Dt --> t
296: /fourier1 {
297: /arg2 set /arg1 set
298: [/P /bft /bfDt /P /bftv /bfDtv /Pcoefs /degs /coefs /m /PP /i /ki /ci
299: ] pushVariables
300: [
301: arg1 /P set
302: arg2 /bft set
303: bft xtoDx /bfDt set
304: P expand /P set
305: bft expand /bftv set
306: bfDt expand /bfDtv set
307: P bfDtv coefficients /Pcoefs set
308: Pcoefs 0 get /degs set
309: Pcoefs 1 get /coefs set
310: coefs length /m set
311: (0). /PP set
312: 0 1 m 1 sub { /i set
313: degs i get /ki set
314: coefs i get /ci set
315: ci [[ bftv << (0). bfDtv sub >> ]] replace /ci set
316: ci << bftv ki power >> mul /ci set
317: PP ci add /PP set
318: } for
319: PP [[(h). (1).]] replace (string) dc /arg1 set
320: ] pop
321: popVariables
322: arg1
323: } def
324:
325: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326: %% The cohomology groups of the restriction
327: %% [(P1)...] [(t1)...] k0 k1 degmax restall
328: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
329:
330: /restall {
331: /arg5 set %% degmax
332: /arg4 set %% k1
333: /arg3 set %% k0
334: /arg2 set %% [(t1) ... (td)]
335: /arg1 set %% BFequations
336: [
337: /ff /bftt /k0 /k1 /degmax /syzlist /mveclist /cohomlist
338: /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
339: /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
340: /psi1 /psi1ker /psi2image
341: /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
342: /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
343: ] pushVariables
344: [
345: /ff arg1 def /bftt arg2 def /k0 arg3 def /k1 arg4 def
346: /degmax arg5 def
347: bftt length /d set
348: degmax 0 gt {
349: (Computing a free resolution ... ) message
350: ff bftt degmax syzygyV /GG set
351: (A free resolution obtained.) message
352: }{
353: [[ff bftt fwd {[[BFs expand (1).]] replace (string) dc} map ] [ [ 0 ] ]]
354: /GG set
355: } ifelse
356: GG 0 get /syzlist set
357: GG 1 get /mveclist set
358:
359: [ ] /cohomlist set
360:
361: 0 1 degmax {/ideg set
362:
363: ideg 0 eq {
364: [ (0) ] /gbase set
365: [ 0 ] /m0vec set
366: 1 /r0 set
367: }{
368: syzlist << ideg 1 sub >> get /gbase set
369: m1vec /m0vec set
370: r1 /r0 set
371: } ifelse
372: syzlist ideg get /o.syz set
373: mveclist ideg get /m1vec set
374:
375: %% o.syz gbase
376: %% D^{r2} --> D^{r1} --> D^{r0}
377: %% with weight vectors: m2vec m1vec m0vec
378: %% which will induce a complex
379: %% psi2 psi1
380: %% D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
381:
382: gbase length /r1 set
383: o.syz length /r2 set
384:
385: ideg 0 eq {
386: /syz1 [ 0 1 r2 1 sub {/i set
387: [ o.syz i get ]
388: } for ] def
389: syz1 /o.syz set
390: }{ } ifelse
391:
392: %% Computing the weight vector m2vec from m1vec and syz
393: ideg degmax eq {
394: /m2vec [
395: 0 1 r2 1 sub {/i set
396: o.syz i get /syzi set
397: 0 /nonzero set
398: 0 1 r1 1 sub {/j set
399: syzi j get expand /syzij set
400: syzij (0). eq { }{
401: syzij bftt fwh_order m1vec j get add /maxtmp set
402: nonzero 0 eq { maxtmp /max0 set }{
403: maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
404: } ifelse
405: 1 /nonzero set
406: } ifelse
407: } for
408: max0 } for ] def
409: }{
410: mveclist << ideg 1 add >> get /m2vec set
411: } ifelse
412:
413: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
414: BFu /estr set
415: /ee
416: [ 1 1 d {/i set estr i toString 2 cat_n} for ]
417: def
418: [@@@.esymbol] ee join /eee set
419:
420: %% Setting up a ring that represents D_{Y->X}^{r1}
421: eee length /neee set
422: /eeemvec [ 1 1 neee {pop 1} for ] def
423: eee [ ] BFvarlist eeemvec setupDringVshift
424: bftt {xtoDx expand} map /bfDtt set
425: [ ] /psi1 set
426: [ ] /psi1index set
427: [ ] /zerolist set
428:
429: %% converting gbase to a list of polynomials
430: %% Be careful to the current ring!
431: ideg 2 lt {
432: gbase {expand} map /gbase1 set
433: }{
434: /gbase1
435: [ 0 1 r1 1 sub {/i set
436: gbase i get {expand} map vector_to_poly
437: } for ] def
438: } ifelse
439: gbase1 /gbase set
440:
441: %(ideg =) messagen ideg ::
442: %(Computing psi1) message
443: %% psi1
444: %% Computes D_{Y->X}^{r1} --> D_{Y->X}^{r0} induced by gbase
445: %% with weight k0 - m1vec <= k <= k1 - m1vec
446: 0 1 r1 1 sub {/i set
447: m1vec i get /m1i set
448: ee {expand} map k0 m1i sub k1 m1i sub monomials /emonoi set
449: bfDtt k0 m1i sub k1 m1i sub monomials /bfDttmonoi set
450: emonoi length /nmono set
451: 0 1 nmono 1 sub {/j set
452: @@@.esymbol expand i npower /eei set
453: emonoi j get eei mul /eei set
454: gbase i get /dtp set
455: bfDttmonoi j get dtp mul /dtp set
456: 0 1 d 1 sub {/k set
457: dtp [[bftt k get expand (0).]] replace /dtp set
458: dtp [[bfDtt k get ee k get expand]] replace /dtp set
459: } for
460: dtp [[(h). (1).]] replace /dtp set
461: dtp << ee {expand} map >> m0vec k0 Vtruncate_below /dtp set
462: dtp (0). eq {
463: zerolist [eei] join /zerolist set
464: }{
465: psi1index [eei] join /psi1index set
466: psi1 [dtp] join /psi1 set
467: } ifelse
468: } for
469: } for
470:
471: %(ideg =) messagen ideg ::
472: %(psi1 obtained.) message
473: %(Computing psi1ker) message
474:
475: %% Computing psi1ker := Ker psi1 :
476: psi1 length 0 eq {
477: [ ] /psi1ker set
478: }{
479: psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
480: [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
481: psi1kervec length /pn set
482: psi1index length /pn0 set
483: [ ] /psi1ker set
484: 0 1 pn 1 sub {/i set
485: psi1kervec i get /psi1i set
486: (0). /psi1keri set
487: 0 1 pn0 1 sub {/j set
488: psi1index j get psi1i j get mul psi1keri add /psi1keri set
489: } for
490: psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
491: } for
492: } ifelse
493: zerolist psi1ker join /psi1ker set
494: % Is it all right to use reducedBase here?
495: % psi1ker length 0 eq { }{
496: % psi1ker reducedBase /psi1ker set
497: % } ifelse
498: %(ideg =) messagen ideg ::
499: %(psi1ker obtained.) message
500: %(Computing psi2image ...) message
501:
502: %% psi2
503: %% Computes the image of D_{Y->X}^{r2} --> D_{Y->X}^{r1} induced by syz
504: %% with weight k0 - m2vec <= k <= k1 - m2vec
505: /psi2image [
506: 0 1 r2 1 sub {/i set
507: o.syz i get {expand} map vector_to_poly /syzi set
508: m2vec i get /m2i set
509: bfDtt k0 m2i sub k1 m2i sub monomials /bfDttmonoi set
510: bfDttmonoi length /nmono set
511: 0 1 nmono 1 sub {/j set
512: bfDttmonoi j get syzi mul /syzij set
513: 0 1 d 1 sub {/k set
514: syzij [[bftt k get expand (0).]] replace /syzij set
515: syzij [[bfDtt k get ee k get expand]] replace /syzij set
516: } for
517: syzij [[(h). (1).]] replace /syzij set
518: syzij << ee {expand} map >> m1vec k0 Vtruncate_below /syzij set
519: syzij (0). eq { }{syzij} ifelse
520: } for
521: } for
522: ] def
523:
524: %(psi2image obtained.) message
525: %(ideg = ) messagen ideg ::
526: %(psi1ker = ) message psi1ker ::
527: %(psi2image =) message psi2image ::
528:
529: %% Computes the quotient module psi1ker/psi2image
530: psi1ker length /nker set
531: nker 0 eq {
532: [0 [ ]] /cohom set
533: }{
534: psi2image length /nim set
535: psi1ker psi2image join /psiall set
536: psiall {homogenize} map /psiall set
537: [psiall [(needSyz)]] groebner 2 get /psisyz set
538: psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
539: cohom {remove0} map /cohom set
540: cohom length 0 eq {
541: [nker [ ]] /cohom set
542: }{
543: cohom {homogenize} map /cohom set
544: [cohom] groebner 0 get reducedBase /cohom set
545: cohom {[[(h). (1).]] replace} map /cohom set
546: [nker cohom] trimModule /cohom set
547: } ifelse
548: } ifelse
549: cohomlist [cohom] join /cohomlist set
550: 0 ideg sub print (-th cohomology: ) messagen
551: cohom ::
552: } for
553:
554: cohomlist /arg1 set
555: ] pop
556: popVariables
557: arg1
558: } def
559:
560: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
561: %% The cohomology groups of the restriction without truncation from below
562: %% [(P1)...] [(t1)...] k1 degmax restall
563: %% --> [0-th cohomology -1-th cohomology, ...,-degmax-th cohomology]
564:
565: /restall1 {
566: /arg5 set %% degmax
567: /arg4 set %% k1
568: /arg2 set %% [(t1) ... (td)]
569: /arg1 set %% BFequations
570: [
571: /ff /bftt /k1 /degmax /syzlist /mveclist /cohomlist
572: /ideg /gbase /o.syz /m1vec /m2vec /r1 /r2
573: /i /syzi /j /syzij /maxtmp /max0 /ee /psi1index /zerolist
574: /psi1 /psi1ker /psi2image
575: /gbase1 /m1i /emonoi /nmono /bfDttmonoi /eei /dtp /k /psi1kervec
576: /pn /pn0 /psi1i /psi1keri /m2i /nker /nim /cohm /psiall /psisyz /cohom0
577: ] pushVariables
578: [
579: /ff arg1 def /bftt arg2 def /k1 arg4 def /degmax arg5 def
580: bftt length /d set
581: degmax 0 gt {
582: (Computing a free resolution ... ) message
583: ff bftt degmax syzygyV /GG set
584: (A free resolution obtained.) message
585: }{
586: [[ff bftt fwd {[[BFs expand (1).]] replace (string) dc} map ] [ [ 0 ] ]]
587: /GG set
588: } ifelse
589: GG 0 get /syzlist set
590: GG 1 get /mveclist set
591:
592: [ ] /cohomlist set
593:
594: 0 1 degmax {/ideg set
595:
596: ideg 0 eq {
597: [ (0) ] /gbase set
598: [ 0 ] /m0vec set
599: 1 /r0 set
600: }{
601: syzlist << ideg 1 sub >> get /gbase set
602: m1vec /m0vec set
603: r1 /r0 set
604: } ifelse
605: syzlist ideg get /o.syz set
606: mveclist ideg get /m1vec set
607:
608: %% o.syz gbase
609: %% D^{r2} --> D^{r1} --> D^{r0}
610: %% with weight vectors: m2vec m1vec m0vec
611: %% which will induce a complex
612: %% psi2 psi1
613: %% D_{Y->X}^{r2} --> D_{Y->X}^{r1} --> D_{Y->X}^{r0}
614:
615: gbase length /r1 set
616: o.syz length /r2 set
617:
618: ideg 0 eq {
619: /syz1 [ 0 1 r2 1 sub {/i set
620: [ o.syz i get ]
621: } for ] def
622: syz1 /o.syz set
623: }{ } ifelse
624:
625: %% Computing the weight vector m2vec from m1vec and syz
626: ideg degmax eq {
627: /m2vec [
628: 0 1 r2 1 sub {/i set
629: o.syz i get /syzi set
630: 0 /nonzero set
631: 0 1 r1 1 sub {/j set
632: syzi j get expand /syzij set
633: syzij (0). eq { }{
634: syzij bftt fwh_order m1vec j get add /maxtmp set
635: nonzero 0 eq { maxtmp /max0 set }{
636: maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
637: } ifelse
638: 1 /nonzero set
639: } ifelse
640: } for
641: max0 } for ] def
642: }{
643: mveclist << ideg 1 add >> get /m2vec set
644: } ifelse
645:
646: %% ee = [u1,...,ud] corresponds to [Dt1,...,Dtd] (for graduation)
647: BFu /estr set
648: /ee
649: [ 1 1 d {/i set estr i toString 2 cat_n} for ]
650: def
651: [@@@.esymbol] ee join /eee set
652:
653: %% Setting up a ring that represents D_{Y->X}^{r1}
654: eee length /neee set
655: /eeemvec [ 1 1 neee {pop 1} for ] def
656: eee [ ] BFvarlist eeemvec setupDringVshift
657: bftt {xtoDx expand} map /bfDtt set
658: [ ] /psi1 set
659: [ ] /psi1index set
660: [ ] /zerolist set
661:
662: %% converting gbase to a list of polynomials
663: %% Be careful to the current ring!
664: ideg 2 lt {
665: gbase {expand} map /gbase1 set
666: }{
667: /gbase1
668: [ 0 1 r1 1 sub {/i set
669: gbase i get {expand} map vector_to_poly
670: } for ] def
671: } ifelse
672: gbase1 /gbase set
673:
674: %(ideg =) messagen ideg ::
675: %(Computing psi1) message
676: %% psi1
677: %% Computes D_{Y->X}^{r1} --> D_{Y->X}^{r0} induced by gbase
678: %% with weight k <= k1 - m1vec
679: 0 1 r1 1 sub {/i set
680: m1vec i get /m1i set
681: ee {expand} map 0 k1 m1i sub monomials /emonoi set
682: bfDtt 0 k1 m1i sub monomials /bfDttmonoi set
683: emonoi length /nmono set
684: 0 1 nmono 1 sub {/j set
685: @@@.esymbol expand i npower /eei set
686: emonoi j get eei mul /eei set
687: gbase i get /dtp set
688: bfDttmonoi j get dtp mul /dtp set
689: 0 1 d 1 sub {/k set
690: dtp [[bftt k get expand (0).]] replace /dtp set
691: dtp [[bfDtt k get ee k get expand]] replace /dtp set
692: } for
693: dtp [[(h). (1).]] replace /dtp set
694: dtp (0). eq {
695: zerolist [eei] join /zerolist set
696: }{
697: psi1index [eei] join /psi1index set
698: psi1 [dtp] join /psi1 set
699: } ifelse
700: } for
701: } for
702:
703: %(ideg =) messagen ideg ::
704: %(psi1 obtained.) message
705: %(Computing psi1ker) message
706:
707: %% Computing psi1ker := Ker psi1 :
708: psi1 length 0 eq {
709: [ ] /psi1ker set
710: }{
711: psi1 {[[(h). (1).]] replace homogenize} map /psi1 set
712: [psi1 [(needSyz)]] groebner 2 get /psi1kervec set
713: psi1kervec length /pn set
714: psi1index length /pn0 set
715: [ ] /psi1ker set
716: 0 1 pn 1 sub {/i set
717: psi1kervec i get /psi1i set
718: (0). /psi1keri set
719: 0 1 pn0 1 sub {/j set
720: psi1index j get psi1i j get mul psi1keri add /psi1keri set
721: } for
722: psi1ker [ psi1keri [[(h). (1).]] replace ] join /psi1ker set
723: } for
724: } ifelse
725: zerolist psi1ker join /psi1ker set
726: % Is it all right to use reducedBase here?
727: % psi1ker length 0 eq { }{
728: % psi1ker reducedBase /psi1ker set
729: % } ifelse
730: %(ideg =) messagen ideg ::
731: %(psi1ker obtained.) message
732: %(Computing psi2image ...) message
733:
734: %% psi2
735: %% Computes the image of D_{Y->X}^{r2} --> D_{Y->X}^{r1} induced by syz
736: %% with weight m2vec <= k <= k1 - m2vec
737: /psi2image [
738: 0 1 r2 1 sub {/i set
739: o.syz i get {expand} map vector_to_poly /syzi set
740: m2vec i get /m2i set
741: bfDtt 0 k1 m2i sub monomials /bfDttmonoi set
742: bfDttmonoi length /nmono set
743: 0 1 nmono 1 sub {/j set
744: bfDttmonoi j get syzi mul /syzij set
745: 0 1 d 1 sub {/k set
746: syzij [[bftt k get expand (0).]] replace /syzij set
747: syzij [[bfDtt k get ee k get expand]] replace /syzij set
748: } for
749: syzij [[(h). (1).]] replace /syzij set
750: syzij (0). eq { }{syzij} ifelse
751: } for
752: } for
753: ] def
754:
755: %(psi2image obtained.) message
756: %(ideg = ) messagen ideg ::
757: %(psi1ker = ) message psi1ker ::
758: %(psi2image =) message psi2image ::
759:
760: %% Computes the quotient module psi1ker/psi2image
761: psi1ker length /nker set
762: nker 0 eq {
763: [0 [ ]] /cohom set
764: }{
765: psi2image length /nim set
766: psi1ker psi2image join /psiall set
767: psiall {homogenize} map /psiall set
768: [psiall [(needSyz)]] groebner 2 get /psisyz set
769: psisyz {nker proj vector_to_poly [[(h). (1).]] replace} map /cohom set
770: cohom {remove0} map /cohom set
771: cohom length 0 eq {
772: [nker [ ]] /cohom set
773: }{
774: cohom {homogenize} map /cohom set
775: [cohom] groebner 0 get reducedBase /cohom set
776: cohom {[[(h). (1).]] replace} map /cohom set
777: [nker cohom] trimModule /cohom set
778: } ifelse
779: } ifelse
780: cohomlist [cohom] join /cohomlist set
781: 0 ideg sub print (-th cohomology: ) messagen
782: cohom ::
783: } for
784:
785: cohomlist /arg1 set
786: ] pop
787: popVariables
788: arg1
789: } def
790:
791:
792: % Reduce the module representation A^r/[P_1,...,P_m]
793: % by trimming unnecessary higher degree terms
794: % [r [P1,...,p_m]] reduceModule --> [r1, [Q_1,...,Q_m1]]
795: % The current ring must have @@@.esymbol as the highest degree variable.
796: /trimModule {
797: /arg1 set
798: [ /r /ff /ffins /nff /i /ei /j /fj /fjin /qij /fjdeg ] pushVariables
799: [
800: arg1 0 get /r set
801: arg1 1 get /ff set
802: ff {homogenize} map /ff set
803: [ff] groebner 0 get reducedBase {[[(h). (1).]] replace} map /ff set
804: ff {init [[(h). (1).]] replace} map /ffins set
805: ff length /nff set
806:
807: r 1 sub -1 0 {/i set
808: @@@.esymbol . i npower /ei set
809: 0 1 nff 1 sub {/j set
810: 0 /eifound set
811: ff j get /fj set
812: ffins j get /fjin set
813: ei [fjin] reduction 0 get /qij set
814: qij (0). eq {
815: 1 /eifound set
816: 1 break
817: }{ } ifelse
818: } for
819: eifound 0 eq break
820: } for
821: << eifound 1 eq >> << i 0 eq >> and {
822: 0 /r set
823: }{
824: i 1 add /r set
825: } ifelse
826: /gg [ 0 1 nff 1 sub {/j set
827: ff j get /fj set
828: fj @@@.esymbol . coefficients 0 get 0 get (integer) dc /fjdeg set
829: fjdeg r lt {fj}{ } ifelse
830: } for ] def
831: [r gg] /arg1 set
832: ] pop
833: popVariables
834: arg1
835: } def
836:
837: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
838: % syzygyV.sm1 ... free resolution adapted to the V-filtration
839: % w.r.t. tt = (t_1,...,t_d) using h-homogenization.
840: % usage: Equations tt deg syzygyV
841: % Oct. 21, 1997 --- by T.Oaku
842: % Version 19971021
843: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844: %% Computing a free resolution compatible with the V-filtration
845: %% w.r.t. tt
846: /syzygyV {
847: /arg3 set %% rdegmax
848: /arg2 set %% tt
849: /arg1 set %% ff
850: [
851: /ff /tt /rdegmax /ttxx /aa /d /i /syzlist /rdeg
852: /nff /mvec /estr /ee /edeg /dffi /r0 /syzpoly
853: /syzi /syzij /syzpolyi /j
854: /gbase /o.syz /syzlist /mvecist
855: /r1 /m1vec /gbi /nonzero /gbijc /gbijd /gbij /maxtmp /max0 /gbase1
856: /m0vec
857: ] pushVariables
858: [
859: arg1 /ff set
860: arg2 /tt set
861: arg3 /rdegmax set
862:
863: BFvarlist /ttxx set
864: BFparlist /aa set
865: tt length /d set
866:
867: ttxx tt setminus /xx set
868:
869: [ ] /syzlist set
870: [ ] /mveclist set
871:
872: %% start the loop (the counter rdeg represents the degree of the resolution)
873: 0 1 rdegmax {/rdeg set
874: ff length /nff set
875:
876: %% r is the number of graduation variables;
877: %% ff is a list of r0-vectors;
878: %% r = r0 from the 2nd step (i.e. for rdeg >= 1);
879: %% ee = [(u_1),...,(u_r)] or [@@@.esymbol] (in the 1st step).
880: %% From
881: %% ff
882: %% ... <--- D_X^{r0} <--- D_X^{nff},
883: %% computes
884: %% gbase syz
885: %% ... <--- D_X^{r0} <--- D_X^{r1} <--- D_X^{r2}.
886: %% m0vec m1vec m2vec
887:
888: rdeg 0 eq {
889: 1 /r set
890: [@@@.esymbol] /ee set
891: [ 0 ] /mvec set
892: [ 0 ] /mvec0 set
893: }{
894: r1 /r set
895: r1 /r0 set
896: m1vec /mvec set
897: BFu /estr set
898: /ee
899: [ 1 1 r {/i set
900: estr i toString 2 cat_n} for ]
901: def
902: } ifelse
903:
904: %% (Set up a ring with mvec = ) messagen mvec ::
905: ee tt xx mvec setupDringVshift
906:
907: rdeg 0 eq {
908: 0 /edeg set
909: 0 1 nff 1 sub {/i set
910: ff i get expand /ffi set
911: ffi @@@.esymbol . coefficients 0 get 0 get (integer) dc /dffi set
912: dffi edeg gt { dffi /edeg set}{ } ifelse
913: } for
914: edeg 1 add /r0 set %% the input ff is a list of r0-vectors
915: /m0vec [ 1 1 r0 {pop 0} for ] def
916: }{
917: o.syz length /nff set
918: /syzpoly [ 0 1 nff 1 sub {/i set
919: o.syz i get /syzi set
920: (0). /syzpolyi set
921: 0 1 r1 1 sub {/j set
922: syzi j get (string) dc expand /syzij set
923: syzij << ee j get expand >> mul /syzij set
924: syzpolyi syzij add /syzpolyi set
925: } for
926: syzpolyi
927: } for ] def
928: syzpoly {(string) dc} map /ff set
929: } ifelse
930:
931: mveclist [m0vec] join /mveclist set
932:
933: ff {expand [[(h). (1).]] replace homogenize} map /ff set
934: [ff] groebner 0 get reducedBase /gbase set
935: [gbase [(needSyz)]] groebner 2 get /o.syz set
936:
937: gbase length /r1 set
938: o.syz length /nff set
939:
940: 0 rdeg eq {
941: gbase {tt fwh_order} map /m1vec set
942: }{
943: /m1vec [
944: 0 1 r1 1 sub {/i set
945: gbase i get /gbi set
946: 0 /nonzero set
947: 0 1 r0 1 sub {/j set
948: gbi << ee j get expand >> coefficients /gbijc set
949: gbijc 0 get 0 get (integer) dc /gbijd set
950: gbijd 0 eq { }{
951: gbijc 1 get 0 get /gbij set
952: gbij tt fwh_order m0vec j get add /maxtmp set
953: nonzero 0 eq { maxtmp /max0 set }{
954: maxtmp max0 gt { maxtmp /max0 set }{ } ifelse
955: } ifelse
956: 1 /nonzero set
957: } ifelse
958: } for
959: max0 } for ] def
960: } ifelse
961:
962: rdeg 0 eq {
963: gbase {[[(h). (1).]] replace (string) dc} map /gbase1 set
964: }{
965: /gbase1 [ 0 1 r1 1 sub {/i set
966: gbase i get /gbi set
967: [ 0 1 r0 1 sub {/j set
968: gbi << ee j get expand >> coefficients /gbijc set
969: gbijc 0 get 0 get (integer) dc /gbijd set
970: gbijd 0 eq { (0) }{
971: gbijc 1 get 0 get [[(h). (1).]] replace (string) dc
972: } ifelse
973: } for ]
974: } for ] def
975: } ifelse
976:
977: syzlist [gbase1] join /syzlist set
978: m1vec /m0vec set
979:
980: o.syz length 0 eq {
981: syzlist [o.syz] join /syzlist set
982: mveclist [m1vec] join /mveclist set
983: 1 break
984: }{ } ifelse
985: } for
986: [syzlist mveclist] /arg1 set
987: ] pop
988: popVariables
989: arg1
990: } def
991: %%%%%%%%%%%%%%%%%%%%%%%%% Libraries %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
992: %% set up a ring for the shifted V-weight given by mvec:
993: %% ee tt xx mvec setupDringVshift
994: %% ee = [e_1,...,e_r], tt = [t_1,...,t_d], xx = [x_1,...,x_n]
995: %% BFparlist = [a_1,...,a_m] (global variable)
996:
997: /setupDringVshift {
998: /arg4 set /arg3 set /arg2 set /arg1 set
999: [
1000: /ee /xx /tt /aa /mvec /allvarlist /allDvarlist /r /n /m /d /i /j /k
1001: % /Dee /Dxx /Dtt /Daa /dnm /rdnm /mat1 /mat2 /mat3 /mat4
1002: ] pushVariables
1003: [
1004: arg1 /ee set
1005: arg2 /tt set
1006: arg3 /xx set
1007: arg4 /mvec set
1008: BFparlist /aa set
1009:
1010: /allvarlist
1011: ee tt join xx join aa join [(H)] join
1012: def
1013:
1014: ee length /r set
1015: tt length /d set
1016: xx length /n set
1017: aa length /m set
1018:
1019: d n add m add /dnm set
1020: r dnm add /rdnm set
1021:
1022: ee {xtoDx} map /Dee set
1023: tt {xtoDx} map /Dtt set
1024: xx {xtoDx} map /Dxx set
1025: aa {xtoDx} map /Daa set
1026:
1027: /allDvarlist
1028: Dee Dtt join Dxx join Daa join [(h)] join
1029: def
1030:
1031: allvarlist reverse /mat1 set allDvarlist reverse /mat2 set
1032: [0 1 1 1 rdnm 1 add 1 1 1 dnm 1 add] /mat3 set
1033: [
1034: [ 0 1 r 1 sub {/i set mvec i get} for %%[(e_1) mvec_1...(e_r) mvec_r
1035: 1 1 d {pop -1} for %% (t_1) -1 ... (t_d) -1
1036: 1 1 n {pop 0 } for %% (x_1) 0 ... (x_n) 0
1037: 1 1 m {pop 0 } for %% (a_1) 0 ... (a_m) 0
1038: 0 %% (H) 0
1039: 1 1 r {pop 0 } for %% (E_1) 0 ... (E_d) 0
1040: 1 1 d {pop 1 } for %% (Dt_1) 1 ... (Dt_d) 1
1041: 1 1 n {pop 0 } for %% (Dx_1) 0 ... (Dx_n) 0
1042: 1 1 m {pop 0 } for %% (Da_1) 0 ... (Da_m) 0
1043: 0 %% (h) 0 ]
1044: ]
1045: [ 1 1 r {pop 1 } for %%[(e_1) 1 ... (e_r) 1
1046: 1 1 d {pop 1 } for %% (t_1) 1 ... (t_d) 1
1047: 1 1 n {pop 1 } for %% (x_1) 1 ... (x_n) 1
1048: 1 1 m {pop 0 } for %% (a_1) 0 ... (a_m) 0
1049: 0 %% (H) 0
1050: 1 1 r {pop 0 } for %% (E_1) 0 ... (E_d) 0
1051: 1 1 d {pop 1 } for %% (Dt_1) 1 ... (Dt_d) 1
1052: 1 1 n {pop 1 } for %% (Dx_1) 1 ... (Dx_n) 1
1053: 1 1 m {pop 0 } for %% (Da_1) 0 ... (Da_m) 0
1054: 0 %% (h) 0 ]
1055: ]
1056: [ 1 1 r {pop 0 } for %%[(e_1) 0 ... (e_r) 0
1057: 1 1 d {pop 0 } for %% (t_1) 0 ... (t_d) 0
1058: 1 1 n {pop 0 } for %% (x_1) 0 ... (x_n) 0
1059: 1 1 m {pop 1 } for %% (a_1) 1 ... (a_m) 1
1060: 0 %% (H) 0
1061: 1 1 r {pop 0 } for %% (E_1) 0 ... (E_d) 0
1062: 1 1 d {pop 0 } for %% (Dt_1) 0 ... (Dt_d) 0
1063: 1 1 n {pop 0 } for %% (Dx_1) 0 ... (Dx_n) 0
1064: 1 1 m {pop 0 } for %% (Da_1) 0 ... (Da_m) 0
1065: 0 %% (h) 0 ]
1066: ]
1067: rdnm 1 sub -1 0 {/i set
1068: [
1069: 0 1 rdnm {pop 0} for
1070: 0 1 rdnm 1 sub {/j set
1071: i j eq { -1 }{ 0 } ifelse
1072: } for
1073: 0
1074: ]
1075: } for
1076: rdnm 1 sub -1 0 {/i set
1077: [
1078: 0 1 rdnm 1 sub {/j set
1079: i j eq { -1 }{ 0 } ifelse
1080: } for
1081: 0
1082: 0 1 rdnm {pop 0} for
1083: ]
1084: } for
1085: [ 0 1 rdnm {pop 0} for
1086: 0 1 rdnm 1 sub {pop 0} for
1087: 1
1088: ]
1089: ] /mat4 set
1090: mat1 mat2 mat3 mat4 [(mpMult) (diff)] set_up_ring@
1091: (red@) (module1) switch_function
1092: (grade) (module1) switch_function
1093: ] pop
1094: popVariables
1095: } def
1096:
1097: /remove0 {
1098: /arg1 set
1099: arg1 (0). eq
1100: { } {arg1} ifelse
1101: } def
1102:
1103: %% return a list of monomials of degree m with m0 <= m <= m1
1104: %% usage: [(t1) ... (td)] m monomials
1105: /monomials {
1106: /arg3 set %% m1 (integer)
1107: /arg2 set %% m0 (integer)
1108: /arg1 set %% [(t1)., ... ,(td).] (polynonmial list)
1109: [/bftt /m /m0 /m1 /d /i /mns0 /j /n /Mn /k ] pushVariables
1110: [
1111: arg1 /bftt set
1112: arg2 /m0 set
1113: arg3 /m1 set
1114:
1115: bftt length /d set
1116: d 0 eq { /mns [ ] def}{
1117: d 1 eq {
1118: /mns [ m0 1 m1 { /i set
1119: i -1 gt {bftt 0 get i npower}{ } ifelse
1120: } for ] def
1121: }
1122: {
1123: /mns [ 0 1 m1 { /i set
1124: bftt rest i i monomials /mns0 set
1125: mns0 length /n set
1126: 0 1 n 1 sub { /j set
1127: mns0 j get /Mn set
1128: m0 i sub /m set
1129: m 0 lt { 0 /m set }{ } ifelse
1130: m 1 m1 i sub { /k set
1131: << bftt 0 get k npower >> Mn mul
1132: } for
1133: } for
1134: } for ] def
1135: } ifelse } ifelse
1136: mns /arg1 set
1137: ] pop
1138: popVariables
1139: arg1
1140: } def
1141:
1142: %% projection to the first m componets of a vector
1143: %% [P1,...,Pm,...] m proj ---> [P1,...,Pm]
1144: /proj {
1145: /arg2 set
1146: /arg1 set
1147: [/n /m /vec /projvec] pushVariables
1148: [
1149: arg2 /m set
1150: arg1 /vec set
1151: vec length /n set
1152:
1153: /projvec [
1154: vec aload
1155: 0 1 << n m sub >> { pop pop } for
1156: ] def
1157:
1158: projvec /arg1 set
1159: ] pop
1160: popVariables
1161: arg1
1162: } def
1163:
1164: /notidentical {
1165: /arg2 set
1166: /arg1 set
1167: arg1 arg2 eq
1168: { } {arg1} ifelse
1169: } def
1170:
1171: %% [u1,...] [v1,...] setminus --> [u1,...] \setminus [v1,...]
1172: /setminus {
1173: /arg2 set /arg1 set
1174: [ /Set1 /Set2 /n2 /i ] pushVariables
1175: [
1176: arg1 /Set1 set arg2 /Set2 set
1177: Set2 length /n2 set
1178: 0 1 n2 1 sub {/i set
1179: Set1 Set2 i get complement.oaku /Set1 set
1180: } for
1181: Set1 /arg1 set
1182: ] pop
1183: popVariables
1184: arg1
1185: } def
1186:
1187: %% (list arg1) \setminus {(an element arg2)}
1188: /complement.oaku {
1189: /arg2 set /arg1 set
1190: arg1 { arg2 notidentical } map
1191: } def
1192:
1193: %% convert a polynomial to one in the current ring
1194: /reexpand {
1195: /arg1 set
1196: arg1 {(string) dc expand} map
1197: } def
1198:
1199: %% Op (poly) [(t1) (t2) ...] fwh_order ---> FW-ord(Op) (integer)
1200: %% The current ring must be adapted to the V-filtration!
1201: /fwh_order {
1202: /arg2 set %% bftt (string list)
1203: /arg1 set %% Op (poly)
1204: [/Op /bftt /fws /m /fwsDt /k /d /i /tt /dtt] pushVariables
1205: [
1206: arg1 /Op set
1207: arg2 /bftt set
1208: Op init /fws set
1209: bftt length /d set
1210: 0 /k set
1211: 0 /m set
1212: 0 1 d 1 sub { /i set
1213: /tt bftt i get expand def
1214: /dtt bftt i get xtoDx expand def
1215: fws dtt coefficients 0 get 0 get (integer) dc m add /m set
1216: fws tt coefficients 0 get 0 get (integer) dc k add /k set
1217: } for
1218: m k sub (integer) data_conversion /arg1 set
1219: ] pop
1220: popVariables
1221: arg1
1222: } def
1223:
1224: %% FW-homogenization
1225: %% Op (string) [(t1) (t2) ...] fw_homogenize ---> h(Op) (string)
1226: /fwm_homogenize {
1227: /arg2 set %% bft (string list)
1228: /arg1 set %% an operator (string)
1229: [ /bftt /bft /bfDt /bfht /bfhDt /Op /degs /m /mn /d /i ] pushVariables
1230: [
1231: /Op arg1 expand def
1232: /bftt arg2 def
1233: bftt length /d set
1234:
1235: 0 1 d 1 sub { /i set
1236: bftt i get /bft set
1237: bft xtoDx /bfDt set
1238: BFs (^(-1)*) bft 3 cat_n /bfht set
1239: BFs (*) bfDt 3 cat_n /bfhDt set
1240: Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
1241: /Op set
1242: } for
1243: Op BFs expand coefficients 0 get
1244: {(integer) data_conversion} map /degs set
1245: degs << degs length 1 sub >> get /m set
1246: 0 m sub /mn set
1247: << BFs expand mn powerZ >> Op mul /Op set
1248: Op (string) data_conversion /arg1 set
1249: ] pop
1250: popVariables
1251: arg1
1252: } def
1253:
1254: %% FW-principal part of an operator (FW-homogeneous)
1255: %% fw_psi from bfunc.sm1
1256: %% Op (poly) fw_symbol ---> FW-symbol(Op) (poly)
1257: /fw_symbol {
1258: [[(h). (1).]] replace (s). coefficients 1 get 0 get
1259: } def
1260:
1261: %% FW-homogenization
1262: %% Op (string) (t) fw_homogenize ---> h(Op) (string)
1263: /fw_homogenize {
1264: /arg2 set %% bft (string)
1265: /arg1 set %% an operator (string)
1266: [ /bft /bfDt /bfht /bfhDt /Op /degs /m /mn ] pushVariables
1267: [
1268: /Op arg1 expand def
1269: /bft arg2 def
1270: bft xtoDx /bfDt set
1271: BFs (^(-1)*) bft 3 cat_n /bfht set
1272: BFs (*) bfDt 3 cat_n /bfhDt set
1273: Op [[bft expand bfht expand][bfDt expand bfhDt expand]] replace
1274: /Op set
1275: Op BFs expand coefficients 0 get
1276: {(integer) data_conversion} map /degs set
1277: degs << degs length 1 sub >> get /m set
1278: 0 m sub /mn set
1279: << BFs expand mn powerZ >> Op mul /Op set
1280: Op (string) data_conversion /arg1 set
1281: ] pop
1282: popVariables
1283: arg1
1284: } def
1285:
1286: %% get the FW-order
1287: %% Op (poly) (t) fw_order ---> FW-ord(Op) (integer)
1288: %% Op should be FW-homogenized.
1289: /fw_order {
1290: /arg2 set %% bft (string)
1291: /arg1 set %% Op (poly)
1292: [/Op /bft /fws /m /fwsDt /k /tt /dtt] pushVariables
1293: [
1294: arg1 /Op set
1295: arg2 /bft set
1296: Op fw_symbol /fws set
1297: /tt bft expand def
1298: /dtt bft xtoDx expand def
1299: fws [[BFs expand (1).]] replace /fws set
1300: fws dtt coefficients 0 get 0 get /m set
1301: fws dtt coefficients 1 get 0 get /fwsDt set
1302: fwsDt tt coefficients 0 get 0 get /k set
1303: m k sub (integer) data_conversion /arg1 set
1304: ] pop
1305: popVariables
1306: arg1
1307: } def
1308:
1309: %% psi(P)(s)
1310: %% Op (poly) (t) (string) fw_psi ---> psi(P) (poly)
1311: %% Op should be FW-homogeneous.
1312: /fw_psi {
1313: /arg2 set %% bft (string)
1314: /arg1 set %% Op (polynomial)
1315: [/bft /bfDt /P /tt /dtt /k /Q /i /m /kk /PPt /PPC /kk /Ss] pushVariables
1316: [
1317: arg2 /bft set
1318: arg1 fw_symbol /P set
1319: /bfDt bft xtoDx def
1320: /tt bft expand def /dtt bfDt expand def
1321: P bft fw_order /k set
1322: << 1 1 k >>
1323: {pop tt P mul /P set }
1324: for
1325: << -1 -1 k >>
1326: {pop dtt P mul /P set }
1327: for
1328: (0) expand /Q set
1329: P dtt coefficients 0 get length /m set
1330: 0 1 << m 1 sub >>
1331: {
1332: /i set
1333: P dtt coefficients 0 get i get /kk set
1334: kk (integer) data_conversion /kk set
1335: P dtt coefficients 1 get i get /PPt set
1336: PPt tt coefficients 1 get 0 get /PPC set
1337: BFth expand /Ss set
1338: 0 1 << kk 1 sub >> {
1339: pop
1340: PPC Ss mul /PPC set
1341: Ss (1) expand sub /Ss set
1342: } for
1343: Q PPC add /Q set
1344: } for
1345: Q /arg1 set
1346: ] pop
1347: popVariables
1348: arg1
1349: } def
1350:
1351: %% get the FW-order
1352: %% Op (poly) [(t1) (t2) ...] fwm_order ---> FW-ord(Op) (integer)
1353: %% Op should be FW-homogenized.
1354: /fwm_order {
1355: /arg2 set %% bftt (string list)
1356: /arg1 set %% Op (poly)
1357: [/Op /bftt /fws /m /fwsDt /k /d /i /tt /dtt] pushVariables
1358: [
1359: arg1 /Op set
1360: arg2 /bftt set
1361: Op fw_symbol /fws set
1362: fws init /fws set
1363: fws [[BFs expand (1).]] replace /fws set
1364: bftt length /d set
1365: 0 /k set
1366: 0 /m set
1367: 0 1 d 1 sub { /i set
1368: /tt bftt i get expand def
1369: /dtt bftt i get xtoDx expand def
1370: fws dtt coefficients 0 get 0 get (integer) dc m add /m set
1371: fws tt coefficients 0 get 0 get (integer) dc k add /k set
1372: } for
1373: m k sub (integer) data_conversion /arg1 set
1374: ] pop
1375: popVariables
1376: arg1
1377: } def
1378:
1379: %% (x1) --> (Dx1)
1380: /xtoDx {
1381: /arg1 set
1382: @@@.Dsymbol arg1 2 cat_n
1383: } def
1384:
1385: %% [(x1) (x2) (x3)] ---> (x1,x2,x3)
1386: /listtostring {
1387: /arg1 set
1388: [/n /j /ary /str] pushVariables
1389: [
1390: /ary arg1 def
1391: /n ary length def
1392: arg1 0 get /str set
1393: n 1 gt
1394: { str (,) 2 cat_n /str set }{ }
1395: ifelse
1396: 1 1 n 1 sub {
1397: /j set
1398: j n 1 sub eq
1399: {str << ary j get >> 2 cat_n /str set}
1400: {str << ary j get >> (,) 3 cat_n /str set}
1401: ifelse
1402: } for
1403: /arg1 str def
1404: ] pop
1405: popVariables
1406: arg1
1407: } def
1408:
1409: %% converting a vector of polynomials [P1 P2 ...] to P1 + P2*e +...
1410: /vector_to_poly {
1411: /arg1 set
1412: [/aVec /nVec /eForm /j /aVecj ] pushVariables
1413: [
1414: arg1 /aVec set
1415: aVec length /nVec set
1416: (0). /eForm set
1417: 0 1 nVec 1 sub {
1418: /j set
1419: aVec j get /aVecj set
1420: @@@.esymbol . j npower aVecj mul eForm add /eForm set
1421: } for
1422: eForm /arg1 set
1423: ] pop
1424: popVariables
1425: arg1
1426: } def
1427:
1428: %% setup the ring of differential operators with the variables varlist
1429: %% and parameters BFparlist
1430: %% varlist setupBFring
1431: /setupDring {
1432: /arg1 set
1433: [ /varlist /bft /allvarlist /n /dvarlist /D_weight /i
1434: ] pushVariables
1435: [
1436: arg1 /varlist set
1437: /allvarlist
1438: varlist BFparlist join
1439: def
1440: varlist length /n set
1441: varlist {xtoDx} map /dvarlist set
1442: /D_weight
1443: [ [ 0 1 n 1 sub
1444: { /i set dvarlist i get 1 }
1445: for ]
1446: [
1447: 0 1 n 1 sub
1448: { /i set varlist i get 1 }
1449: for ]
1450: ] def
1451:
1452: [ allvarlist listtostring ring_of_differential_operators
1453: D_weight weight_vector
1454: 0] define_ring
1455:
1456: ] pop
1457: popVariables
1458: } def
1459:
1460: %% var (poly) m (integer) ---> var^m (poly)
1461: /powerZ {
1462: /arg2 set %% m
1463: /arg1 set %% Var
1464: [ /m /var /varstr /pow /nvar] pushVariables
1465: [
1466: arg1 /var set
1467: arg2 /m set
1468: var (string) data_conversion /varstr set
1469: m -1 gt
1470: { var m npower /pow set}
1471: { varstr (^(-1)) 2 cat_n expand /nvar set
1472: nvar << 0 m sub >> npower /pow set
1473: }
1474: ifelse
1475: pow /arg1 set
1476: ] pop
1477: popVariables
1478: arg1
1479: } def
1480:
1481:
1482: %% added on April 14, 1998:
1483: %% P [(Dt1). (Dt2). ...] mvec k Vtruncate_below
1484: %% --> the part of P of degree >= mvec - k w.r.t. [(Dt1). ..]
1485:
1486: /Vtruncate_below {
1487: /arg4 set /arg3 set /arg2 set /arg1 set
1488: [/P /bftt /k /Q /InP /DegP /edegP /mvec /i] pushVariables
1489: [
1490: arg1 /P set
1491: arg2 /bftt set
1492: arg3 /mvec set
1493: arg4 /k set
1494: (0). /Q set
1495: {
1496: P (0). eq {exit} { } ifelse
1497: P init /InP set
1498: InP bftt total_degree /DegP set
1499: InP @@@.esymbol . coefficients 0 get 0 get (integer) dc /i set
1500: DegP << k mvec i get sub >> lt { } {InP Q add /Q set } ifelse
1501: P InP sub /P set
1502: } loop
1503: Q /arg1 set
1504: ] pop
1505: popVariables
1506: arg1
1507: } def
1508:
1509: %% P (monomial) [(t1). ,...] total_deg
1510: %% --> the total degree (integer) of P w.r.t. [(t1).,..]
1511: /total_degree {
1512: /arg2 set /arg1 set
1513: [/P /bftt /d /j /PC /tdeg ] pushVariables
1514: [
1515: arg1 /P set
1516: arg2 /bftt set
1517: bftt length /d set
1518: 0 /tdeg set
1519: 0 1 d 1 sub {/j set
1520: P << bftt j get >> coefficients /PC set
1521: PC 0 get 0 get (integer) dc tdeg add /tdeg set
1522: PC 1 get 0 get /P set
1523: } for
1524: tdeg /arg1 set
1525: ] pop
1526: popVariables
1527: arg1
1528: } def
1529:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>