Annotation of OpenXM/src/kan96xx/Doc/ecart.sm1, Revision 1.7
1.7 ! takayama 1: % $OpenXM: OpenXM/src/kan96xx/Doc/ecart.sm1,v 1.6 2003/08/13 03:52:25 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
10:
11: /ecart.dehomogenize {
12: /arg1 set
13: [/in.ecart.dehomogenize /ll /rr] pushVariables
14: [
15: /ll arg1 def
16: ll tag 6 eq {
17: ll { ecart.dehomogenize } map /ll set
18: } {
19: ll (0). eq {
20: } {
21: ll getRing /rr set
22: ll [ [ (H) rr ,, (1) rr ,, ]
23: [ (h) rr ,, (1) rr ,, ]] replace
24: /ll set
25: } ifelse
26: } ifelse
27: /arg1 ll def
28: ] pop
29: popVariables
30: arg1
31: } def
32: [(ecart.dehomogenize)
33: [(obj ecart.dehomogenize r)
34: (h->1, H->1)
35: ]] putUsages
36:
37: /ecart.dehomogenizeH {
38: /arg1 set
39: [/in.ecart.dehomogenize /ll /rr] pushVariables
40: [
41: /ll arg1 def
42: ll tag 6 eq {
43: ll { ecart.dehomogenize } map /ll set
44: } {
45: ll (0). eq {
46: } {
47: ll getRing /rr set
48: ll [ [ (H) rr ,, (1) rr ,, ] ] replace
49: /ll set
50: } ifelse
51: } ifelse
52: /arg1 ll def
53: ] pop
54: popVariables
55: arg1
56: } def
57: [(ecart.dehomogenizeH)
58: [(obj ecart.dehomogenizeH r)
59: (H->1, h is not changed.)
60: ]] putUsages
61:
62: /ecart.homogenize01 {
63: /arg1 set
64: [/in.ecart.homogenize01 /ll ] pushVariables
65: [
66: /ll arg1 def
67: [(degreeShift) [ ] ll ] homogenize
68: /arg1 set
69: ] pop
70: popVariables
71: arg1
72: } def
73: [(ecart.homogenize01)
74: [(obj ecart.homogenize01 r)
75: (Example: )
76: ( [(x1,x2) ring_of_differential_operators )
77: ( [[(H) 1 (h) 1 (x1) 1 (x2) 1] )
78: ( [(h) 1 (Dx1) 1 (Dx2) 1] )
79: ( [(Dx1) 1 (Dx2) 1] )
80: ( [(x1) -1 (x2) -1])
81: ( ] weight_vector )
82: ( 0 )
83: ( [(degreeShift) [[0 0 0]]])
84: ( ] define_ring)
85: ( ecart.begin)
86: ( [[1 -4 -2 5]] appell4 0 get /eqs set)
87: ( eqs { . [[(x1). (x1+2).] [(x2). (x2+4).]] replace} map )
88: ( ecart.homogenize01 /eqs2 set)
89: ( [eqs2] groebner )
90: ]] putUsages
91:
92: /ecart.homogenize01_with_shiftVector {
93: /arg2.set
94: /arg1 set
95: [/in.ecart.homogenize01 /ll /sv] pushVariables
96: [
97: /sv arg2 def
98: /ll arg1 def
99: [(degreeShift) sv ll ] homogenize
100: /arg1 set
101: ] pop
102: popVariables
103: arg1
104: } def
105: [(ecart.dehomogenize01_with_degreeShift)
106: [(obj shift-vector ecart.dehomogenize01_with_degreeShift r)
107: ]] putUsages
108:
109: %% Aux functions to return the default weight vectors.
110: /ecart.wv1 {
111: /arg1 set
112: [/in.ecart.wv1 /v] pushVariables
113: [
114: /v arg1 def
115: [(H) (h) v to_records pop] /v set
116: v { 1 } map /v set
117: /arg1 v def
118: ] pop
119: popVariables
120: arg1
121: } def
122: /ecart.wv2 {
123: /arg1 set
124: [/in.ecart.wv2 /v] pushVariables
125: [
126: /v arg1 def
127: [v to_records pop] /v set
128: v { [ @@@.Dsymbol 3 -1 roll ] cat 1 } map /v set
129: [(h) 1 ] v join /v set
130: /arg1 v def
131: ] pop
132: popVariables
133: arg1
134: } def
135:
1.7 ! takayama 136: /ecart.gb {ecartd.gb} def
! 137:
! 138: [(ecart.gb)
! 139: [(a ecart.gb b)
! 140: (array a; array b;)
! 141: $b : [g ii]; array g; array in; g is a standard (Grobner) basis of f$
! 142: ( in the ring of differential operators.)
! 143: (The computation is done by using Ecart division algorithm and )
! 144: (the double homogenization.)
! 145: (cf. M.Granger and T.Oaku: Minimal filtered free resolutions ... 2003)
! 146: $ ii is the initial ideal in case of w is given or <<a>> belongs$
! 147: $ to a ring. In the other cases, it returns the initial monominal.$
! 148: (a : [f ]; array f; f is a set of generators of an ideal in a ring.)
! 149: (a : [f v]; array f; string v; v is the variables. )
! 150: (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
! 151: (a : [f v w ds]; array f; string v; array of array w; w is the weight matirx.)
! 152: ( array ds; ds is the degree shift )
! 153: ( )
! 154: $cf. ecarth.gb (homogenized), ecartd.gb (dehomogenize) $
! 155: ( )
! 156: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
! 157: $ [ [ (Dx) 1 ] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecart.gb pmat ; $
! 158: (Example 2: )
! 159: $ [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
! 160: $ [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] ecart.gb pmat ;$
! 161: ( )
! 162: $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
! 163: $ [ [ (Dx) 1 (Dy) 1] ] ] ecart.gb pmat ; $
! 164: ( )
! 165: $Example 4: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
! 166: $ [ [ (x) -1 (y) -1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecart.gb pmat ; $
! 167: ( )
! 168: $Example 5: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
! 169: $ [ [(Dx) 1 (Dy) 1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1] ] [[0 1] [-3 1] ] ] ecart.gb pmat ; $
! 170: ( )
! 171: (cf. gb, groebner, ecarth.gb, ecartd.gb, ecart.syz, ecart.begin, ecart.end, ecart.homogenize01, )
! 172: ( ecart.dehomogenize, ecart.dehomogenizeH)
! 173: ( [(weightedHomogenization) 1 (degreeShift) [[1 2 1]]] : options for )
! 174: ( define_ring )
! 175: (/ecart.autoHomogenize 0 def )
! 176: ( not to dehomogenize and homogenize)
! 177: ]] putUsages
! 178:
1.1 takayama 179: /ecart.gb.verbose 1 def
1.7 ! takayama 180: /ecarth.gb {
1.1 takayama 181: /arg1 set
1.7 ! takayama 182: [/in-ecarth.gb /aa /typev /setarg /f /v
1.1 takayama 183: /gg /wv /vec /ans /rr /mm
184: /degreeShift /env2 /opt /ans.gb
185: ] pushVariables
186: [(CurrentRingp) (KanGBmessage)] pushEnv
187: [
188: /aa arg1 def
189: aa isArray { } { ( << array >> gb) error } ifelse
190: /setarg 0 def
191: /wv 0 def
192: /degreeShift 0 def
193: /opt [(weightedHomogenization) 1] def
194: aa { tag } map /typev set
195: typev [ ArrayP ] eq
196: { /f aa 0 get def
197: /v gb.v def
198: /setarg 1 def
199: } { } ifelse
200: typev [ArrayP StringP] eq
201: { /f aa 0 get def
202: /v aa 1 get def
203: /setarg 1 def
204: } { } ifelse
205: typev [ArrayP RingP] eq
206: { /f aa 0 get def
207: /v aa 1 get def
208: /setarg 1 def
209: } { } ifelse
210: typev [ArrayP ArrayP] eq
211: { /f aa 0 get def
212: /v aa 1 get from_records def
213: /setarg 1 def
214: } { } ifelse
215: typev [ArrayP StringP ArrayP] eq
216: { /f aa 0 get def
217: /v aa 1 get def
218: /wv aa 2 get def
219: /setarg 1 def
220: } { } ifelse
221: typev [ArrayP ArrayP ArrayP] eq
222: { /f aa 0 get def
223: /v aa 1 get from_records def
224: /wv aa 2 get def
225: /setarg 1 def
226: } { } ifelse
227: typev [ArrayP StringP ArrayP ArrayP] eq
228: { /f aa 0 get def
229: /v aa 1 get def
230: /wv aa 2 get def
231: /degreeShift aa 3 get def
232: /setarg 1 def
233: } { } ifelse
234: typev [ArrayP ArrayP ArrayP ArrayP] eq
235: { /f aa 0 get def
236: /v aa 1 get from_records def
237: /wv aa 2 get def
238: /degreeShift aa 3 get def
239: /setarg 1 def
240: } { } ifelse
241:
242: /env1 getOptions def
243:
244: setarg { } { (ecart.gb : Argument mismatch) error } ifelse
245:
246: [(KanGBmessage) ecart.gb.verbose ] system_variable
247:
248: %%% Start of the preprocess
249: v tag RingP eq {
250: /rr v def
251: }{
252: f getRing /rr set
253: } ifelse
254: %% To the normal form : matrix expression.
255: f gb.toMatrixOfString /f set
256: /mm gb.itWasMatrix def
257:
258: rr tag 0 eq {
259: %% Define our own ring
260: v isInteger {
261: (Error in gb: Specify variables) error
262: } { } ifelse
263: wv isInteger {
264: [v ring_of_differential_operators
1.6 takayama 265: % [ v ecart.wv1 v ecart.wv2 ] weight_vector
1.3 takayama 266: gb.characteristic
1.1 takayama 267: opt
268: ] define_ring
269: }{
270: degreeShift isInteger {
271: [v ring_of_differential_operators
1.6 takayama 272: % [v ecart.wv1 v ecart.wv2] wv join weight_vector
273: wv weight_vector
1.3 takayama 274: gb.characteristic
1.1 takayama 275: opt
276: ] define_ring
277:
278: }{
279: [v ring_of_differential_operators
1.6 takayama 280: % [v ecart.wv1 v ecart.wv2] wv join weight_vector
281: wv weight_vector
1.3 takayama 282: gb.characteristic
1.1 takayama 283: [(degreeShift) degreeShift] opt join
284: ] define_ring
285:
286: } ifelse
287: } ifelse
288: } {
289: %% Use the ring structre given by the input.
290: v isInteger not {
291: gb.warning {
292: (Warning : the given ring definition is not used.) message
293: } { } ifelse
294: } { } ifelse
295: rr ring_def
296: /wv rr gb.getWeight def
297:
298: } ifelse
299: %%% Enf of the preprocess
300:
301: ecart.gb.verbose {
1.6 takayama 302: (The first and the second weight vectors for automatic homogenization: )
1.1 takayama 303: message
304: v ecart.wv1 message
305: v ecart.wv2 message
306: degreeShift isInteger { }
307: {
308: (The degree shift is ) messagen
309: degreeShift message
310: } ifelse
311: } { } ifelse
312:
1.5 takayama 313: %%BUG: case of v is integer
314: v ecart.checkOrder
315:
1.1 takayama 316: ecart.begin
317:
318: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
319: ecart.autoHomogenize {
320: (ecart.gb: Input polynomial or vectors are automatically h-H-homogenized.)
321: message
322: } { } ifelse
323: ecart.autoHomogenize {
324: f { {. ecart.dehomogenize} map} map /f set
325: f ecart.homogenize01 /f set
326: }{
327: f { {. } map } map /f set
328: } ifelse
329: ecart.needSyz {
330: [f [(needSyz)] gb.options join ] groebner /gg set
331: } {
332: [f gb.options] groebner 0 get /gg set
333: } ifelse
334:
335: ecart.needSyz {
336: mm {
337: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
338: } { /ans.gb gg 0 get def } ifelse
339: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
340: ans pmat ;
341: } {
342: wv isInteger {
343: /ans [gg gg {init} map] def
344: }{
345: /ans [gg gg {wv 0 get weightv init} map] def
346: }ifelse
347:
348: %% Postprocess : recover the matrix expression.
349: mm {
350: ans { /tmp set [mm tmp] toVectors } map
351: /ans set
352: }{ }
353: ifelse
354: } ifelse
355:
356: ecart.end
357:
358: %%
359: env1 restoreOptions %% degreeShift changes "grade"
360:
361: /arg1 ans def
362: ] pop
363: popEnv
364: popVariables
365: arg1
366: } def
1.7 ! takayama 367: (ecarth.gb ) messagen-quiet
1.1 takayama 368:
1.7 ! takayama 369: [(ecarth.gb)
! 370: [(a ecarth.gb b)
1.1 takayama 371: (array a; array b;)
372: $b : [g ii]; array g; array in; g is a standard (Grobner) basis of f$
373: ( in the ring of differential operators.)
374: (The computation is done by using Ecart division algorithm and )
375: (the double homogenization.)
376: (cf. M.Granger and T.Oaku: Minimal filtered free resolutions ... 2003)
377: $ ii is the initial ideal in case of w is given or <<a>> belongs$
378: $ to a ring. In the other cases, it returns the initial monominal.$
379: (a : [f ]; array f; f is a set of generators of an ideal in a ring.)
380: (a : [f v]; array f; string v; v is the variables. )
381: (a : [f v w]; array f; string v; array of array w; w is the weight matirx.)
382: (a : [f v w ds]; array f; string v; array of array w; w is the weight matirx.)
383: ( array ds; ds is the degree shift )
384: ( )
385: (/ecart.autoHomogenize 0 def )
386: ( not to dehomogenize and homogenize)
387: ( )
388: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
1.7 ! takayama 389: $ [ [ (Dx) 1 ] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecarth.gb pmat ; $
1.1 takayama 390: (Example 2: )
391: (To put H and h=1, type in, e.g., )
392: $ [ [(2 x Dx + 3 y Dy+6) (2 y Dx + 3 x^2 Dy)] (x,y) $
1.7 ! takayama 393: $ [[(x) -1 (Dx) 1 (y) -1 (Dy) 1]]] ecarth.gb /gg set gg ecart.dehomogenize pmat ;$
1.1 takayama 394: ( )
395: $Example 3: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
1.7 ! takayama 396: $ [ [ (Dx) 1 (Dy) 1] ] ] ecarth.gb pmat ; $
1.1 takayama 397: ( )
398: $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 399: $ [ [ (x) -1 (y) -1] [(x) -1 (y) -1 (Dx) 1 (Dy) 1]] ] ecarth.gb pmat ; $
1.1 takayama 400: ( )
401: $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 402: $ [ [(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 403: ( )
1.7 ! takayama 404: (cf. gb, groebner, ecart.gb, ecartd.gb, ecart.syz, ecart.begin, ecart.end, ecart.homogenize01, )
1.1 takayama 405: ( ecart.dehomogenize, ecart.dehomogenizeH)
406: ( [(weightedHomogenization) 1 (degreeShift) [[1 2 1]]] : options for )
407: ( define_ring )
408: ]] putUsages
409:
410: %% BUG: " f weight init " works well in case of vectors with degree shift ?
411:
412: /ecart.syz {
413: /arg1 set
414: [/in-ecart.syz /ecart.save.needSyz /ff /ff.ans] pushVariables
415: [
416: /ff arg1 def
417: /ecart.save.needSyz ecart.needSyz def
418: /ecart.needSyz 1 def
419: ff ecart.gb /ff.ans set
420: /ecart.needSyz ecart.save.needSyz def
421: /arg1 ff.ans def
422: ] pop
423: popVariables
424: arg1
425: } def
426: (ecart.syz ) messagen-quiet
427:
428: [(ecart.syz)
429: [(a ecart.syz b)
430: (array a; array b;)
431: $b : [syzygy gb tmat input]; gb = tmat * input $
432: $Example 1: [ [( (x Dx)^2 + (y Dy)^2 -1) ( x y Dx Dy -1)] (x,y) $
433: $ [ [ (Dx) 1 (Dy) 1] ] ] ecart.syz /ff set $
434: $ ff 0 get ff 3 get mul pmat $
435: $ ff 2 get ff 3 get mul [ff 1 get ] transpose sub pmat ; $
436: ( )
437: $Example 2: [[ [(x^2) (y+x)] [(x+y) (y^3)] [(2 x^2+x y) (y+x+x y^3)]] (x,y) $
438: $ [ [ (x) -1 (y) -1] ] [[0 1] [-3 1] ] ] ecart.syz pmat ; $
439: ( )
440: (cf. ecart.gb)
441: ( /ecart.autoHomogenize 0 def )
442: ]] putUsages
1.2 takayama 443:
1.3 takayama 444:
445: /ecartn.begin {
446: (red@) (standard) switch_function
447: %% (red@) (ecart) switch_function
448: [(Ecart) 1] system_variable
449: [(CheckHomogenization) 0] system_variable
450: [(ReduceLowerTerms) 0] system_variable
451: [(AutoReduce) 0] system_variable
452: [(EcartAutomaticHomogenization) 0] system_variable
453: } def
454: /ecartn.gb {
455: /arg1 set
456: [/in-ecartn.gb /aa /typev /setarg /f /v
457: /gg /wv /vec /ans /rr /mm
458: /degreeShift /env2 /opt /ans.gb
459: ] pushVariables
460: [(CurrentRingp) (KanGBmessage)] pushEnv
461: [
462: /aa arg1 def
463: aa isArray { } { ( << array >> gb) error } ifelse
464: /setarg 0 def
465: /wv 0 def
466: /degreeShift 0 def
467: /opt [(weightedHomogenization) 1] def
468: aa { tag } map /typev set
469: typev [ ArrayP ] eq
470: { /f aa 0 get def
471: /v gb.v def
472: /setarg 1 def
473: } { } ifelse
474: typev [ArrayP StringP] eq
475: { /f aa 0 get def
476: /v aa 1 get def
477: /setarg 1 def
478: } { } ifelse
479: typev [ArrayP RingP] eq
480: { /f aa 0 get def
481: /v aa 1 get def
482: /setarg 1 def
483: } { } ifelse
484: typev [ArrayP ArrayP] eq
485: { /f aa 0 get def
486: /v aa 1 get from_records def
487: /setarg 1 def
488: } { } ifelse
489: typev [ArrayP StringP ArrayP] eq
490: { /f aa 0 get def
491: /v aa 1 get def
492: /wv aa 2 get def
493: /setarg 1 def
494: } { } ifelse
495: typev [ArrayP ArrayP ArrayP] eq
496: { /f aa 0 get def
497: /v aa 1 get from_records def
498: /wv aa 2 get def
499: /setarg 1 def
500: } { } ifelse
501: typev [ArrayP StringP ArrayP ArrayP] eq
502: { /f aa 0 get def
503: /v aa 1 get def
504: /wv aa 2 get def
505: /degreeShift aa 3 get def
506: /setarg 1 def
507: } { } ifelse
508: typev [ArrayP ArrayP ArrayP ArrayP] eq
509: { /f aa 0 get def
510: /v aa 1 get from_records def
511: /wv aa 2 get def
512: /degreeShift aa 3 get def
513: /setarg 1 def
514: } { } ifelse
515:
516: /env1 getOptions def
517:
518: setarg { } { (ecart.gb : Argument mismatch) error } ifelse
519:
520: [(KanGBmessage) ecart.gb.verbose ] system_variable
521:
522: %%% Start of the preprocess
523: v tag RingP eq {
524: /rr v def
525: }{
526: f getRing /rr set
527: } ifelse
528: %% To the normal form : matrix expression.
529: f gb.toMatrixOfString /f set
530: /mm gb.itWasMatrix def
531:
532: rr tag 0 eq {
533: %% Define our own ring
534: v isInteger {
535: (Error in gb: Specify variables) error
536: } { } ifelse
537: wv isInteger {
538: [v ring_of_differential_operators
539: [ v ecart.wv1 v ecart.wv2 ] weight_vector
540: gb.characteristic
541: opt
542: ] define_ring
543: }{
544: degreeShift isInteger {
545: [v ring_of_differential_operators
546: [v ecart.wv1 v ecart.wv2] wv join weight_vector
547: gb.characteristic
548: opt
549: ] define_ring
550:
551: }{
552: [v ring_of_differential_operators
553: [v ecart.wv1 v ecart.wv2] wv join weight_vector
554: gb.characteristic
555: [(degreeShift) degreeShift] opt join
556: ] define_ring
557:
558: } ifelse
559: } ifelse
560: } {
561: %% Use the ring structre given by the input.
562: v isInteger not {
563: gb.warning {
564: (Warning : the given ring definition is not used.) message
565: } { } ifelse
566: } { } ifelse
567: rr ring_def
568: /wv rr gb.getWeight def
569:
570: } ifelse
571: %%% Enf of the preprocess
572:
573: ecart.gb.verbose {
574: (The first and the second weight vectors are automatically set as follows)
575: message
576: v ecart.wv1 message
577: v ecart.wv2 message
578: degreeShift isInteger { }
579: {
580: (The degree shift is ) messagen
581: degreeShift message
582: } ifelse
583: } { } ifelse
584:
1.5 takayama 585: %%BUG: case of v is integer
586: v ecart.checkOrder
587:
1.3 takayama 588: ecartn.begin
589:
590: ecart.gb.verbose { (ecartn.gb : ecart.gb without ecart division.) message } { } ifelse
591: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
592: ecart.autoHomogenize {
593: (ecart.gb: Input polynomial or vectors are automatically h-H-homogenized.)
594: message
595: } { } ifelse
596: ecart.autoHomogenize {
597: f { {. ecart.dehomogenize} map} map /f set
598: f ecart.homogenize01 /f set
599: }{
600: f { {. } map } map /f set
601: } ifelse
602: ecart.needSyz {
603: [f [(needSyz)] gb.options join ] groebner /gg set
604: } {
605: [f gb.options] groebner 0 get /gg set
606: } ifelse
607:
608: ecart.needSyz {
609: mm {
610: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
611: } { /ans.gb gg 0 get def } ifelse
612: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
613: ans pmat ;
614: } {
615: wv isInteger {
616: /ans [gg gg {init} map] def
617: }{
618: /ans [gg gg {wv 0 get weightv init} map] def
619: }ifelse
620:
621: %% Postprocess : recover the matrix expression.
622: mm {
623: ans { /tmp set [mm tmp] toVectors } map
624: /ans set
625: }{ }
626: ifelse
627: } ifelse
628:
629: ecart.end
630:
631: %%
632: env1 restoreOptions %% degreeShift changes "grade"
633:
634: /arg1 ans def
635: ] pop
636: popEnv
637: popVariables
638: arg1
639: } def
640: (ecartn.gb[gb by non-ecart division] ) messagen-quiet
1.4 takayama 641:
642: /ecartd.gb {
643: /arg1 set
644: [/in-ecart.gb /aa /typev /setarg /f /v
645: /gg /wv /vec /ans /rr /mm
646: /degreeShift /env2 /opt /ans.gb
647: ] pushVariables
648: [(CurrentRingp) (KanGBmessage)] pushEnv
649: [
650: /aa arg1 def
651: aa isArray { } { ( << array >> gb) error } ifelse
652: /setarg 0 def
653: /wv 0 def
654: /degreeShift 0 def
655: /opt [(weightedHomogenization) 1] def
656: aa { tag } map /typev set
657: typev [ ArrayP ] eq
658: { /f aa 0 get def
659: /v gb.v def
660: /setarg 1 def
661: } { } ifelse
662: typev [ArrayP StringP] eq
663: { /f aa 0 get def
664: /v aa 1 get def
665: /setarg 1 def
666: } { } ifelse
667: typev [ArrayP RingP] eq
668: { /f aa 0 get def
669: /v aa 1 get def
670: /setarg 1 def
671: } { } ifelse
672: typev [ArrayP ArrayP] eq
673: { /f aa 0 get def
674: /v aa 1 get from_records def
675: /setarg 1 def
676: } { } ifelse
677: typev [ArrayP StringP ArrayP] eq
678: { /f aa 0 get def
679: /v aa 1 get def
680: /wv aa 2 get def
681: /setarg 1 def
682: } { } ifelse
683: typev [ArrayP ArrayP ArrayP] eq
684: { /f aa 0 get def
685: /v aa 1 get from_records def
686: /wv aa 2 get def
687: /setarg 1 def
688: } { } ifelse
689: typev [ArrayP StringP ArrayP ArrayP] eq
690: { /f aa 0 get def
691: /v aa 1 get def
692: /wv aa 2 get def
693: /degreeShift aa 3 get def
694: /setarg 1 def
695: } { } ifelse
696: typev [ArrayP ArrayP ArrayP ArrayP] eq
697: { /f aa 0 get def
698: /v aa 1 get from_records def
699: /wv aa 2 get def
700: /degreeShift aa 3 get def
701: /setarg 1 def
702: } { } ifelse
703:
704: /env1 getOptions def
705:
706: setarg { } { (ecart.gb : Argument mismatch) error } ifelse
707:
708: [(KanGBmessage) ecart.gb.verbose ] system_variable
709: $ecartd.gb dehomogenizes at each reduction step w.r.t. s (H).$ message
710:
711: %%% Start of the preprocess
712: v tag RingP eq {
713: /rr v def
714: }{
715: f getRing /rr set
716: } ifelse
717: %% To the normal form : matrix expression.
718: f gb.toMatrixOfString /f set
719: /mm gb.itWasMatrix def
720:
721: rr tag 0 eq {
722: %% Define our own ring
723: v isInteger {
724: (Error in gb: Specify variables) error
725: } { } ifelse
726: wv isInteger {
727: (Give an weight vector such that x < 1) error
728: }{
729: degreeShift isInteger {
730: [v ring_of_differential_operators
731: wv weight_vector
732: gb.characteristic
733: opt
734: ] define_ring
735:
736: }{
737: [v ring_of_differential_operators
738: wv weight_vector
739: gb.characteristic
740: [(degreeShift) degreeShift] opt join
741: ] define_ring
742:
743: } ifelse
744: } ifelse
745: } {
746: %% Use the ring structre given by the input.
747: v isInteger not {
748: gb.warning {
749: (Warning : the given ring definition is not used.) message
750: } { } ifelse
751: } { } ifelse
752: rr ring_def
753: /wv rr gb.getWeight def
754:
755: } ifelse
756: %%% Enf of the preprocess
757:
758: ecart.gb.verbose {
759: degreeShift isInteger { }
760: {
761: (The degree shift is ) messagen
762: degreeShift message
763: } ifelse
764: } { } ifelse
765:
1.5 takayama 766: %%BUG: case of v is integer
767: v ecart.checkOrder
768:
1.4 takayama 769: ecart.begin
770: [(EcartAutomaticHomogenization) 1] system_variable
771:
772: ecart.gb.verbose { (gb.options = ) messagen gb.options message } { } ifelse
773:
774: f { {. ecart.dehomogenize} map} map /f set
775: f ecart.homogenize01 /f set
776: f { { [[(H). (1).]] replace } map } map /f set
777:
778: ecart.needSyz {
779: [f [(needSyz)] gb.options join ] groebner /gg set
780: } {
781: [f gb.options] groebner 0 get /gg set
782: } ifelse
783:
784: ecart.needSyz {
785: mm {
786: gg 0 get { /tmp set [mm tmp] toVectors } map /ans.gb set
787: } { /ans.gb gg 0 get def } ifelse
788: /ans [gg 2 get , ans.gb , gg 1 get , f ] def
789: ans pmat ;
790: } {
791: wv isInteger {
792: /ans [gg gg {init} map] def
793: }{
794: /ans [gg gg {wv 0 get weightv init} map] def
795: }ifelse
796:
797: %% Postprocess : recover the matrix expression.
798: mm {
799: ans { /tmp set [mm tmp] toVectors } map
800: /ans set
801: }{ }
802: ifelse
803: } ifelse
804:
805: ecart.end
806: [(EcartAutomaticHomogenization) 0] system_variable
807:
808: %%
809: env1 restoreOptions %% degreeShift changes "grade"
810:
811: /arg1 ans def
812: ] pop
813: popEnv
814: popVariables
815: arg1
816: } def
817: (ecartd.gb[results are dehomogenized at each reduction step] ) messagen-quiet
1.2 takayama 818:
1.5 takayama 819: /ecart.checkOrder {
820: /arg1 set
821: [/in-ecart.checkOrder /vv /tt /dd /n /i] pushVariables
822: [
823: /vv arg1 def
824: vv isArray
825: { } { [vv to_records pop] /vv set } ifelse
826: vv {toString} map /vv set
827: vv { /tt set [@@@.Dsymbol tt] cat } map /dd set
828: % Starting the checks.
829: 0 1 vv length 1 sub {
830: /i set
831: vv i get . dd i get . mul /tt set
832: tt @@@.hsymbol . add init tt eq { }
833: { [@@@.hsymbol ( is larger than ) vv i get ( ) dd i get] cat error} ifelse
834: } for
835:
836: 0 1 vv length 1 sub {
837: /i set
838: vv i get . /tt set
839: tt (1). add init (1). eq { }
1.6 takayama 840: { [vv i get ( is larger than 1 ) ] cat error} ifelse
1.5 takayama 841: } for
842: /arg1 1 def
843: ] pop
844: popVariables
845: arg1
846: } def
847: [(ecart.checkOrder)
848: [(v ecart.checkOrder bool checks if the given order is relevant)
849: (for the ecart division.)
850: (cf. ecartd.gb, ecart.gb, ecartn.gb)
851: ]
852: ] putUsages
853:
854: /ecart.wv_last {
855: /arg1 set
856: [/in-ecart.wv_last /vv /tt /dd /n /i] pushVariables
857: [
858: /vv arg1 def
859: vv isArray
860: { } { [vv to_records pop] /vv set } ifelse
861: vv {toString} map /vv set
862: vv { /tt set [@@@.Dsymbol tt] cat } map /dd set
863: vv { -1 } map
864: dd { 1 } map join /arg1 set
865: ] pop
866: popVariables
867: arg1
868: } def
869: [(ecart.wv_last)
870: [(v ecart.wv_last wt )
871: (It returns the weight vector -1,-1,...-1; 1,1, ..., 1)
872: (Use this weight vector as the last weight vector for ecart division)
873: (if ecart.checkOrder complains about the order given.)
874: ]
875: ] putUsages
876:
1.2 takayama 877: ( ) message-quiet
1.5 takayama 878:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>