Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Implift/transforming_laurent_systems.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
2: with Integer_Vectors_Utilities; use Integer_Vectors_Utilities;
3:
4: package body Transforming_Laurent_Systems is
5:
6: function Initial_Link_to_Vector ( p : Poly ) return Link_to_Vector is
7:
8: -- DESCRIPTION :
9: -- Returns the initial degrees of the polynomial p.
10:
11: init : Link_to_Vector;
12:
13: procedure Init_Term ( t : in Term; cont : out boolean ) is
14: begin
15: init := new Standard_Integer_Vectors.Vector'(t.dg.all);
16: cont := false;
17: end Init_Term;
18: procedure Initial_Term is new Visiting_Iterator (Init_Term);
19:
20: begin
21: Initial_Term(p);
22: return init;
23: end Initial_Link_to_Vector;
24:
25: procedure Shift ( p : in out Poly ) is
26:
27: init : Link_to_Vector := Initial_Link_to_Vector(p);
28:
29: procedure Shift_Term ( t : in out Term; cont : out boolean ) is
30: begin
31: Sub(Link_to_Vector(t.dg),init);
32: cont := true;
33: end Shift_Term;
34: procedure Shift_Terms is new Changing_Iterator (Shift_Term);
35:
36: begin
37: if p /= Null_Poly
38: then Shift_Terms(p);
39: end if;
40: Clear(init);
41: end Shift;
42:
43: function Shift ( p : Poly ) return Poly is
44:
45: res : Poly := Null_Poly;
46: init : Link_to_Vector := Initial_Link_to_Vector(p);
47:
48: procedure Shift_Term ( t : in Term; cont : out boolean ) is
49: rt : Term;
50: begin
51: rt.cf := t.cf;
52: rt.dg := t.dg - Degrees(init);
53: Add(res,rt);
54: Clear(rt);
55: cont := true;
56: end Shift_Term;
57: procedure Shift_Terms is new Visiting_Iterator (Shift_Term);
58:
59: begin
60: if p /= Null_Poly
61: then Shift_Terms(p);
62: end if;
63: Clear(init);
64: return res;
65: end Shift;
66:
67: procedure Shift ( l : in out Laur_Sys ) is
68: begin
69: for k in l'range loop
70: Shift(l(k));
71: end loop;
72: end Shift;
73:
74: function Shift ( l : Laur_Sys ) return Laur_Sys is
75:
76: res : Laur_Sys (l'range);
77:
78: begin
79: for k in l'range loop
80: res(k) := Shift(l(k));
81: end loop;
82: return res;
83: end Shift;
84:
85: procedure Transform ( t : in Transfo; p : in out Poly ) is
86:
87: procedure Transform_Term ( tt : in out Term; cont : out boolean ) is
88: begin
89: Apply(t,Link_to_Vector(tt.dg));
90: cont := true;
91: end Transform_Term;
92: procedure Transform_Terms is new Changing_Iterator (Transform_Term);
93:
94: begin
95: Transform_Terms(p);
96: end Transform;
97:
98: function Transform ( t : Transfo; p : Poly ) return Poly is
99:
100: res : Poly;
101:
102: begin
103: Copy(p,res);
104: Transform(t,res);
105: return res;
106: end Transform;
107:
108: function Transform2 ( t : Transfo; p : Poly ) return Poly is
109:
110: -- IMPORTANT : This function might change the term order !
111:
112: res : Poly := Null_Poly;
113:
114: procedure Transform_Term ( tt : in Term; cont : out boolean ) is
115: rt : Term;
116: begin
117: rt.cf := tt.cf;
118: rt.dg := Degrees(t*Link_to_Vector(tt.dg));
119: Add(res,rt);
120: Clear(rt);
121: cont := true;
122: end Transform_Term;
123: procedure Transform_Terms is new Visiting_Iterator (Transform_Term);
124:
125: begin
126: Transform_Terms(p);
127: return res;
128: end Transform2;
129:
130: procedure Transform ( t : in Transfo; l : in out Laur_Sys ) is
131: begin
132: for i in l'range loop
133: Transform(t,l(i));
134: end loop;
135: end Transform;
136:
137: function Transform ( t : Transfo; l : Laur_Sys ) return Laur_Sys is
138:
139: res : Laur_Sys(l'range);
140:
141: begin
142: for i in l'range loop
143: res(i) := Transform(t,l(i));
144: end loop;
145: return res;
146: end Transform;
147:
148: function Maximal_Support ( p : Poly; v : Vector ) return integer is
149:
150: res : integer;
151: first : boolean := true;
152:
153: procedure Scan_Term ( t : in Term; cont : out boolean ) is
154:
155: sp : integer := t.dg.all*v;
156:
157: begin
158: if first
159: then res := sp; first := false;
160: elsif sp > res
161: then res := sp;
162: end if;
163: cont := true;
164: end Scan_Term;
165: procedure Scan_Terms is new Visiting_Iterator (Scan_Term);
166:
167: begin
168: Scan_Terms(p);
169: return res;
170: end Maximal_Support;
171:
172: function Maximal_Support ( p : Poly; v : Link_to_Vector ) return integer is
173: begin
174: return Maximal_Support(p,v.all);
175: end Maximal_Support;
176:
177: procedure Face ( i,m : in integer; p : in out Poly ) is
178:
179: procedure Face_Term ( t : in out Term; cont : out boolean ) is
180: begin
181: if t.dg(i) /= m
182: then t.cf := Create(0.0);
183: end if;
184: cont := true;
185: end Face_Term;
186: procedure Face_Terms is new Changing_Iterator(Face_Term);
187:
188: begin
189: Face_Terms(p);
190: end Face;
191:
192: function Face ( i,m : integer; p : Poly ) return Poly is
193:
194: res : Poly;
195:
196: begin
197: Copy(p,res);
198: Face(i,m,res);
199: return res;
200: end Face;
201:
202: function Face2 ( i,m : integer; p : Poly ) return Poly is
203:
204: -- IMPORTANT : This function might change the term order !
205:
206: res : Poly := Null_Poly;
207:
208: procedure Face_Term ( t : in Term; cont : out boolean ) is
209: begin
210: if t.dg(i) = m
211: then Add(res,t);
212: end if;
213: cont := true;
214: end Face_Term;
215: procedure Face_Terms is new Visiting_Iterator(Face_Term);
216:
217: begin
218: Face_Terms(p);
219: return res;
220: end Face2;
221:
222: procedure Face ( i,m : in integer; l : in out Laur_Sys ) is
223: begin
224: for j in l'range loop
225: Face(i,m,l(j));
226: end loop;
227: end Face;
228:
229: function Face ( i,m : integer; l : Laur_Sys ) return Laur_Sys is
230:
231: res : Laur_Sys(l'range);
232:
233: begin
234: for j in l'range loop
235: res(j) := Face(i,m,l(j));
236: end loop;
237: return res;
238: end Face;
239:
240: procedure Face ( v : in Vector; m : in integer; p : in out Poly ) is
241:
242: procedure Face_Term ( t : in out Term; cont : out boolean ) is
243: begin
244: if t.dg.all*v /= m
245: then t.cf := Create(0.0);
246: end if;
247: cont := true;
248: end Face_Term;
249: procedure Face_Terms is new Changing_Iterator(Face_Term);
250:
251: begin
252: Face_Terms(p);
253: end Face;
254:
255: function Face ( v : Vector; m : integer; p : Poly ) return Poly is
256:
257: res : Poly;
258:
259: begin
260: Copy(p,res);
261: Face(v,m,res);
262: return res;
263: end Face;
264:
265: function Face2 ( v : Vector; m : integer; p : Poly ) return Poly is
266:
267: -- IMPORTANT : This procedure might change the term order !
268:
269: res : Poly := Null_Poly;
270:
271: procedure Face_Term ( t : in Term; cont : out boolean ) is
272: begin
273: if t.dg.all*v = m
274: then Add(res,t);
275: end if;
276: cont := true;
277: end Face_Term;
278: procedure Face_Terms is new Visiting_Iterator(Face_Term);
279:
280: begin
281: Face_Terms(p);
282: return res;
283: end Face2;
284:
285: procedure Face ( v,m : in Vector; l : in out Laur_Sys ) is
286: begin
287: for i in l'range loop
288: Face(v,m(i),l(i));
289: end loop;
290: end Face;
291:
292: function Face ( v,m : Vector; l : Laur_Sys ) return Laur_Sys is
293:
294: res : Laur_Sys(l'range);
295:
296: begin
297: for i in l'range loop
298: res(i) := Face(v,m(i),l(i));
299: end loop;
300: return res;
301: end Face;
302:
303: procedure Reduce ( i : in integer; p : in out Poly ) is
304:
305: procedure Reduce_Term ( t : in out Term; cont : out boolean ) is
306: begin
307: Reduce(Link_to_Vector(t.dg),i);
308: cont := true;
309: end Reduce_Term;
310: procedure Reduce_Terms is new Changing_Iterator (Reduce_Term);
311:
312: begin
313: Reduce_Terms(p);
314: end Reduce;
315:
316: function Reduce ( i : integer; p : Poly ) return Poly is
317: res : Poly;
318: begin
319: Copy(p,res);
320: Reduce(i,res);
321: return res;
322: end Reduce;
323:
324: function Reduce2 ( i : integer; p : Poly ) return Poly is
325:
326: -- IMPORTANT : This function might change the term order !
327:
328: res : Poly := Null_Poly;
329:
330: procedure Reduce_Term ( t : in Term; cont : out boolean ) is
331: rt : Term;
332: begin
333: rt.cf := t.cf;
334: rt.dg := Degrees(Reduce(Link_to_Vector(t.dg),i));
335: Add(res,rt);
336: Clear(rt);
337: cont := true;
338: end Reduce_Term;
339: procedure Reduce_Terms is new Visiting_Iterator (Reduce_Term);
340:
341: begin
342: Reduce_Terms(p);
343: return res;
344: end Reduce2;
345:
346: procedure Reduce ( i : in integer; l : in out Laur_Sys ) is
347: begin
348: for j in l'range loop
349: Reduce(i,l(j));
350: end loop;
351: end Reduce;
352:
353: function Reduce ( i : integer; l : Laur_Sys ) return Laur_Sys is
354: res : Laur_Sys(l'range);
355: begin
356: for j in l'range loop
357: res(j) := Reduce(i,l(j));
358: end loop;
359: return res;
360: end Reduce;
361:
362: procedure Insert ( i,d : in integer; p : in out Poly ) is
363:
364: procedure Insert_Term ( t : in out Term; cont : out boolean ) is
365: begin
366: Insert(Link_to_Vector(t.dg),i,d);
367: cont := true;
368: end Insert_Term;
369: procedure Insert_Terms is new Changing_Iterator (Insert_Term);
370:
371: begin
372: Insert_Terms(p);
373: end Insert;
374:
375: function Insert ( i,d : integer; p : Poly ) return Poly is
376: res : Poly;
377: begin
378: Copy(p,res);
379: Insert(i,d,res);
380: return res;
381: end Insert;
382:
383: function Insert2 ( i,d : integer; p : Poly ) return Poly is
384:
385: -- IMPORTANT : This function might change the term order !
386:
387: res : Poly := Null_Poly;
388:
389: procedure Insert_Term ( t : in Term; cont : out boolean ) is
390: rt : Term;
391: begin
392: rt.cf := t.cf;
393: rt.dg := Degrees(Insert(Link_to_Vector(t.dg),i,d));
394: Add(res,rt);
395: Clear(rt);
396: cont := true;
397: end Insert_Term;
398: procedure Insert_Terms is new Visiting_Iterator (Insert_Term);
399:
400: begin
401: Insert_Terms(p);
402: return res;
403: end Insert2;
404:
405: procedure Insert ( i,d : in integer; l : in out Laur_Sys ) is
406: begin
407: for j in l'range loop
408: Insert(i,d,l(j));
409: end loop;
410: end Insert;
411:
412: function Insert ( i,d : integer; l : Laur_Sys ) return Laur_Sys is
413: res : Laur_Sys(l'range);
414: begin
415: for j in l'range loop
416: res(j) := Insert(i,d,l(j));
417: end loop;
418: return res;
419: end Insert;
420:
421: end Transforming_Laurent_Systems;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>