Annotation of OpenXM/src/kan96xx/Doc/intw.sm1, Revision 1.3
1.3 ! takayama 1: %% $OpenXM$
1.1 maekawa 2: %% When you use wIntegration0, you need oxasir.sm1.
3: %% Load this package after you have loaded cohom.sm1.
4: %% Annihilating ideal, 0-th integral and restriction with weight vector.
5: %% 1998, 11/6, 11/9, 11/18
6: %% 1999, 1/25, 6/5.
7: %% It was at gbhg3/Int/intw.sm1 <-- s linked from lib/intw.sm1
8: %% This file is error clean.
9: /intw.verbose 0 def
10: /intw.stat 0 def %% statistics.
11:
12: %% cf. gbhg3/Demo/ann.sm1
13: /intw.version (2.981105) def
14: (lib/intw.sm1, Version 1999, 6/13. Package for integration with a generic weight.) message
15: oxasir.ccc tag 0 eq {
16: (Warning: The functions *wbfRoots, wdeRham0, wIntegration0 does not work without oxasir.) message
17: ( This package requires oxasir.sm1 and ox_asir server.) message
18: } { } ifelse
19: cohom.sm1.loaded tag 0 eq {
20: (Warning: This package requires cohom.sm1 ) message
21: } { } ifelse
22: oxasir.sm1.loaded tag 0 eq {
23: (Warning: This package requires oxasir.sm1 ) message
24: } { } ifelse
25:
26: intw.version [(Version)] system_variable gt
27: { [(This package requires the latest version of kan/sm1) nl
28: (Please get it from http://www.math.kobe-u.ac.jp/KAN) ] cat
29: error
30: } { } ifelse
31:
32:
33: [(integral-k1)
34: [([[f1 ... fm] [v1 ... vn] [v1 w1 ... vp wp] k1] integral0 )
35: ( [[g1 ... gq],[e1,...,er]])
36: (poly|string f1 ...fm; string v1 ... vn;)
37: (string v1 ... vp; integer w1 ... wp;)
38: (integer k1;)
39: (poly g1 ... gq; poly e1, ..., er;)
40: (f1 ... fm are annihilors, v1 ... vn are variables,)
41: (w1 is the weight of the variable v1, ...)
42: (k1 is the maximal degree of the filtration: maximal integral root)
43: (of b-function. cf. intwbf)
44: (g1, ..., gq are integral. e1, ..., er are basis of the free module to which)
45: (the g1, ..., gq belong.)
46: (THE ORDERS OF INTEGRAL VARIABLES MUST BE SAME BOTH IN THE SECOND AND)
47: (THE THIRD ARGUMENTS. INTEGRAL VARIABLES MUST APPEAR FIRST.)
48: $Example 1: [[(x-y) (Dx+Dy)] [(y) (x)] [(y) -1 (Dy) 1] 1] integral-k1$
49: $Example 2: [[(x (x-1)) (x)] annfs 0 get [(x)] [(x) -1 (Dx) 1] 1] integral-k1$
1.2 takayama 50: $Example 3: [[ (Dt- (2 t x1 + x2)) (Dx1 - t^2) (Dx2 - t) ] $
51: $ [(t) (x1) (x2)] [(t) -1 (Dt) 1] 0] integral-k1 $
52: $ The resulting ideal annihilates f(x1,x2)=int(x1*t^2+x2*t,dt) $
1.1 maekawa 53: ]
54: ] putUsages (integral-k1 ) messagen
55: /integral-k1 {
56: /arg1 set
57: [/in-integral0 /ff /vv /ww /gg1 /gg2 /ord-vec
58: /dt-list /nn /ii /dt-ii /mm /jj /xvars /dvars /ans1 /k1 /kk /ans2
59: /vec-input /vec-length
60: ] pushVariables
61: [(CurrentRingp) (KanGBmessage)] pushEnv
62: [
63: /ff arg1 0 get def
64: /vv arg1 1 get def
65: /ww arg1 2 get def
66: /k1 arg1 3 get def
67: /vec-length 1 def
68: intw.verbose
69: { [ff vv ww k1] messagen ( is the input. ) message } { } ifelse
70: ff 0 get isArray {
71: ff { {toString} map } map /ff set
72: /vec-input 1 def
73: %% Compute the length of the input vector
74: ff { length dup vec-length gt { /vec-length set } { pop } ifelse } map
75: }{
76: ff {toString} map /ff set
77: /vec-input 0 def
78: } ifelse
79: /vv vv { (,) 2 cat_n } map aload length cat_n def
80: intw.verbose { vv message } { } ifelse
81: [(KanGBmessage) intw.verbose] system_variable
82: [vv ring_of_differential_operators
83: [ww] weight_vector 0] define_ring
84: ww getxvars2 /xvars set
85: ww getdvars2 /dvars set
86: intw.verbose {
87: (xvars = ) messagen xvars message
88: (dvars = ) messagen dvars message
89: } { } ifelse
90: %% ww = [(x) -1 (Dx) 1 (z) -1 (Dz) 1]
91: %% dvars = [[(Dx) (Dz)] [(Dx) 1 (Dz) 1]]
92: %% xvars = [(x) (z)]
93: /integral0.ff ff def %% keep variable for debug.
94:
95: vec-input {
96: ff { { . [[(h). (1).]] replace ww laplace0} map homogenize } map /ff set
97: } {
98: ff { . [[(h). (1).]] replace ww laplace0 homogenize } map /ff set
99: %% recompute the lenth of the vector. For e input.
100: ff { @@@.esymbol . degree 1 add dup vec-length gt
101: { /vec-length set } { pop } ifelse } map
102:
103: } ifelse
104:
105: intw.verbose {
106: (Computing Groebner basis with the weight vector ) messagen
107: ww message
108: } { } ifelse
109: [ff] groebner 0 get {[[(h). (1).]] replace} map /gg1 set
110: intw.verbose {
111: gg1 message %% keep variable for debug.
112: } { } ifelse
113: %% gg1 is the (-w,w)-adapted basis.
114: /integral0.gg1 gg1 def
115:
116:
117: intw.verbose {
118: (Computing gr 0-k1 of I in D v^0 + D v^1 + ... + D v^{k1} : shifting)
119: message
120: } { } ifelse
121: /ans1 [ ] def
122: 0 1 k1 {
123: /kk set
124: intw.verbose {
125: (kk = ) messagen kk message
126: } { } ifelse
127: /ord-vec gg1 { ww ord_w kk sub} map def
128: intw.verbose { ord-vec message } { } ifelse
129: %% ww = [(x) -1 (Dx) 1], kk == 0
130: %% gg1 = [ (x Dx). (y Dx). (x).]
131: %% ord-vec = [ 0 1 -1 ]
132: %% dt-list = [ [ 1] [ 0 ] [ (Dx^1).] ]
133: ord-vec { 0 2 1 roll sub } map
134: {
135: dvars 0 get { . } map %% [(Dx). (Dz).]
136: dvars 1 get { dup (type?) dc 5 eq { pop } { } ifelse } map %% [1 1]
137: 3 -1 roll ip1
138: } map /dt-list set
139: %% dt-list [ [ 1 ] [ ] [ (Dx^1).] ]
140: dt-list { dup length 0 eq { pop [ (0). ] } { } ifelse } map /dt-list set
141: intw.verbose {
142: (dt-list = ) messagen dt-list message
143: } { } ifelse
144: %%% t1, -1 ; t2 , -1;
145: %% dt-list = [ [ (Dt1). (Dt2). ] [ (1). ] ]
146: %% gg1 = [ (t1+t2). (t1 Dt2). ]
147: /nn gg1 length def
148: [
149: 0 1 nn 1 sub {
150: /ii set
151: dt-list ii get /dt-ii set
152: /mm dt-ii length def
153: 0 1 mm 1 sub {
154: /jj set
155: dt-ii jj get
156: gg1 ii get mul
157: [[(h). (1).]] replace
158: xvars { [ 2 1 roll . (0). ] } map replace ww laplace0
159: } for
160: } for
161: ] ans1 join /ans1 set
162: } for
163: intw.verbose {
164: ( ans1 = [ degree-k1, ..., degree-0] = ) messagen
165: ans1 message
166: } { } ifelse
167:
168: intw.verbose
169: { (Eliminating xvars (variable of integration.) ) message }
170: { } ifelse
171: ans1 { dup (0). eq { pop } { } ifelse } map /ans1 set
172: ans1 [ ] eq
173: { [ $There is no relation. It means that there are ($
174: k1 1 add
175: $)*(length-of-the-input-vector) free basis.$
176: ] {toString messagen} map
177: ( ) message
178: /ans2 [ ] def /integral-k1.L1 goto
179: } { } ifelse
180: [vv ring_of_differential_operators
181: %% elimination order.
182: [ xvars { 1 } map ] weight_vector 0] define_ring
183: [(NN)
184: [(NN)] system_variable xvars length sub
185: ] system_variable
186: %%%% xvars are regarded as vector index by this trick!!
187: %%%% NN should be recovered to the original value or
188: %%%% Each ring should have a flag --- <<the constant might be changed(rw)>>
189: %%%% In a future version of sm1, when setUpRing is called, sm1 looks for
190: %%%% ring data base and if it finds the same ring and the flag of the ring
191: %%%% is (ro), then it does not generate a new ring structure. 1998, 11/19.
192: (isSameComponent) (xd) switch_function %% for test.
193:
194: [ ans1 { toString . } map ] groebner_sugar 0 get /ans2 set
195: /integral0.ans ans2 def
196:
197: intw.stat
198: { (Size of GB integral0.gg1 is ) messagen integral0.gg1 length message
199: (Size of the generators of the submodule integral0.ans is ) messagen
200: integral0.ans length message
201: } { } ifelse
202:
203: /integral-k1.L1
204: %%%% Compute the vector space basis
205: %%% /www2 /vbase /ebase /vbase2
206: %% xvars = [(x) (z)], www2 = [1 1], k1=2, vec-length=2
207: %% [1 e] [1, x, z, x^2, x z, z^2]
208: /www2 dvars 1 get { dup isString { pop } { } ifelse } map def
209: [xvars www2 k1] ip1a /vbase set
210: vbase { toString . } map /vbase set
211: [0 1 vec-length 1 sub { @@@.esymbol . 2 1 roll npower } for] /ebase set
212: /vbase2 [ ] def ebase { vbase mul vbase2 join /vbase2 set} map
213: intw.verbose {
214: (base is ) messagen vbase2 message
215: } { } ifelse
216:
217: /arg1 [ans2 vbase2] def
218: ] pop
219: popEnv
220: popVariables
221: arg1
222: } def
223:
224: /homogenize2 {
225: /arg1 set
226: [/in-homogenize2 /f /ans] pushVariables
227: [
228: /f arg1 def
229: f isArray {
230: f { homogenize } map /ans set
231: }
232: { /ans f homogenize def
233: } ifelse
234: /arg1 ans def
235: ] pop
236: popVariables
237: arg1
238: } def
239:
240:
241: %%% aux functions.
242: %% ww = [(x) -1 (Dx) 1 (z) -1 (Dz) 1]
243: %% getdvars2 ==> dvars = [[(Dx) (Dz)] [(Dx) 1 (Dz) 1]]
244: %% getxvars2 ==> xvars = [(x) (z)]
245: /getxvars2 {
246: /arg1 set
247: [/in-getxvars2 /ww /vv /ans /ii /nn /ans] pushVariables
248: [ /ww arg1 def
249: /ans [ ] def
250: /nn ww length def
251: 0 1 nn 1 sub {
252: /ii set
253: ww ii get (type?) dc 1 eq
254: { } % skip, may be weight [(x) 2 ] is OK.
255: {
256: /vv ww ii get (string) dc def
257: vv (array) dc 0 get
258: @@@.Dsymbol (array) dc 0 get
259: eq %% If the first character is D?
260: { } % skip
261: { ans [ vv ] join /ans set }
262: ifelse
263: } ifelse
264: } for
265: /arg1 ans def
266: ] pop
267: popVariables
268: arg1
269: } def
270: %% ww = [(x) -1 (Dx) 1 (z) -1 (Dz) 1]
271: %% dvars = [[(Dx) (Dz)] [(Dx) 1 (Dz) 1]]
272: %% xvars = [(x) (z)]
273: /getdvars2 {
274: /arg1 set
275: [/in-getdvars2 /ww /vv /ans /ii /nn /ans1 /ans2] pushVariables
276: [ /ww arg1 def
277: /ans1 [ ] def /ans2 [ ] def
278: /nn ww length def
279: 0 1 nn 1 sub {
280: /ii set
281: ww ii get (type?) dc 1 eq
282: { } % skip, may be weight [(x) 2 ] is OK.
283: {
284: /vv ww ii get (string) dc def
285: vv (array) dc 0 get
286: @@@.Dsymbol (array) dc 0 get
287: eq %% If the first character is D?
288: { ans1 [ vv ] join /ans1 set
289: ans2 [ vv ww ii 1 add get ] join /ans2 set
290: }
291: { } %% skip
292: ifelse
293: } ifelse
294: } for
295: /arg1 [ans1 ans2] def
296: ] pop
297: popVariables
298: arg1
299: } def
300:
301: [(wbf)
302: [([[f1 ... fm] [v1 ... vn] [v1 w1 ... vp wp]] wbf [g1 ... gq])
303: (<poly>|<string> f1 ...fm; <string> v1 ... vn;)
304: (<string> v1 ... vp; <integer> w1 ... wp;)
305: (<poly> g1 ... gq;)
306: (f1 ... fm are generators, v1 ... vn are variables,)
307: (w1 is the weight of the variable v1, ...)
308: (THE ORDERS OF INTEGRAL VARIABLES MUST BE SAME BOTH IN THE SECOND AND)
309: (THE THIRD ARGUMENTS. INTEGRAL VARIABLES MUST APPEAR FIRST.)
310: (If the weight is not generic, then the function exits with error.)
311: (cf. bf-111 for w=(1 1 1 1 ...) )
312: $Example 1: [[(x-y) (Dx+Dy)] [(y) (x)] [(y) -1 (Dy) 1]] wbf$
313: $ restrict only for y.$
314: $Example 2: [[(-3 x^2 Dy-2 y Dx) (2 x Dx+3 y Dy+6)] [(x) (y)]$
315: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] wbf$
316: $Example 3: [[[(0) (x^2 Dx+x)] [(Dx^2+x Dx^3) (0)]] [(x)]$
317: $ [(x) -1 (Dx) 1]] wbf$
318: ]
319: ] putUsages ( wbf ) messagen
320: /wbf {
321: /arg1 set
322: [/in-wbf /aaa] pushVariables
323: [ /aaa arg1 def
324: aaa [1] join intwbf /arg1 set
325: ] pop
326: popVariables
327: arg1
328: } def
329:
330: [(intwbf)
331: [([[f1 ... fm] [v1 ... vn] [v1 w1 ... vp wp]] intwbf [g1 ... gq])
332: (<poly>|<string> f1 ...fm; <string> v1 ... vn;)
333: (<string> v1 ... vp; <integer> w1 ... wp;)
334: (<poly> g1 ... gq;)
335: (f1 ... fm are generators, v1 ... vn are variables,)
336: (w1 is the weight of the variable v1, ...)
337: (THE ORDERS OF INTEGRAL VARIABLES MUST BE SAME BOTH IN THE SECOND AND)
338: (THE THIRD ARGUMENTS. INTEGRAL VARIABLES MUST APPEAR FIRST.)
339: (If the weight is not generic, then the function exits with error.)
340: $Example 1: [[(x-y) (Dx+Dy)] [(y) (x)] [(y) -1 (Dy) 1]] intwbf$
341: $ integrate only for y.$
342: $Example 2: [[(-3 x^2 Dy-2 y Dx) (2 x Dx+3 y Dy+6)] [(x) (y)]$
343: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] intwbf$
344: $Example 3: [[[(0) (x^2 Dx+x)] [(Dx^2+x Dx^3) (0)]] [(x)]$
345: $ [(x) -1 (Dx) 1]] intwbf$
346: ]
347: ] putUsages ( intwbf ) messagen
348:
349: /intwbf {
350: /arg1 set
351: [/in-integral0 /ff /vv /ww /gg1 /gg2 /ord-vec
352: /dt-list /nn /ii /dt-ii /mm /jj /xvars /dvars /ans1 /k1 /kk /ans2
353: /vec-input /gg1.init /gg1.init2 /complementxvars /gg1.init3
354: /rest-bf
355: ] pushVariables
356: [(CurrentRingp) (KanGBmessage)] pushEnv
357: [
358: /ff arg1 0 get def
359: /vv arg1 1 get def
360: /ww arg1 2 get def
361: arg1 length 4 eq {
362: /rest-bf 1 def
363: intw.verbose { (bf for restriction.) message } { } ifelse
364: } {
365: /rest-bf 0 def
366: intw.verbose { (bf for integration.) message } { } ifelse
367: } ifelse
368: intw.verbose
369: { [ff vv ww ] messagen ( is the input. ) message } { } ifelse
370: ff 0 get isArray {
371: ff { {toString} map } map /ff set
372: /vec-input 1 def
373: }{
374: ff {toString} map /ff set
375: /vec-input 0 def
376: } ifelse
377: /vv vv { (,) 2 cat_n } map aload length cat_n def
378: intw.verbose { vv message } { } ifelse
379: [(KanGBmessage) intw.verbose] system_variable
380: [vv ring_of_differential_operators
381: [ww] weight_vector 0] define_ring
382: ww getxvars2 /xvars set
383: ww getdvars2 /dvars set
384: intw.verbose {
385: (xvars = ) messagen xvars message
386: (dvars = ) messagen dvars message
387: } { } ifelse
388: %% ww = [(x) -1 (Dx) 1 (z) -1 (Dz) 1]
389: %% dvars = [[(Dx) (Dz)] [(Dx) 1 (Dz) 1]]
390: %% xvars = [(x) (z)]
391: /integral0.ff ff def %% keep variable for debug.
392:
393: rest-bf {
394: %% No Laplace transform for the restriction.
395: vec-input {
396: ff { { . [[(h). (1).]] replace } map homogenize } map /ff set
397: } {
398: ff { . [[(h). (1).]] replace homogenize } map /ff set
399: } ifelse
400: }{
401: vec-input {
402: ff { { . [[(h). (1).]] replace ww laplace0} map homogenize } map /ff set
403: } {
404: ff { . [[(h). (1).]] replace ww laplace0 homogenize } map /ff set
405: } ifelse
406: } ifelse
407:
408: intw.verbose {
409: (Computing Groebner basis with the weight vector ) messagen
410: ww message
411: } { } ifelse
412: [ff] groebner 0 get {[[(h). (1).]] replace} map /gg1 set
413: intw.verbose {
414: gg1 message %% keep variable for debug.
415: } { } ifelse
416: %% gg1 is the (-w,w)-adapted basis.
417: /integral0.gg1 gg1 def
418: %%% The above code is as same as that of integral-k1
419:
420: intwbf.aux1
421: /arg1 set
422: ] pop
423: popEnv
424: popVariables
425: arg1
426: } def
427:
428: /intwbf.aux1 {
429: [/gg1.init /gg1.init2 /complementxvars /gg1.init3] pushVariables
430: [(CurrentRingp)] pushEnv
431: [
432: %%% It uses local variables in intwbf or integral-k1
433: %%%%%%% Let's compute the b-function. It only works for full integration
434: %%%%%%% and generic weight vector.
435: %% order must be defined by (1) www and (2) [@@@.esymbol 1]
436: %% (x Dx^2 e + Dx e + x e + Dx) -->x Dx^2 e + Dx e + Dx --> (x Dx^2 + Dx)e
437: intw.verbose {
438: [(-------------- computing the b-ideal for generic initial. ---------)
439: $-------- if the output is [(e f_1(x,y)) (e f_2(x,y)) g_1(x,y) g_2(x,y) --$
440: $-------- then (f_1,f_2) cap (g_1,g_2) would be the b-ideal. $
441: ]{message} map
442: } { } ifelse
443: /complementxvars xvars [vv to_records pop] complement def
444: intw.verbose {
445: (vv = ) messagen vv message
446: (step1. complementxvars = ) messagen complementxvars message
447: } { } ifelse
448: complementxvars { dup @@@.Dsymbol 2 1 roll 2 cat_n } map
449: /complementxvars set
450: intw.verbose {
451: (step2. complementxvars = ) messagen complementxvars message
452: } { } ifelse
453: %% vv = (x,y,z)
454: %% xvars = [(x) (z)]
455: %% complementxvars = [(y) (Dy)]
456:
457: gg1 {ww weightv init [@@@.esymbol 1] weightv init} map /gg1.init set
458: intw.verbose {
459: gg1.init message
460: } { } ifelse
461: gg1.init { xvars {.} map dvars 0 get {.} map xvars {.} map
462: distraction2 } map /gg1.init2 set
463: %% remove 0
464: gg1.init2 { dup (0). eq { pop } { } ifelse } map /gg1.init2 set
465:
466: %% Let's eliminate complementxvars
467: complementxvars [ ] eq { }
468: {
469: [vv ring_of_differential_operators
470: [ complementxvars { 1 } map ] weight_vector 0] define_ring
471: [gg1.init2 { dehomogenize toString . } map] groebner_sugar
472: 0 get /gg1.init3 set
473: gg1.init3 complementxvars eliminatev /gg1.init2 set
474: } ifelse
475:
476: intw.verbose {
477: (b-ideal is --------) message
478: gg1.init2 message
479: } { } ifelse
480:
481: gg1.init2 /arg1 set
482: ] pop
483: popEnv
484: popVariables
485: arg1
486: } def
487:
488: %%% see, gbhg3/Int/int1.sm1
489:
490:
491: [(ip1a)
492: [([vlist wlist k] ip1a slist)
493: ( x^i ; i_1 w_1 + ... + i_p w_p <= k )
494: (Example 1: [[(x) (y) (z)] [1 1 1] 3] ip1a )
495: (Example 2: [[(x)] [1] 4] ip1a )
496: ]] putUsages
497: /ip1a {
498: /arg1 set
499: [/in-ip1a /vlist /wlist /kk /ans /i] pushVariables
500: [(CurrentRingp)] pushEnv
501: [
502: /vlist arg1 0 get def
503: /wlist arg1 1 get def
504: /kk arg1 2 get def
505:
506: [vlist from_records ring_of_polynomials 0] define_ring
507: vlist { toString . } map /vlist set
508: /ans [ ] def
509: 0 1 kk {
510: /i set
511: vlist wlist i ip1 ans join /ans set
512: } for
513: ans /arg1 set
514: ] pop
515: popEnv
516: popVariables
517: arg1
518: } def
519:
520:
521: %% [(x1) (x2)] typeL [ [[(Dx1) (Dx1+D_z1)] [(Dx2) (Dx2+D_z2)]]
522: %% [(_z1) (_z2)] ]
523: /typeL {
524: /arg1 set
525: [/in-typeL /xvars /n /zlist /i /tmpr] pushVariables
526: [
527: /xvars arg1 def
528: xvars length /n set
529: [ 1 1 n { toString } for ] /zlist set
530: zlist { (_z) 2 1 roll 2 cat_n } map /zlist set
531: %% [(_z1) (_z2) ... ]
532: /rule [ 1 1 n { pop 0 } for ] def
533: 0 1 n 1 sub {
534: /i set
535: [ @@@.Dsymbol xvars i get 2 cat_n
536: [@@@.Dsymbol xvars i get
537: (+)
538: @@@.Dsymbol zlist i get
539: ] cat
540: ] /tmpr set
541: rule i tmpr put
542: } for
543: /arg1 [rule zlist] def
544: ] pop
545: popVariables
546: arg1
547: } def
548:
549: %% [(x1) (x2)] typeR [ [[(x1) (x1-_z1)] [(x2) (x2-_z2)]
550: %% [(Dx1) (-D_z1)] [(Dx2) (-D_z2)]]
551: %% [(_z1) (_z2)] ]
552: /typeR {
553: /arg1 set
554: [/in-typeL /xvars /n /zlist /i /tmpr] pushVariables
555: [
556: /xvars arg1 def
557: xvars length /n set
558: [ 1 1 n { toString } for ] /zlist set
559: zlist { (_z) 2 1 roll 2 cat_n } map /zlist set
560: %% [(_z1) (_z2) ... ]
561: /rule [ 1 1 n 2 mul { pop 0 } for ] def
562: 0 1 n 1 sub {
563: /i set
564: [ @@@.Dsymbol xvars i get 2 cat_n
565: [
566: (-)
567: @@@.Dsymbol zlist i get
568: ] cat
569: ] /tmpr set
570: rule << i n add >> tmpr put
571: [ xvars i get
572: [ xvars i get
573: (-)
574: zlist i get
575: ] cat
576: ] /tmpr set
577: rule i tmpr put
578: } for
579: /arg1 [rule zlist] def
580: ] pop
581: popVariables
582: arg1
583: } def
584:
585: /tensor0 {
586: /arg1 set
587: [/in-tensor0 /vlist
588: /vlist2 /exteriorTensor /aaa /ans
589: ] pushVariables
590: [
591: arg1 tensor0.aux /aaa set
592: /exteriorTensor aaa 0 get def
593: /vlist aaa 1 get def
594: /vlist2 aaa 2 get def
595: [exteriorTensor vlist2 [ vlist vlist2 join [ ]] 0] message
596: [exteriorTensor vlist2 [ vlist vlist2 join [ ]] 0] restriction
597: /ans set
598: ans 0 get toVectors2 /arg1 set
599: ]pop
600: popVariables
601: arg1
602: } def
603:
604: /tensor1 {
605: /arg1 set
606: [/in-tensor0 /vlist
607: /vlist2 /exteriorTensor /aaa /ans
608: ] pushVariables
609: [
610: arg1 tensor0.aux /aaa set
611: /exteriorTensor aaa 0 get def
612: /vlist aaa 1 get def
613: /vlist2 aaa 2 get def
614: [exteriorTensor vlist2 [ vlist vlist2 join [ ]]] message
615: [exteriorTensor vlist2 [ vlist vlist2 join [ ]]] restriction
616: /ans set
617: ans {toVectors2} map /arg1 set
618: ]pop
619: popVariables
620: arg1
621: } def
622:
623:
624:
625: /tensor0.aux {
626: /arg1 set
627: [/in-tensor0.aux /mLeft /mRight /vlist
628: /ruleL /ruleR /vlist2 /exteriorTensor
629: ] pushVariables
630: [(CurrentRingp)] pushEnv
631: [
632: /mLeft arg1 0 get def
633: /mRight arg1 1 get def
634: /vlist arg1 2 get def
635:
636: mLeft {toString} map /mLeft set
637: mRight {toString} map /mRight set
638: vlist isString {
639: [vlist to_records pop ] /vlist set
640: } { } ifelse
641:
642: /ruleL vlist typeL 0 get def
643: /ruleR vlist typeR 0 get def
644: /vlist2 vlist typeL 1 get def
645:
646: [vlist vlist2 join from_records
647: ring_of_differential_operators 0] define_ring
648: ruleL { { . } map } map /ruleL set
649: ruleR { { . } map } map /ruleR set
650:
651: mLeft { . ruleL replace dehomogenize } map /mLeft set
652: mRight { . ruleR replace dehomogenize } map /mRight set
653:
654: /exteriorTensor mLeft mRight join { toString } map def
655:
656: /arg1 [exteriorTensor vlist vlist2] def
657: ] pop
658: popEnv
659: popVariables
660: arg1
661: } def
662:
663: [(tensor0)
664: [( [F G vlist] tensor0 )
665: (This function requires the package cohom.sm1.)
666: (Example 1:)
667: ( [[(2 x Dx - 1)] [(2 x Dx - 3)] (x)] tensor0 )
668: (Example 2:)
669: ( [[(-x*Dx^2+x-Dx+1)] [((x Dx + x +1)(Dx-1))] (x)] tensor0 )
670: (Example 3:)
671: ( [[(x Dx -1) (y Dy -4)] [(Dx + Dy) (Dx-Dy^2)] (x,y)] tensor0 )
672: ]] putUsages
673: (tensor0 ) messagen
674:
675: /wTensor0 {
676: /arg1 set
677: [/in-wTensor0 /vlist
678: /vlist2 /exteriorTensor /aaa /ans /weight /i /wlist
679: ] pushVariables
680: [
681: arg1 /aaa set
682: aaa 3 get /wlist set
683: [aaa 0 get aaa 1 get aaa 2 get] tensor0.aux /aaa set
684: /exteriorTensor aaa 0 get def
685: /vlist aaa 1 get def
686: /vlist2 aaa 2 get def
687:
688: [
689: 0 1 wlist length 1 sub {
690: /i set
691: vlist2 i get
692: 0 wlist i get sub
693: [@@@.Dsymbol vlist2 i get] cat
694: wlist i get
695: } for
696: ] /weight set
697: [exteriorTensor vlist vlist2 join weight] message
698: [exteriorTensor vlist vlist2 join weight] wRestriction0
699: /ans set
700: ans 0 get toVectors2 /arg1 set
701: ]pop
702: popVariables
703: arg1
704: } def
705: (wTensor0 ) messagen
706: [(wTensor0)
707: [([F G v weight] wTensor0)
708: (See tensor0)
709: (It calls wRestriction0 instead of restriction.)
710: (Example 1:)
711: ( [[(x Dx -1) (y Dy -4)] [(Dx + Dy) (Dx-Dy^2)] (x,y) [1 2]] wTensor0 )
712: ]] putUsages
713:
714: %% analyzing a given b-ideal.
715: /integralRoots001 {
716: /arg1 set
717: [/in-integralRoots00 /R /ff /n /i /j
718: /ans /ans2
719: ] pushVariables
720: [(CurrentRingp)] pushEnv
721: [
722: /ff arg1 def
723: /R ff 0 get (ring) dc def
724: [(CurrentRingp) R] system_variable
725:
726: ff toVectors /ff set
727: /n 0 def
728: 0 1 ff length 1 sub {
729: /i set
730: ff i get length n gt
731: { /n ff i get length def }
732: { } ifelse
733: } for %% n is the maximal length.
734:
735: [ 1 1 n { } for ] /ans set
736: 1 1 n {
737: /i set
738: /ans2 [ ] def
739: 0 1 ff length 1 sub {
740: /j set
741: ff j get length i eq {
742: ans2 [ ff j get i 1 sub get ] join /ans2 set
743: } { } ifelse
744: } for
745: ans << i 1 sub >> ans2 put
746: } for
747: /arg1 ans def
748: ] pop
749: popEnv
750: popVariables
751: arg1
752: } def
753:
754: /intwbfRoots {
755: /arg1 set
756: [/in-intwbfRoots /aaa /ggg /vvv /www] pushVariables
757: [
758: /aaa arg1 def
759: aaa 2 get getxvars2 { toString } map /vvv set
760: aaa 2 get getdvars2 1 get
761: { dup isString { pop } { } ifelse } map /www set
762: (vvv=) messagen vvv message
763: (www=) messagen www message
764: aaa length 3 {
765: %% integration.
766: aaa intwbf
767: /intwbf.bideal set %% global var
768: } {
769: %% restriction
770: aaa wbf
771: /intwbf.bideal set %% global var
772: } ifelse
773: intwbf.bideal integralRoots001
774: /intwbf.bideal2 set %% global var
775: (b-ideal is ) messagen intwbf.bideal2 message
776: (It is in the global variable intwbf.bideal2.) message
777: intwbf.bideal2
778: { /ggg set
779: %% [ggg vvv www] { { (type?) dc } map } map message error
780: [ggg vvv www] rationalRoots2
781: } map
782: /ggg set
783:
784: %% Integer 0 is returned as a null by ox_asir.
785: ggg {{ dup tag 0 eq { pop 0 } { } ifelse } map} map /ggg set
786:
787: (vvv = ) messagen vvv message
788: (www = ) messagen www message
789: (Roots are ) messagen ggg message
790:
791:
792: [-intInfinity] ggg flatten join shell rest /arg1 set
793: ] pop
794: popVariables
795: arg1
796: } def
797:
798: [(intwbfRoots)
799: [(This function needs oxasir --- rationalRoots2)
800: $This function is defined in intw.sm1 and requires oxasir.sm1 and ox_asir server.$
801: $Example 1: [[(-3 x^2 Dy-2 y Dx) (2 x Dx+3 y Dy+6)] [(x) (y)] $
802: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] intwbfRoots $
803: $Example 2: [[[(0) (x^2 Dx+x)] [(Dx^2+x Dx^3) (0)]] [(x)] $
804: $ [(x) -1 (Dx) 1]] intwbfRoots $
805: ]] putUsages
806: (intwbfRoots ) messagen
807:
808: /wbfRoots {
809: /arg1 set
810: [/in-wbfRoots /aaa ]pushVariables
811: [
812: /aaa arg1 def
813: aaa [1] join intwbfRoots /arg1 set
814: ] pop
815: popVariables
816: arg1
817: } def
818: [(wbfRoots)
819: [(This function needs oxasir --- rationalRoots2)
820: $This function is defined in intw.sm1 and requires oxasir.sm1 and ox_asir server.$
821: $Example 1: [[(-3 x^2 Dy-2 y Dx) (2 x Dx+3 y Dy+6)] [(x) (y)] $
822: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] wbfRoots $
823: $Example 2: [[[(0) (x^2 Dx+x)] [(Dx^2+x Dx^3) (0)]] [(x)] $
824: $ [(x) -1 (Dx) 1]] wbfRoots $
825: ]] putUsages
826: (wbfRoots ) messagen
827:
828:
829:
830: /wIntegration0 {
831: /arg1 set
832: [/in-wIntegration /aaa /rrr /k1 /ans] pushVariables
833: [
834: /aaa arg1 def
835: aaa intwbfRoots /rrr set
836: rrr << rrr length 1 sub >> get /k1 set
837: k1 0 lt {
838: /ans [ ] def
839: } {
840: aaa [k1] join integral-k1 /ans set
841: } ifelse
842: (k1 = ) messagen k1 message
843: /arg1 ans def
844: ] pop
845: popVariables
846: arg1
847: } def
848:
849: (wIntegration0 ) message
850: [(wIntegration0)
851: [( [gg vlist weight] wIntegration0 [ igg bb] )
852: (list of strings gg; list of strings vlist;)
853: (list weight;)
854: (integer k1;)
855: (list of polys igg; list of polys base;)
856: (gg are input ideal or submodule.)
857: (igg are relations and bb are bases. They give the integral.)
858: (This function fails when weight is not generic.)
859: (cf. intwbf, intwbfRoots, integral-k1. )
860: $This function is defined in intw.sm1 and requires oxasir.sm1 and ox_asir server.$
861: $See Grobner Deformations of Hypergeometric Differential Equations, Springer$
862: $ Section 5.5 for the algorithm.$
863: $Example 1: [ [(Dt - (3 t^2-x)) (Dx + t)] [(t) (x)] [(t) -1 (Dt) 1]] $
864: $ wIntegration0 $
865: $Example 2: [[(-3 x^2 Dy-2 y Dx) (2 x Dx+3 y Dy+6)] [(x) (y)] $
866: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] wIntegration0 $
867: $ The output [[-x, 1] [x,1]] implies the integral is $
868: $ (K x + K 1)/(K (-x) + K 1) = 0 where K is the base field and$
869: $ x and 1 is the vector space basis.$
870: $ Note that the order of weight and the order of the variables$
871: $ must be the same. Note also that the next of (x) must be (Dx)$
872: $ and so on.$
873: ]] putUsages
874:
875: /wRestriction0 {
876: /arg1 set
877: [/in-wRestriction0 /gg /vlist /v0 /vv /b /aaa /ans] pushVariables
878: [(CurrentRingp)] pushEnv
879: [
880: /aaa arg1 def
881: /gg aaa 0 get def
882: /vlist aaa 1 get def
883: vlist isArray
884: { vlist from_records /v0 set }
885: { /v0 vlist def vlist to_records /vlist set } ifelse
886: /vv vlist vlist { /b set [@@@.Dsymbol b] cat } map join def
887: [v0 ring_of_differential_operators 0] define_ring pop
888: gg 0 get isArray {
889: gg { { toString . vv laplace0 toString } map } map /gg set
890: }
891: {
892: gg { toString . vv laplace0 toString } map /gg set
893: } ifelse
894: /ans [gg] aaa rest join wIntegration0 def
895:
896: [v0 ring_of_differential_operators 0] define_ring pop
897: ans { { toString . vv laplace0 } map } map /ans set
898: /arg1 ans def
899: ] pop
900: popEnv
901: popVariables
902: arg1
903: } def
904:
905: (wRestriction0 ) messagen
906: [(wRestriction0)
907: [( [gg vlist weight] wRestriction0 [ igg bb] )
908: (list of strings gg; list of strings vlist;)
909: (list weight;)
910: (integer k1;)
911: (list of polys igg; list of polys base;)
912: (gg are input ideal or submodule.)
913: (igg are relations and bb are bases. They give the 0-th restriction.)
914: (This function fails when weight is not generic.)
915: (cf. intwbf, intwbfRoots, integral-k1. )
916: $This function is defined in intw.sm1 and requires oxasir.sm1 and ox_asir server.$
917: $See Grobner Deformations of Hypergeometric Differential Equations, Springer$
918: $ Section 5.5 for the algorithm.$
919: $Example 1: [ [(Dt^2) (Dx^2)] [(t) (x)] [(t) -1 (Dt) 1]] $
920: $ wRestriction0 $
921: $Example 2: [[(Dx^2) (Dy^2)] [(x) (y)] $
922: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] wRestriction0 $
923: $ The output [[-Dx, 1] [Dx,1]] implies the restriction is $
924: $ (K Dx + K 1)/(K (-Dx) + K 1) = 0 where K is the base field and$
925: $ Dx and 1 is the vector space basis.$
926: $ Note that the order of weight and the order of the variables$
927: $ must be the same. Note also that the next of (x) must be (Dx)$
928: $ and so on.$
929: ]] putUsages
930:
931:
932:
933: /ann-t-f {
934: /arg1 set
935: [/in-ann-t-f /f /vlist /s /vvv /nnn /rrr
936: /v1 /ops /ggg /ggg0
937: ] pushVariables
938: [(CurrentRingp) (KanGBmessage)] pushEnv
939: [
940: /f arg1 0 get def /vlist arg1 1 get def
941: f toString /f set
942: vlist { toString } map /vlist set
943: [(KanGBmessage) fs.verbose] system_variable
944: /s vlist 0 get def
945: /vvv (_u,_v,_t,) vlist rest { (,) 2 cat_n } map aload length /nnn set
946: s nnn 2 add cat_n def
947: fs.verbose { vvv message } { }ifelse
948: [vvv ring_of_differential_operators
949: [[(_u) 1 (_v) 1]] weight_vector 0] define_ring /rrr set
950:
951: [ (_t). f . sub ]
952: vlist rest { /v1 set
953: f . @@@.Dsymbol v1 2 cat_n . 1 diff0 [@@@.Dsymbol (_t)] cat . mul
954: @@@.Dsymbol v1 2 cat_n . add } map
955: join
956: /ops set
957: ops {[[(h). (1).]] replace } map /ops set
958: fs.verbose { ops message } { }ifelse
959: ops { [[(_t). s .] [[@@@.Dsymbol (_t)] cat . @@@.Dsymbol s 2 cat_n .]] replace dehomogenize } map
960: /arg1 set
961: ] pop
962: popEnv
963: popVariables
964: arg1
965: } def
966: [(ann-t-f)
967: [(ann-t-f returns the annihilating ideal of delta(t-f(x)))
968: $Example: [(x^3-y^2) [(t) (x) (y)]] ann-t-f $
969: ]] putUsages
970: (ann-t-f ) messagen
971:
972: /bf-111 {
973: /arg1 set
974: [/in-bf-111 /aa /vlist /rest-vlist] pushVariables
975: [(CurrentRingp) (KanGBmessage)] pushEnv
976: [
977: /aa arg1 def
978: aa 1 get /vlist set
979: aa 2 get /rest-vlist set
980: /vlist [vlist to_records pop] def
981: /rest-vlist [rest-vlist to_records pop] def
982: /BFvarlist vlist def /BFparlist [ ] def
983: aa 0 get { toString} map
984: rest-vlist bfm 0 get /bf-111.bfunc set
985: /arg1 bf-111.bfunc def
986: ] pop
987: popEnv
988: popVariables
989: arg1
990: } def
991: [(bf-111)
992: [( [ideal vlist rest-vlist bf-111] bf-111 )
993: (Compute the b-function for the weight vector 11111 for the variables)
994: (res-vlist. cf. wbf)
995: (Example: [ [((x Dx -1 ) x Dx (x Dx + 2)) (y Dy)] (x,y) (x)] bf-111 )
996: ]] putUsages
997: (bf-111 ) messagen
998:
999: /wdeRham0 {
1000: /arg1 set
1001: [/in-wdeRham0 /aaa /ff0 /vlist /myweight] pushVariables
1002: [
1003: /aaa arg1 def
1004: /ff0 arg1 0 get def
1005: /vlist arg1 1 get def
1006: /myweight arg1 2 get def
1007: [ff0 vlist] annfs /ff0 set
1008:
1009: /vlist [vlist to_records pop ] def
1010: [ff0 0 get vlist myweight] wIntegration0
1011: /arg1 set
1012: ] pop
1013: popVariables
1014: arg1
1015: } def
1016: (wdeRham0 ) messagen
1017: [(wdeRham0)
1018: [ $It computes the midle dimensional cohomology groups and bases.$
1019: $A generic weight vector is used for the computation.$
1020: $This function is defined in intw.sm1 and requires oxasir.sm1 and ox_asir server.$
1021: $ Example 1 : [(x^3-y^2) (x,y) [(x) -1 (Dx) 1 (y) -2 (Dy) 2]] wdeRham0 $
1022: $ Example 2 : [(x^3+y^3+z^3) (x,y,z) $
1023: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2 (z) -3 (Dz) 3]] wdeRham0 $
1024: $ Example 3 : [(x^3 -y z^2) (x,y,z) $
1025: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2 (z) -3 (Dz) 3]] wdeRham0 $
1026: $ Example 4 : [(x^3 -y^2 z^2) (x,y,z) $
1027: $ [(x) -1 (Dx) 1 (y) -2 (Dy) 2 (z) -3 (Dz) 3]] wdeRham0 $
1028: ]] putUsages
1029:
1030: /intw.sm1.loaded 1 def
1031:
1032: ( ) message ;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>