Annotation of OpenXM/src/kan96xx/Doc/ecart.sm1, Revision 1.14
1.14 ! takayama 1: % $OpenXM: OpenXM/src/kan96xx/Doc/ecart.sm1,v 1.13 2003/08/26 12:46:03 takayama Exp $
1.1 takayama 2: %[(parse) (hol.sm1) pushfile] extension
3: %[(parse) (appell.sm1) pushfile] extension
4:
5: (ecart.sm1 : ecart division for D, 2003/07/25 ) message-quiet
6: /ecart.begin { beginEcart } def
7: /ecart.end { endEcart } def
8: /ecart.autoHomogenize 1 def
9: /ecart.needSyz 0 def
1.8 takayama 10: /ecartd.begin {
11: ecart.begin
12: [(EcartAutomaticHomogenization) 1] system_variable
13: } def
14: /ecartd.end {
15: ecart.end
16: [(EcartAutomaticHomogenization) 0] system_variable
17: } def
1.1 takayama 18:
19: /ecart.dehomogenize {
20: /arg1 set
21: [/in.ecart.dehomogenize /ll /rr] pushVariables
22: [
23: /ll arg1 def
24: ll tag 6 eq {
25: ll { ecart.dehomogenize } map /ll set
26: } {
27: ll (0). eq {
28: } {
29: ll getRing /rr set
30: ll [ [ (H) rr ,, (1) rr ,, ]
31: [ (h) rr ,, (1) rr ,, ]] replace
32: /ll set
33: } ifelse
34: } ifelse
35: /arg1 ll def
36: ] pop
37: popVariables
38: arg1
39: } def
40: [(ecart.dehomogenize)
41: [(obj ecart.dehomogenize r)
42: (h->1, H->1)
43: ]] putUsages
44:
45: /ecart.dehomogenizeH {
46: /arg1 set
47: [/in.ecart.dehomogenize /ll /rr] pushVariables
48: [
49: /ll arg1 def
50: ll tag 6 eq {
51: ll { ecart.dehomogenize } map /ll set
52: } {
53: ll (0). eq {
54: } {
55: ll getRing /rr set
56: ll [ [ (H) rr ,, (1) rr ,, ] ] replace
57: /ll set
58: } ifelse
59: } ifelse
60: /arg1 ll def
61: ] pop
62: popVariables
63: arg1
64: } def
65: [(ecart.dehomogenizeH)
66: [(obj ecart.dehomogenizeH r)
67: (H->1, h is not changed.)
68: ]] putUsages
69:
70: /ecart.homogenize01 {
71: /arg1 set
1.11 takayama 72: [/in.ecart.homogenize01 /ll /ll0] pushVariables
1.1 takayama 73: [
74: /ll arg1 def
1.11 takayama 75: ll tag ArrayP eq {
76: ll 0 get tag ArrayP eq not {
77: [(degreeShift) [ ] ll ] homogenize /arg1 set
78: } {
79: ll { ecart.homogenize01 } map /arg1 set
80: } ifelse
81: } {
82: [(degreeShift) [ ] ll ] homogenize /arg1 set
1.12 takayama 83: } ifelse
1.1 takayama 84: ] pop
85: popVariables
86: arg1
87: } def
88: [(ecart.homogenize01)
89: [(obj ecart.homogenize01 r)
90: (Example: )
91: ( [(x1,x2) ring_of_differential_operators )
92: ( [[(H) 1 (h) 1 (x1) 1 (x2) 1] )
93: ( [(h) 1 (Dx1) 1 (Dx2) 1] )
94: ( [(Dx1) 1 (Dx2) 1] )
95: ( [(x1) -1 (x2) -1])
96: ( ] weight_vector )
97: ( 0 )
1.11 takayama 98: ( [(weightedHomogenization) 1 (degreeShift) [[0 0 0]]])
1.1 takayama 99: ( ] define_ring)
100: ( ecart.begin)
101: ( [[1 -4 -2 5]] appell4 0 get /eqs set)
102: ( eqs { . [[(x1). (x1+2).] [(x2). (x2+4).]] replace} map )
1.11 takayama 103: ( {ecart.homogenize01} map /eqs2 set)
1.1 takayama 104: ( [eqs2] groebner )
105: ]] putUsages
106:
107: /ecart.homogenize01_with_shiftVector {
108: /arg2.set
109: /arg1 set
1.11 takayama 110: [/in.ecart.homogenize01 /ll /sv /ll0] pushVariables
1.1 takayama 111: [
112: /sv arg2 def
113: /ll arg1 def
1.11 takayama 114: ll tag ArrayP eq {
115: ll 0 get tag ArrayP eq not {
116: [(degreeShift) sv ll ] homogenize /arg1 set
117: } {
118: ll { ecart.homogenize01_with_shiftVector } map /arg1 set
119: } ifelse
120: } {
121: [(degreeShift) sv ll ] homogenize /arg1 set
1.12 takayama 122: } ifelse
1.1 takayama 123: ] pop
124: popVariables
125: arg1
126: } def
127: [(ecart.dehomogenize01_with_degreeShift)
128: [(obj shift-vector ecart.dehomogenize01_with_degreeShift r)
1.11 takayama 129: (cf. homogenize)
1.1 takayama 130: ]] putUsages
131:
132: %% Aux functions to return the default weight vectors.
133: /ecart.wv1 {
134: /arg1 set
135: [/in.ecart.wv1 /v] pushVariables
136: [
137: /v arg1 def
138: [(H) (h) v to_records pop] /v set
139: v { 1 } map /v set
140: /arg1 v def
141: ] pop
142: popVariables
143: arg1
144: } def
145: /ecart.wv2 {
146: /arg1 set
147: [/in.ecart.wv2 /v] pushVariables
148: [
149: /v arg1 def
150: [v to_records pop] /v set
151: v { [ @@@.Dsymbol 3 -1 roll ] cat 1 } map /v set
152: [(h) 1 ] v join /v set
153: /arg1 v def
154: ] pop
155: popVariables
156: arg1
157: } def
158:
1.7 takayama 159: /ecart.gb {ecartd.gb} def
160:
161: [(ecart.gb)
162: [(a ecart.gb b)
163: (array a; array b;)
164: $b : [g ii]; array g; array in; g is a standard (Grobner) basis of f$
165: ( in the ring of differential operators.)
166: (The computation is done by using Ecart division algorithm and )
167: (the double homogenization.)
168: (cf. M.Granger and T.Oaku: Minimal filtered free resolutions ... 2003)
169: $ ii is the initial ideal in case of w is given or <<a>> belongs$
170: $ to a ring. In the other cases, it returns the initial monominal.$
171: (a : [f ]; array f; f is a set of generators of an ideal in a ring.)
172: (a : [f v]; array f; string v; v is the variables. )
173: (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
174: (a : [f v w ds]; array f; string v; array of array w; w is the weight matirx.)
1.11 takayama 175: ( array ds; ds is the degree shift for the ring. )
176: (a : [f v w ds hdShift]; array f; string v; array of array w; w is the weight matirx.)
177: ( array ds; ds is the degree shift for the ring. )
178: ( array hsShift is the degree shift for the homogenization. cf.homogenize )
179: $a : [f v w ds (no)]; array f; string v; array of array w; w is the weight matirx.$
180: ( No automatic homogenization.)
1.7 takayama 181: ( )
182: $cf. ecarth.gb (homogenized), ecartd.gb (dehomogenize) $
183: ( )
184: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
185: $ [ [ (Dx) 1 ] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecart.gb pmat ; $
186: (Example 2: )
187: $ [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
1.9 takayama 188: $ [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] ecart.gb /ff set ff pmat ;$
189: (To set the current ring to the ring in which ff belongs )
190: ( ff getRing ring_def )
1.7 takayama 191: ( )
192: $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
193: $ [ [ (Dx) 1 (Dy) 1] ] ] ecart.gb pmat ; $
1.10 takayama 194: ( This example will cause an error on order.)
1.7 takayama 195: ( )
196: $Example 4: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
197: $ [ [ (x) -1 (y) -1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecart.gb pmat ; $
1.10 takayama 198: ( This example will cause an error on order.)
1.7 takayama 199: ( )
200: $Example 5: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
201: $ [ [(Dx) 1 (Dy) 1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1] ] [[0 1] [-3 1] ] ] ecart.gb pmat ; $
202: ( )
203: (cf. gb, groebner, ecarth.gb, ecartd.gb, ecart.syz, ecart.begin, ecart.end, ecart.homogenize01, )
204: ( ecart.dehomogenize, ecart.dehomogenizeH)
205: ( [(weightedHomogenization) 1 (degreeShift) [[1 2 1]]] : options for )
206: ( define_ring )
207: (/ecart.autoHomogenize 0 def )
208: ( not to dehomogenize and homogenize)
209: ]] putUsages
210:
1.1 takayama 211: /ecart.gb.verbose 1 def
1.12 takayama 212: %ecarth.gb s(H)-homogenized outputs. GG's original version of ecart gb.
1.7 takayama 213: /ecarth.gb {
1.1 takayama 214: /arg1 set
1.7 takayama 215: [/in-ecarth.gb /aa /typev /setarg /f /v
1.1 takayama 216: /gg /wv /vec /ans /rr /mm
217: /degreeShift /env2 /opt /ans.gb
1.12 takayama 218: /hdShift
1.1 takayama 219: ] pushVariables
220: [(CurrentRingp) (KanGBmessage)] pushEnv
221: [
222: /aa arg1 def
1.13 takayama 223: aa isArray { } { ( << array >> ecarth.gb) error } ifelse
1.1 takayama 224: /setarg 0 def
225: /wv 0 def
226: /degreeShift 0 def
1.12 takayama 227: /hdShift 0 def
1.1 takayama 228: /opt [(weightedHomogenization) 1] def
229: aa { tag } map /typev set
230: typev [ ArrayP ] eq
231: { /f aa 0 get def
232: /v gb.v def
233: /setarg 1 def
234: } { } ifelse
235: typev [ArrayP StringP] eq
236: { /f aa 0 get def
237: /v aa 1 get def
238: /setarg 1 def
239: } { } ifelse
240: typev [ArrayP RingP] eq
241: { /f aa 0 get def
242: /v aa 1 get def
243: /setarg 1 def
244: } { } ifelse
245: typev [ArrayP ArrayP] eq
246: { /f aa 0 get def
247: /v aa 1 get from_records def
248: /setarg 1 def
249: } { } ifelse
250: typev [ArrayP StringP ArrayP] eq
251: { /f aa 0 get def
252: /v aa 1 get def
253: /wv aa 2 get def
254: /setarg 1 def
255: } { } ifelse
256: typev [ArrayP ArrayP ArrayP] eq
257: { /f aa 0 get def
258: /v aa 1 get from_records def
259: /wv aa 2 get def
260: /setarg 1 def
261: } { } ifelse
262: typev [ArrayP StringP ArrayP ArrayP] eq
263: { /f aa 0 get def
264: /v aa 1 get def
265: /wv aa 2 get def
266: /degreeShift aa 3 get def
267: /setarg 1 def
268: } { } ifelse
1.12 takayama 269:
270: typev [ArrayP StringP ArrayP ArrayP ArrayP] eq
271: { /f aa 0 get def
272: /v aa 1 get def
273: /wv aa 2 get def
274: /degreeShift aa 3 get def
275: /hdShift aa 4 get def
276: /setarg 1 def
277: } { } ifelse
1.1 takayama 278: typev [ArrayP ArrayP ArrayP ArrayP] eq
279: { /f aa 0 get def
280: /v aa 1 get from_records def
281: /wv aa 2 get def
282: /degreeShift aa 3 get def
283: /setarg 1 def
284: } { } ifelse
1.12 takayama 285: typev [ArrayP ArrayP ArrayP ArrayP ArrayP] eq
286: { /f aa 0 get def
287: /v aa 1 get from_records def
288: /wv aa 2 get def
289: /degreeShift aa 3 get def
290: /hdShift aa 4 get def
291: /setarg 1 def
292: } { } ifelse
293: typev [ArrayP ArrayP ArrayP ArrayP StringP] eq
294: { /f aa 0 get def
295: /v aa 1 get from_records def
296: /wv aa 2 get def
297: /degreeShift aa 3 get def
298: aa 4 get (no) eq {
299: /hdShift -1 def
300: } {
301: (Unknown keyword for the 5th argument) error
302: } ifelse
303: /setarg 1 def
304: } { } ifelse
1.13 takayama 305: typev [ArrayP StringP ArrayP ArrayP StringP] eq
306: { /f aa 0 get def
307: /v aa 1 get def
308: /wv aa 2 get def
309: /degreeShift aa 3 get def
310: aa 4 get (no) eq {
311: /hdShift -1 def
312: } {
313: (Unknown keyword for the 5th argument) error
314: } ifelse
315: /setarg 1 def
316: } { } ifelse
1.1 takayama 317:
318: /env1 getOptions def
319:
1.12 takayama 320: ecart.gb.verbose { $ecarth.gb computes std basis with h-s(H)-homogenized buchberger algorithm.$ message } { } ifelse
321: setarg { } { (ecarth.gb : Argument mismatch) error } ifelse
1.1 takayama 322:
323: [(KanGBmessage) ecart.gb.verbose ] system_variable
324:
325: %%% Start of the preprocess
326: v tag RingP eq {
327: /rr v def
328: }{
329: f getRing /rr set
330: } ifelse
331: %% To the normal form : matrix expression.
332: f gb.toMatrixOfString /f set
333: /mm gb.itWasMatrix def
334:
335: rr tag 0 eq {
336: %% Define our own ring
337: v isInteger {
338: (Error in gb: Specify variables) error
339: } { } ifelse
340: wv isInteger {
341: [v ring_of_differential_operators
1.6 takayama 342: % [ v ecart.wv1 v ecart.wv2 ] weight_vector
1.3 takayama 343: gb.characteristic
1.1 takayama 344: opt
345: ] define_ring
346: }{
347: degreeShift isInteger {
348: [v ring_of_differential_operators
1.6 takayama 349: % [v ecart.wv1 v ecart.wv2] wv join weight_vector
350: wv weight_vector
1.3 takayama 351: gb.characteristic
1.1 takayama 352: opt
353: ] define_ring
354:
355: }{
356: [v ring_of_differential_operators
1.6 takayama 357: % [v ecart.wv1 v ecart.wv2] wv join weight_vector
358: wv weight_vector
1.3 takayama 359: gb.characteristic
1.1 takayama 360: [(degreeShift) degreeShift] opt join
361: ] define_ring
362:
363: } ifelse
364: } ifelse
365: } {
366: %% Use the ring structre given by the input.
367: v isInteger not {
368: gb.warning {
369: (Warning : the given ring definition is not used.) message
370: } { } ifelse
371: } { } ifelse
372: rr ring_def
373: /wv rr gb.getWeight def
374:
375: } ifelse
376: %%% Enf of the preprocess
377:
378: ecart.gb.verbose {
1.6 takayama 379: (The first and the second weight vectors for automatic homogenization: )
1.1 takayama 380: message
381: v ecart.wv1 message
382: v ecart.wv2 message
383: degreeShift isInteger { }
384: {
385: (The degree shift is ) messagen
386: degreeShift message
387: } ifelse
388: } { } ifelse
389:
1.5 takayama 390: %%BUG: case of v is integer
391: v ecart.checkOrder
392:
1.1 takayama 393: ecart.begin
394:
395: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
1.13 takayama 396:
1.12 takayama 397:
398: hdShift tag 1 eq {
399: ecart.autoHomogenize not hdShift -1 eq or {
400: % No automatic h-s-homogenization.
401: f { {. } map} map /f set
402: } {
403: % Automatic h-s-homogenization without degreeShift
1.13 takayama 404: (ecarth.gb: Input polynomial or vectors are automatically h-H-homogenized without degree shift.)
405: message
1.12 takayama 406: f { {. ecart.dehomogenize} map} map /f set
407: f ecart.homogenize01 /f set
408: } ifelse
409: } {
410: % Automatic h-s-homogenization with degreeShift
1.13 takayama 411: (ecarth.gb: Input polynomial or vectors are automatically h-H-homogenized with degree shift.)
412: message
1.12 takayama 413: f { {. ecart.dehomogenize} map} map /f set
414: f {/fi set [(degreeShift) hdShift fi] homogenize} map /f set
415: }ifelse
416:
1.1 takayama 417: ecart.needSyz {
418: [f [(needSyz)] gb.options join ] groebner /gg set
419: } {
420: [f gb.options] groebner 0 get /gg set
421: } ifelse
422:
423: ecart.needSyz {
424: mm {
425: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
1.11 takayama 426: } { /ans.gb gg 0 get def } ifelse
427: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
428: % ans pmat ;
1.1 takayama 429: } {
430: wv isInteger {
431: /ans [gg gg {init} map] def
432: }{
1.10 takayama 433: degreeShift isInteger {
434: /ans [gg gg {wv 0 get weightv init} map] def
435: } {
436: /ans [gg gg {[wv 0 get weightv degreeShift 0 get ] init} map] def
437: } ifelse
1.1 takayama 438: }ifelse
439:
440: %% Postprocess : recover the matrix expression.
441: mm {
442: ans { /tmp set [mm tmp] toVectors } map
443: /ans set
444: }{ }
445: ifelse
446: } ifelse
447:
448: ecart.end
449:
450: %%
451: env1 restoreOptions %% degreeShift changes "grade"
452:
453: /arg1 ans def
454: ] pop
455: popEnv
456: popVariables
457: arg1
458: } def
1.7 takayama 459: (ecarth.gb ) messagen-quiet
1.1 takayama 460:
1.7 takayama 461: [(ecarth.gb)
462: [(a ecarth.gb b)
1.1 takayama 463: (array a; array b;)
464: $b : [g ii]; array g; array in; g is a standard (Grobner) basis of f$
465: ( in the ring of differential operators.)
1.12 takayama 466: (The computation is done by using Ecart division algorithm.)
467: $Buchberger algorithm is applied for double h-H(s)-homogenized elements and$
468: (they are not dehomogenized.)
1.1 takayama 469: (cf. M.Granger and T.Oaku: Minimal filtered free resolutions ... 2003)
470: $ ii is the initial ideal in case of w is given or <<a>> belongs$
471: $ to a ring. In the other cases, it returns the initial monominal.$
472: (a : [f ]; array f; f is a set of generators of an ideal in a ring.)
473: (a : [f v]; array f; string v; v is the variables. )
474: (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
475: (a : [f v w ds]; array f; string v; array of array w; w is the weight matirx.)
476: ( array ds; ds is the degree shift )
477: ( )
478: (/ecart.autoHomogenize 0 def )
479: ( not to dehomogenize and homogenize)
480: ( )
481: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
1.7 takayama 482: $ [ [ (Dx) 1 ] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecarth.gb pmat ; $
1.1 takayama 483: (Example 2: )
484: (To put H and h=1, type in, e.g., )
485: $ [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
1.7 takayama 486: $ [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] ecarth.gb /gg set gg ecart.dehomogenize pmat ;$
1.1 takayama 487: ( )
488: $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
1.7 takayama 489: $ [ [ (Dx) 1 (Dy) 1] ] ] ecarth.gb pmat ; $
1.1 takayama 490: ( )
491: $Example 4: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
1.7 takayama 492: $ [ [ (x) -1 (y) -1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecarth.gb pmat ; $
1.1 takayama 493: ( )
494: $Example 5: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
1.7 takayama 495: $ [ [(Dx) 1 (Dy) 1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1] ] [[0 1] [-3 1] ] ] ecarth.gb pmat ; (buggy infinite loop)$
1.1 takayama 496: ( )
1.7 takayama 497: (cf. gb, groebner, ecart.gb, ecartd.gb, ecart.syz, ecart.begin, ecart.end, ecart.homogenize01, )
1.1 takayama 498: ( ecart.dehomogenize, ecart.dehomogenizeH)
499: ( [(weightedHomogenization) 1 (degreeShift) [[1 2 1]]] : options for )
500: ( define_ring )
501: ]] putUsages
502:
503:
504: /ecart.syz {
505: /arg1 set
506: [/in-ecart.syz /ecart.save.needSyz /ff /ff.ans] pushVariables
507: [
508: /ff arg1 def
509: /ecart.save.needSyz ecart.needSyz def
510: /ecart.needSyz 1 def
511: ff ecart.gb /ff.ans set
512: /ecart.needSyz ecart.save.needSyz def
513: /arg1 ff.ans def
514: ] pop
515: popVariables
516: arg1
517: } def
518: (ecart.syz ) messagen-quiet
519:
520: [(ecart.syz)
521: [(a ecart.syz b)
522: (array a; array b;)
523: $b : [syzygy gb tmat input]; gb = tmat * input $
524: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
1.8 takayama 525: $ [ [ (Dx) 1 (Dy) 1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecart.syz /ff set $
1.1 takayama 526: $ ff 0 get ff 3 get mul pmat $
527: $ ff 2 get ff 3 get mul [ff 1 get ] transpose sub pmat ; $
528: ( )
1.9 takayama 529: (To set the current ring to the ring in which ff belongs )
530: ( ff getRing ring_def )
1.1 takayama 531: $Example 2: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
1.8 takayama 532: $ [ [(Dx) 1 (Dy) 1] [ (x) -1 (y) -1] ] [[0 1] [-3 1] ] ] ecart.syz pmat ; $
1.1 takayama 533: ( )
534: (cf. ecart.gb)
535: ( /ecart.autoHomogenize 0 def )
536: ]] putUsages
1.2 takayama 537:
1.3 takayama 538:
539: /ecartn.begin {
540: (red@) (standard) switch_function
541: %% (red@) (ecart) switch_function
542: [(Ecart) 1] system_variable
543: [(CheckHomogenization) 0] system_variable
544: [(ReduceLowerTerms) 0] system_variable
545: [(AutoReduce) 0] system_variable
546: [(EcartAutomaticHomogenization) 0] system_variable
547: } def
548: /ecartn.gb {
549: /arg1 set
550: [/in-ecartn.gb /aa /typev /setarg /f /v
551: /gg /wv /vec /ans /rr /mm
552: /degreeShift /env2 /opt /ans.gb
553: ] pushVariables
554: [(CurrentRingp) (KanGBmessage)] pushEnv
555: [
556: /aa arg1 def
1.13 takayama 557: aa isArray { } { ( << array >> ecartn.gb) error } ifelse
1.3 takayama 558: /setarg 0 def
559: /wv 0 def
560: /degreeShift 0 def
561: /opt [(weightedHomogenization) 1] def
562: aa { tag } map /typev set
563: typev [ ArrayP ] eq
564: { /f aa 0 get def
565: /v gb.v def
566: /setarg 1 def
567: } { } ifelse
568: typev [ArrayP StringP] eq
569: { /f aa 0 get def
570: /v aa 1 get def
571: /setarg 1 def
572: } { } ifelse
573: typev [ArrayP RingP] eq
574: { /f aa 0 get def
575: /v aa 1 get def
576: /setarg 1 def
577: } { } ifelse
578: typev [ArrayP ArrayP] eq
579: { /f aa 0 get def
580: /v aa 1 get from_records def
581: /setarg 1 def
582: } { } ifelse
583: typev [ArrayP StringP ArrayP] eq
584: { /f aa 0 get def
585: /v aa 1 get def
586: /wv aa 2 get def
587: /setarg 1 def
588: } { } ifelse
589: typev [ArrayP ArrayP ArrayP] eq
590: { /f aa 0 get def
591: /v aa 1 get from_records def
592: /wv aa 2 get def
593: /setarg 1 def
594: } { } ifelse
595: typev [ArrayP StringP ArrayP ArrayP] eq
596: { /f aa 0 get def
597: /v aa 1 get def
598: /wv aa 2 get def
599: /degreeShift aa 3 get def
600: /setarg 1 def
601: } { } ifelse
602: typev [ArrayP ArrayP ArrayP ArrayP] eq
603: { /f aa 0 get def
604: /v aa 1 get from_records def
605: /wv aa 2 get def
606: /degreeShift aa 3 get def
607: /setarg 1 def
608: } { } ifelse
609:
610: /env1 getOptions def
611:
612: setarg { } { (ecart.gb : Argument mismatch) error } ifelse
613:
614: [(KanGBmessage) ecart.gb.verbose ] system_variable
615:
616: %%% Start of the preprocess
617: v tag RingP eq {
618: /rr v def
619: }{
620: f getRing /rr set
621: } ifelse
622: %% To the normal form : matrix expression.
623: f gb.toMatrixOfString /f set
624: /mm gb.itWasMatrix def
625:
626: rr tag 0 eq {
627: %% Define our own ring
628: v isInteger {
629: (Error in gb: Specify variables) error
630: } { } ifelse
631: wv isInteger {
632: [v ring_of_differential_operators
633: [ v ecart.wv1 v ecart.wv2 ] weight_vector
634: gb.characteristic
635: opt
636: ] define_ring
637: }{
638: degreeShift isInteger {
639: [v ring_of_differential_operators
640: [v ecart.wv1 v ecart.wv2] wv join weight_vector
641: gb.characteristic
642: opt
643: ] define_ring
644:
645: }{
646: [v ring_of_differential_operators
647: [v ecart.wv1 v ecart.wv2] wv join weight_vector
648: gb.characteristic
649: [(degreeShift) degreeShift] opt join
650: ] define_ring
651:
652: } ifelse
653: } ifelse
654: } {
655: %% Use the ring structre given by the input.
656: v isInteger not {
657: gb.warning {
658: (Warning : the given ring definition is not used.) message
659: } { } ifelse
660: } { } ifelse
661: rr ring_def
662: /wv rr gb.getWeight def
663:
664: } ifelse
665: %%% Enf of the preprocess
666:
667: ecart.gb.verbose {
668: (The first and the second weight vectors are automatically set as follows)
669: message
670: v ecart.wv1 message
671: v ecart.wv2 message
672: degreeShift isInteger { }
673: {
674: (The degree shift is ) messagen
675: degreeShift message
676: } ifelse
677: } { } ifelse
678:
1.5 takayama 679: %%BUG: case of v is integer
680: v ecart.checkOrder
681:
1.3 takayama 682: ecartn.begin
683:
684: ecart.gb.verbose { (ecartn.gb : ecart.gb without ecart division.) message } { } ifelse
685: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
686: ecart.autoHomogenize {
687: (ecart.gb: Input polynomial or vectors are automatically h-H-homogenized.)
688: message
689: } { } ifelse
690: ecart.autoHomogenize {
691: f { {. ecart.dehomogenize} map} map /f set
692: f ecart.homogenize01 /f set
693: }{
694: f { {. } map } map /f set
695: } ifelse
696: ecart.needSyz {
697: [f [(needSyz)] gb.options join ] groebner /gg set
698: } {
699: [f gb.options] groebner 0 get /gg set
700: } ifelse
701:
702: ecart.needSyz {
703: mm {
704: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
705: } { /ans.gb gg 0 get def } ifelse
706: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
1.11 takayama 707: % ans pmat ;
1.3 takayama 708: } {
709: wv isInteger {
710: /ans [gg gg {init} map] def
711: }{
1.10 takayama 712: degreeShift isInteger {
713: /ans [gg gg {wv 0 get weightv init} map] def
714: } {
715: /ans [gg gg {[wv 0 get weightv degreeShift 0 get ] init} map] def
716: } ifelse
1.3 takayama 717: }ifelse
718:
719: %% Postprocess : recover the matrix expression.
720: mm {
721: ans { /tmp set [mm tmp] toVectors } map
722: /ans set
723: }{ }
724: ifelse
725: } ifelse
726:
727: ecart.end
728:
729: %%
730: env1 restoreOptions %% degreeShift changes "grade"
731:
732: /arg1 ans def
733: ] pop
734: popEnv
735: popVariables
736: arg1
737: } def
738: (ecartn.gb[gb by non-ecart division] ) messagen-quiet
1.4 takayama 739:
740: /ecartd.gb {
741: /arg1 set
742: [/in-ecart.gb /aa /typev /setarg /f /v
743: /gg /wv /vec /ans /rr /mm
744: /degreeShift /env2 /opt /ans.gb
1.11 takayama 745: /hdShift
1.4 takayama 746: ] pushVariables
747: [(CurrentRingp) (KanGBmessage)] pushEnv
748: [
749: /aa arg1 def
1.13 takayama 750: aa isArray { } { ( << array >> ecartd.gb) error } ifelse
1.4 takayama 751: /setarg 0 def
752: /wv 0 def
753: /degreeShift 0 def
1.11 takayama 754: /hdShift 0 def
1.4 takayama 755: /opt [(weightedHomogenization) 1] def
756: aa { tag } map /typev set
757: typev [ ArrayP ] eq
758: { /f aa 0 get def
759: /v gb.v def
760: /setarg 1 def
761: } { } ifelse
762: typev [ArrayP StringP] eq
763: { /f aa 0 get def
764: /v aa 1 get def
765: /setarg 1 def
766: } { } ifelse
767: typev [ArrayP RingP] eq
768: { /f aa 0 get def
769: /v aa 1 get def
770: /setarg 1 def
771: } { } ifelse
772: typev [ArrayP ArrayP] eq
773: { /f aa 0 get def
774: /v aa 1 get from_records def
775: /setarg 1 def
776: } { } ifelse
777: typev [ArrayP StringP ArrayP] eq
778: { /f aa 0 get def
779: /v aa 1 get def
780: /wv aa 2 get def
781: /setarg 1 def
782: } { } ifelse
783: typev [ArrayP ArrayP ArrayP] eq
784: { /f aa 0 get def
785: /v aa 1 get from_records def
786: /wv aa 2 get def
787: /setarg 1 def
788: } { } ifelse
789: typev [ArrayP StringP ArrayP ArrayP] eq
790: { /f aa 0 get def
791: /v aa 1 get def
792: /wv aa 2 get def
793: /degreeShift aa 3 get def
794: /setarg 1 def
795: } { } ifelse
796: typev [ArrayP ArrayP ArrayP ArrayP] eq
797: { /f aa 0 get def
798: /v aa 1 get from_records def
799: /wv aa 2 get def
800: /degreeShift aa 3 get def
801: /setarg 1 def
802: } { } ifelse
1.11 takayama 803: typev [ArrayP StringP ArrayP ArrayP ArrayP] eq
804: { /f aa 0 get def
805: /v aa 1 get def
806: /wv aa 2 get def
807: /degreeShift aa 3 get def
808: /hdShift aa 4 get def
809: /setarg 1 def
810: } { } ifelse
811: typev [ArrayP ArrayP ArrayP ArrayP ArrayP] eq
812: { /f aa 0 get def
813: /v aa 1 get from_records def
814: /wv aa 2 get def
815: /degreeShift aa 3 get def
816: /hdShift aa 4 get def
817: /setarg 1 def
818: } { } ifelse
819: typev [ArrayP ArrayP ArrayP ArrayP StringP] eq
820: { /f aa 0 get def
821: /v aa 1 get from_records def
822: /wv aa 2 get def
823: /degreeShift aa 3 get def
824: aa 4 get (no) eq {
825: /hdShift -1 def
826: } {
827: (Unknown keyword for the 5th argument) error
828: } ifelse
829: /setarg 1 def
830: } { } ifelse
1.13 takayama 831: typev [ArrayP StringP ArrayP ArrayP StringP] eq
832: { /f aa 0 get def
833: /v aa 1 get def
834: /wv aa 2 get def
835: /degreeShift aa 3 get def
836: aa 4 get (no) eq {
837: /hdShift -1 def
838: } {
839: (Unknown keyword for the 5th argument) error
840: } ifelse
841: /setarg 1 def
842: } { } ifelse
1.4 takayama 843:
844: /env1 getOptions def
845:
846: setarg { } { (ecart.gb : Argument mismatch) error } ifelse
847:
848: [(KanGBmessage) ecart.gb.verbose ] system_variable
849: $ecartd.gb dehomogenizes at each reduction step w.r.t. s (H).$ message
850:
851: %%% Start of the preprocess
852: v tag RingP eq {
853: /rr v def
854: }{
855: f getRing /rr set
856: } ifelse
857: %% To the normal form : matrix expression.
858: f gb.toMatrixOfString /f set
859: /mm gb.itWasMatrix def
860:
861: rr tag 0 eq {
862: %% Define our own ring
863: v isInteger {
864: (Error in gb: Specify variables) error
865: } { } ifelse
866: wv isInteger {
867: (Give an weight vector such that x < 1) error
868: }{
869: degreeShift isInteger {
870: [v ring_of_differential_operators
871: wv weight_vector
872: gb.characteristic
873: opt
874: ] define_ring
875:
876: }{
877: [v ring_of_differential_operators
878: wv weight_vector
879: gb.characteristic
880: [(degreeShift) degreeShift] opt join
881: ] define_ring
882:
883: } ifelse
884: } ifelse
885: } {
886: %% Use the ring structre given by the input.
887: v isInteger not {
888: gb.warning {
889: (Warning : the given ring definition is not used.) message
890: } { } ifelse
891: } { } ifelse
892: rr ring_def
893: /wv rr gb.getWeight def
894:
895: } ifelse
896: %%% Enf of the preprocess
897:
898: ecart.gb.verbose {
899: degreeShift isInteger { }
900: {
901: (The degree shift is ) messagen
902: degreeShift message
903: } ifelse
904: } { } ifelse
905:
1.5 takayama 906: %%BUG: case of v is integer
907: v ecart.checkOrder
908:
1.8 takayama 909: ecartd.begin
1.4 takayama 910:
911: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
912:
1.11 takayama 913: hdShift tag 1 eq {
1.12 takayama 914: ecart.autoHomogenize not hdShift -1 eq or {
1.11 takayama 915: % No automatic h-homogenization.
916: f { {. } map} map /f set
917: } {
918: % Automatic h-homogenization without degreeShift
1.13 takayama 919: (ecartd.gb : Input polynomial or vectors are automatically homogenized without degreeShift) message
1.11 takayama 920: f { {. ecart.dehomogenize} map} map /f set
921: f ecart.homogenize01 /f set
922: f { { [[(H). (1).]] replace } map } map /f set
923: } ifelse
924: } {
925: % Automatic h-homogenization with degreeShift
1.13 takayama 926: (ecartd.gb : Input polynomial or vectors are automatically homogenized with degreeShift) message
1.11 takayama 927: f { {. ecart.dehomogenize} map} map /f set
928: f {/fi set [(degreeShift) hdShift fi] homogenize} map /f set
929: f { { [[(H). (1).]] replace } map } map /f set
930: }ifelse
1.4 takayama 931:
932: ecart.needSyz {
933: [f [(needSyz)] gb.options join ] groebner /gg set
934: } {
935: [f gb.options] groebner 0 get /gg set
936: } ifelse
937:
938: ecart.needSyz {
939: mm {
940: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
941: } { /ans.gb gg 0 get def } ifelse
942: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
1.11 takayama 943: % ans pmat ;
1.4 takayama 944: } {
945: wv isInteger {
946: /ans [gg gg {init} map] def
947: }{
1.11 takayama 948: %% Get the initial ideal
1.10 takayama 949: degreeShift isInteger {
950: /ans [gg gg {wv 0 get weightv init} map] def
951: } {
952: /ans [gg gg {[wv 0 get weightv degreeShift 0 get ] init} map] def
953: } ifelse
1.4 takayama 954: }ifelse
955:
956: %% Postprocess : recover the matrix expression.
957: mm {
958: ans { /tmp set [mm tmp] toVectors } map
959: /ans set
960: }{ }
961: ifelse
962: } ifelse
963:
1.8 takayama 964: ecartd.end
1.4 takayama 965:
966: %%
967: env1 restoreOptions %% degreeShift changes "grade"
968:
969: /arg1 ans def
970: ] pop
971: popEnv
972: popVariables
973: arg1
974: } def
975: (ecartd.gb[results are dehomogenized at each reduction step] ) messagen-quiet
1.2 takayama 976:
1.5 takayama 977: /ecart.checkOrder {
978: /arg1 set
979: [/in-ecart.checkOrder /vv /tt /dd /n /i] pushVariables
980: [
981: /vv arg1 def
982: vv isArray
983: { } { [vv to_records pop] /vv set } ifelse
984: vv {toString} map /vv set
985: vv { /tt set [@@@.Dsymbol tt] cat } map /dd set
986: % Starting the checks.
987: 0 1 vv length 1 sub {
988: /i set
989: vv i get . dd i get . mul /tt set
990: tt @@@.hsymbol . add init tt eq { }
991: { [@@@.hsymbol ( is larger than ) vv i get ( ) dd i get] cat error} ifelse
992: } for
993:
994: 0 1 vv length 1 sub {
995: /i set
996: vv i get . /tt set
997: tt (1). add init (1). eq { }
1.6 takayama 998: { [vv i get ( is larger than 1 ) ] cat error} ifelse
1.5 takayama 999: } for
1000: /arg1 1 def
1001: ] pop
1002: popVariables
1003: arg1
1004: } def
1005: [(ecart.checkOrder)
1006: [(v ecart.checkOrder bool checks if the given order is relevant)
1007: (for the ecart division.)
1008: (cf. ecartd.gb, ecart.gb, ecartn.gb)
1009: ]
1010: ] putUsages
1011:
1012: /ecart.wv_last {
1013: /arg1 set
1014: [/in-ecart.wv_last /vv /tt /dd /n /i] pushVariables
1015: [
1016: /vv arg1 def
1017: vv isArray
1018: { } { [vv to_records pop] /vv set } ifelse
1019: vv {toString} map /vv set
1020: vv { /tt set [@@@.Dsymbol tt] cat } map /dd set
1021: vv { -1 } map
1022: dd { 1 } map join /arg1 set
1023: ] pop
1024: popVariables
1025: arg1
1026: } def
1027: [(ecart.wv_last)
1028: [(v ecart.wv_last wt )
1029: (It returns the weight vector -1,-1,...-1; 1,1, ..., 1)
1030: (Use this weight vector as the last weight vector for ecart division)
1031: (if ecart.checkOrder complains about the order given.)
1032: ]
1033: ] putUsages
1.13 takayama 1034:
1035: /ecart.mimimalBase.test {
1036: [
1037: [ (0) , (-2*Dx) , (2*t) , (y) , (x^2) ]
1038: [ (3*t ) , ( -3*Dy ) , ( 0 ) , ( -x ) , ( -y) ]
1039: [ (3*y ) , ( 6*Dt ) , ( 2*x ) , ( 0 ) , ( 1) ]
1040: [ (-3*x^2 ) , ( 0 ) , ( -2*y ) , ( 1 ) , ( 0 )]
1041: [ (Dx ) , ( 0 ) , ( -Dy ) , ( Dt ) , ( 0) ]
1042: [ (0 ) , ( 0 ) , ( 6*t*Dt+2*x*Dx+3*y*Dy+8*h ) , ( 0 ) , ( 3*x^2*Dt+Dx) ]
1043: [ (6*t*Dx ) , ( 0 ) , ( -6*t*Dy ) , ( -2*x*Dx-3*y*Dy-5*h ) , ( -2*y*Dx-3*x^2*Dy) ]
1044: [ (6*t*Dt+3*y*Dy+9*h ) , ( 0 ) , ( 2*x*Dy ) , ( -2*x*Dt ) , ( -2*y*Dt+Dy) ]
1045: ]
1046: /ff set
1047:
1048: /nmshift [ [1 0 1 1 1] [1 0 1 0 0] ] def
1049: /shift [ [1 0 1 0 0] ] def
1050: /weight [ [(t) -1 (Dt) 1] [(t) -1 (x) -1 (y) -1 (Dt) 1 (Dx) 1 (Dy) 1]] def
1051:
1052: [ff (t,x,y) weight shift nmshift] ecart.minimalBase
1053:
1054:
1055: } def
1056: /test {ecart.mimimalBase.test} def
1057:
1058: %(x,y) ==> [(Dx) 1 (Dy) 1 (h) 1]
1059: /ecart.minimalBase.D1 {
1060: /arg1 set
1061: [/in-ecart.minimalBase.D1 /tt /v] pushVariables
1062: [
1063: /v arg1 def
1064: [ v to_records pop] /v set
1065: v { /tt set [@@@.Dsymbol tt] cat 1 } map /v set
1066: v [(h) 1] join /arg1 set
1067: ] pop
1068: popVariables
1069: arg1
1070: } def
1071:
1072: % [0 1 2] 1 ecart.removeElem [0 2]
1073: /ecart.removeElem {
1074: /arg2 set
1075: /arg1 set
1076: [/in-ecart.removeElem /v /q /i /ans /j] pushVariables
1077: [
1078: /v arg1 def
1079: /q arg2 def
1080: /ans v length 1 sub newVector def
1081: /j 0 def
1082: 0 1 v length 1 sub {
1083: /i set
1084: i q eq not {
1085: ans j v i get put
1086: /j j 1 add def
1087: } { } ifelse
1088: } for
1089: ] pop
1090: popVariables
1091: arg1
1092: } def
1093:
1.14 ! takayama 1094: /ecart.isZeroRow {
! 1095: /arg1 set
! 1096: [/in-ecart.isZeroRow /aa /i /n /yes] pushVariables
! 1097: [
! 1098: /aa arg1 def
! 1099: aa length /n set
! 1100: /yes 1 def
! 1101: 0 1 n 1 sub {
! 1102: /i set
! 1103: aa i get (0). eq {
! 1104: } {
! 1105: /yes 0 def
! 1106: } ifelse
! 1107: } for
! 1108: /arg1 yes def
! 1109: ] pop
! 1110: popVariables
! 1111: arg1
! 1112: } def
! 1113:
! 1114: /ecart.removeZeroRow {
! 1115: /arg1 set
! 1116: [/in-ecart.removeZeroRow /aa /i /n /ans] pushVariables
! 1117: [
! 1118: /aa arg1 def
! 1119: aa length /n set
! 1120: /ans [ ] def
! 1121: 0 1 n 1 sub {
! 1122: /i set
! 1123: aa i get ecart.isZeroRow {
! 1124: } {
! 1125: ans aa i get append /ans set
! 1126: } ifelse
! 1127: } for
! 1128: /arg1 ans def
! 1129: ] pop
! 1130: popVariables
! 1131: arg1
! 1132: } def
! 1133:
! 1134: /ecart.gen_input {
! 1135: /arg1 set
! 1136: [/in-ecart.gen_input /aa /typev /setarg /f /v
! 1137: /gg /wv /vec /ans /rr /mm
! 1138: /degreeShift /env2 /opt /ss0
! 1139: /hdShift /ff
! 1140: ] pushVariables
! 1141: [
! 1142: /aa arg1 def
! 1143: aa isArray { } { ( << array >> ecart.gen_input) error } ifelse
! 1144: /setarg 0 def
! 1145: /wv 0 def
! 1146: /degreeShift 0 def
! 1147: /hdShift 0 def
! 1148: aa { tag } map /typev set
! 1149: typev [ArrayP StringP ArrayP ArrayP ArrayP] eq
! 1150: { /f aa 0 get def
! 1151: /v aa 1 get def
! 1152: /wv aa 2 get def
! 1153: /degreeShift aa 3 get def
! 1154: /hdShift aa 4 get def
! 1155: /setarg 1 def
! 1156: } { } ifelse
! 1157: typev [ArrayP ArrayP ArrayP ArrayP ArrayP] eq
! 1158: { /f aa 0 get def
! 1159: /v aa 1 get from_records def
! 1160: /wv aa 2 get def
! 1161: /degreeShift aa 3 get def
! 1162: /hdShift aa 4 get def
! 1163: /setarg 1 def
! 1164: } { } ifelse
! 1165: setarg { } { (ecart.minimalBase : Argument mismatch) error } ifelse
! 1166:
! 1167: [(KanGBmessage) ecart.gb.verbose ] system_variable
! 1168:
! 1169: f 0 get tag ArrayP eq { }
! 1170: { f { /tt set [ tt ] } map /f set } ifelse
! 1171:
! 1172: [f v wv degreeShift [hdShift 0 get degreeShift 0 get]]
! 1173: ecart.gb /ff set
! 1174: ff getRing ring_def
! 1175:
! 1176: ff 0 get { {toString } map } map /ff set
! 1177:
! 1178: [ff v wv degreeShift [hdShift 0 get degreeShift 0 get]] /arg1 set
! 1179: ] pop
! 1180: popVariables
! 1181: arg1
! 1182: } def
! 1183: [(ecart.gen_input)
! 1184: [([ff v weight_vector uv_shift_m [D_shift_n uv_shift_m]] ecart.gen_input )
! 1185: ( [gg_h v weight_vector uv_shift_m [D_shift_n uv_shift_m]] )
! 1186: (It generates the input for the minimal filtered free resolution.)
! 1187: (Current ring is changed to the ring of gg_h.)
! 1188: (cf. ecart.minimalBase)
! 1189: $Example: [ [(t-x^3+y^2) (Dx+ 3 x^2 Dt) (Dy - 2 y Dt)] (t,x,y) $
! 1190: $ [ [(t) -1 (Dt) 1] [(t) -1 (x) -1 (y) -1 (Dt) 1 (Dx) 1 (Dy) 1]] $
! 1191: $ [ [0] ] $
! 1192: $ [ [0] [0] ] ] ecart.gen_input /gg set gg pmat $
! 1193: ]] putUsages
! 1194:
! 1195:
1.13 takayama 1196: [(ecart.minimalBase)
1.14 ! takayama 1197: [([ff v weight_vector uv_shift_m [D_shift_n uv_shift_m]] ecart.minimalBase )
! 1198: ( [mbase gr_of_mbase )
! 1199: ( [syz v weight_vector new_uv_shift_m [new_D_shift_n new_uv_shift_m]])
! 1200: ( gr_of_syz ])
! 1201: (mbase is the minimal generators of ff in D^h in the sense of filtered minimal)
! 1202: (generators.)
! 1203: $Example: [ [(t-x^3+y^2) (Dx+ 3 x^2 Dt) (Dy - 2 y Dt)] (t,x,y) $
! 1204: $ [ [(t) -1 (Dt) 1] [(t) -1 (x) -1 (y) -1 (Dt) 1 (Dx) 1 (Dy) 1]] $
! 1205: $ [ [0] ] $
! 1206: $ [ [0] [0] ] ] ecart.gen_input /gg0 set $
! 1207: $ gg0 ecart.minimalBase /ss0 set $
! 1208: $ ss0 2 get ecart.minimalBase /ss1 set $
! 1209: $ ss1 2 get ecart.minimalBase /ss2 set $
! 1210: $ (--------- minimal filtered resolution -------) message $
! 1211: $ ss0 0 get pmat ss1 0 get pmat ss2 0 get pmat $
! 1212: $ (--------- degree shift (n,m) n:D-shift m:uv-shift -------) message $
! 1213: $ gg0 4 get message $
! 1214: $ ss0 2 get 4 get message $
! 1215: $ ss1 2 get 4 get message $
! 1216: $ ss2 2 get 4 get message ; $
! 1217:
1.13 takayama 1218: ]] putUsages
1219: /ecart.minimalBase {
1220: /arg1 set
1221: [/in-ecart.minimalBase /ai1 /ai /aa /typev /setarg /f /v
1222: /gg /wv /vec /ans /rr /mm
1223: /degreeShift /env2 /opt /ss0
1224: /hdShift
1225: /degreeShiftD /degreeShiftUV
1226: /degreeShiftDnew /degreeShiftUVnew
1227: /tt
1228: /ai1_gr /ai_gr
1229: /s /r /p /q /i /j /k
1230: /ai1_new /ai_new /ai_new2
1231: ] pushVariables
1232: [
1233: /aa arg1 def
1234: aa isArray { } { ( << array >> ecart.minimalBase) error } ifelse
1235: /setarg 0 def
1236: /wv 0 def
1237: /degreeShift 0 def
1238: /hdShift 0 def
1239: aa { tag } map /typev set
1240: typev [ArrayP StringP ArrayP ArrayP ArrayP] eq
1241: { /f aa 0 get def
1242: /v aa 1 get def
1243: /wv aa 2 get def
1244: /degreeShift aa 3 get def
1245: /hdShift aa 4 get def
1246: /setarg 1 def
1247: } { } ifelse
1248: typev [ArrayP ArrayP ArrayP ArrayP ArrayP] eq
1249: { /f aa 0 get def
1250: /v aa 1 get from_records def
1251: /wv aa 2 get def
1252: /degreeShift aa 3 get def
1253: /hdShift aa 4 get def
1254: /setarg 1 def
1255: } { } ifelse
1256: setarg { } { (ecart.minimalBase : Argument mismatch) error } ifelse
1257:
1258: [(KanGBmessage) ecart.gb.verbose ] system_variable
1259:
1260: f 0 get tag ArrayP eq { }
1261: { f { /tt set [ tt ] } map /f set } ifelse
1262: [f v wv degreeShift (no)] ecart.syz /ss0 set
1263:
1264: ss0 getRing ring_def
1265: /degreeShiftD hdShift 0 get def
1266: /degreeShiftUV hdShift 1 get def
1267: % -- ai --> D^r -- ai1 --> D^rr
1268: /ai1 f { { . } map } map def
1269: /ai ss0 0 get def
1270:
1271: {
1272: /degreeShiftUVnew
1273: ai1 { [ << wv 0 get weightv >> degreeShiftUV ] ord_ws_all } map
1274: def
1275: (degreeShiftUVnew=) messagen degreeShiftUVnew message
1276:
1277: /degreeShiftDnew
1278: ai1 { [ << v ecart.minimalBase.D1 weightv >> degreeShiftD ] ord_ws_all}
1279: map
1280: def
1281: (degreeShiftDnew=) messagen degreeShiftDnew message
1282:
1283: ai {[wv 0 get weightv degreeShiftUVnew] init} map /ai_gr set
1284:
1285: %C Note 2003.8.26
1286:
1.14 ! takayama 1287: ai [ ] eq {
! 1288: exit
! 1289: } { } ifelse
! 1290:
1.13 takayama 1291: /s ai length def
1292: /r ai 0 get length def
1293:
1294: /itIsMinimal 1 def
1295: 0 1 s 1 sub {
1296: /i set
1297: 0 1 r 1 sub {
1298: /j set
1299:
1300: [(isConstantAll) ai_gr i get j get] gbext
1301: ai_gr i get j get (0). eq not and
1302: {
1303: /itIsMinimal 0 def
1304: /p i def /q j def
1305: } { } ifelse
1306: } for
1307: } for
1308:
1309:
1310: itIsMinimal { exit } { } ifelse
1311:
1312: % construct new ai and ai1 (A_i and A_{i-1})
1313: /ai1_new r 1 sub newVector def
1314: /j 0 def
1315: 0 1 r 1 sub {
1316: /i set
1317: i q eq not {
1318: ai1_new j ai1 i get put
1319: /j j 1 add def
1320: } { } ifelse
1321: } for
1322:
1323: /ai_new [s r] newMatrix def
1324: 0 1 s 1 sub {
1325: /j set
1326: 0 1 r 1 sub {
1327: /k set
1328: ai_new [j k]
1329: << ai p get q get >> << ai j get k get >> mul
1330: << ai j get q get >> << ai p get k get >> mul
1331: sub
1332: put
1333: } for
1334: } for
1335:
1336: % remove 0 column
1337: /ai_new2 [s 1 sub r 1 sub] newMatrix def
1338: /j 0 def
1339: 0 1 s 1 sub {
1340: /i set
1341: i p eq not {
1342: ai_new2 j << ai_new i get q ecart.removeElem >> put
1343: /j j 1 add def
1344: } { } ifelse
1345: } for
1346:
1347: % ( ) error
1.14 ! takayama 1348: /ai1 ai1_new def
! 1349: /ai ai_new2 ecart.removeZeroRow def
1.13 takayama 1350:
1351: } loop
1.14 ! takayama 1352: /arg1
! 1353: [ ai1
! 1354: ai1 {[wv 0 get weightv degreeShift 0 get] init} map %Getting gr of A_{i-1}
! 1355: [ai v wv [degreeShiftUVnew] [degreeShiftDnew degreeShiftUVnew]]
! 1356: ai {[wv 0 get weightv degreeShiftUVnew] init} map %Getting gr of A_i
! 1357: ]
! 1358: def
1.13 takayama 1359: ] pop
1360: popVariables
1361: arg1
1362: } def
1363:
1.5 takayama 1364:
1.2 takayama 1365: ( ) message-quiet
1.5 takayama 1366:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>