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