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