Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Product/m_homogeneous_bezout_numbers.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Integer_Vectors; use Standard_Integer_Vectors;
2: with Standard_Integer_Matrices; use Standard_Integer_Matrices;
3: with Standard_Integer_Linear_Solvers; use Standard_Integer_Linear_Solvers;
4: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
5: with Sets_of_Unknowns; use Sets_of_Unknowns;
6: with Degrees_in_Sets_of_Unknowns; use Degrees_in_Sets_of_Unknowns;
7:
8: package body m_Homogeneous_Bezout_Numbers is
9:
10: -- UTILITIES :
11:
12: function Create ( p : Poly_Sys ) return Set is
13:
14: -- DESCRIPTION :
15: -- Returns the set of the unknowns of the polynomial system p.
16:
17: s : Set := Create(p'length);
18:
19: begin
20: for i in p'range loop
21: Add(s,i);
22: end loop;
23: return s;
24: end Create;
25:
26: function Cardinalities ( z : Partition ) return Vector is
27:
28: -- DESCRIPTION :
29: -- Returns a vector which contains the cardinality of each set.
30:
31: res : Vector(z'range);
32:
33: begin
34: for i in z'range loop
35: res(i) := Extent_Of(z(i));
36: end loop;
37: return res;
38: end Cardinalities;
39:
40: -- TARGET ROUTINES :
41:
42: function Total_Degree ( p : Poly_Sys ) return natural is
43:
44: d : natural := 1;
45:
46: begin
47: for i in p'range loop
48: d := d*Degree(p(i));
49: end loop;
50: return d;
51: end Total_Degree;
52:
53: function Bezout_Number ( p : Poly_Sys; z : Partition ) return natural is
54:
55: k : constant vector := Cardinalities(z);
56: d : constant matrix := Degree_Table(p,z);
57:
58: begin
59: return Per(d,k); -- returns the permanent of the degree table
60: end Bezout_Number;
61:
62: function Bezout_Number ( p : Poly_Sys; z : Partition; max : natural )
63: return natural is
64:
65: -- DESCRIPTION :
66: -- Stops when the Bezout number becomes bigger than max.
67:
68: k : constant vector := Cardinalities(z);
69: d : constant matrix := Degree_Table(p,z);
70:
71: begin
72: return Per(d,k,max); -- returns the permanent of the degree table
73: end Bezout_Number;
74:
75: function Bezout_Number ( p : Poly_Sys ) return natural is
76:
77: s : Set := Create(p);
78: res : natural := Total_Degree(p);
79:
80: procedure Evaluate ( z : in Partition; cont : out boolean ) is
81: b : constant natural := Bezout_Number(p,z,res);
82: begin
83: if b < res
84: then res := b;
85: end if;
86: cont := true;
87: end Evaluate;
88: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
89:
90: begin
91: Evaluate_Partitions(s);
92: Clear(s);
93: return res;
94: end Bezout_Number;
95:
96: function Bezout_Number ( max : natural; p : Poly_Sys ) return natural is
97:
98: s : Set := Create(p);
99: res : natural := Total_Degree(p);
100: cnt : natural := 0;
101:
102: procedure Evaluate ( z : in Partition; cont : out boolean ) is
103: b : constant natural := Bezout_Number(p,z,res);
104: begin
105: if b < res
106: then res := b;
107: end if;
108: cnt := cnt + 1;
109: if cnt < max
110: then cont := true;
111: else cont := false;
112: end if;
113: end Evaluate;
114: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
115:
116: begin
117: Evaluate_Partitions(s);
118: Clear(s);
119: return res;
120: end Bezout_Number;
121:
122: function Bezout_Number ( p : Poly_Sys; min : natural ) return natural is
123:
124: s : Set := Create(p);
125: res : natural := Total_Degree(p);
126:
127: procedure Evaluate ( z : in Partition; cont : out boolean ) is
128: b : constant natural := Bezout_Number(p,z,res);
129: begin
130: if b < res
131: then res := b;
132: end if;
133: if res > min
134: then cont := true;
135: else cont := false;
136: end if;
137: end Evaluate;
138: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
139:
140: begin
141: Evaluate_Partitions(s);
142: Clear(s);
143: return res;
144: end Bezout_Number;
145:
146: function Bezout_Number ( max : natural; p : Poly_Sys; min : natural )
147: return natural is
148:
149: s : Set := Create(p);
150: res : natural := Total_Degree(p);
151: cnt : natural := 0;
152:
153: procedure Evaluate ( z : in Partition; cont : out boolean ) is
154: b : constant natural := Bezout_Number(p,z,res);
155: begin
156: if b < res
157: then res := b;
158: end if;
159: cnt := cnt + 1;
160: if cnt < max and then res > min
161: then cont := true;
162: else cont := false;
163: end if;
164: end Evaluate;
165: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
166:
167: begin
168: Evaluate_Partitions(s);
169: Clear(s);
170: return res;
171: end Bezout_Number;
172:
173: procedure Bezout_Number
174: ( p : in Poly_Sys; b,m : out natural; z : in out Partition ) is
175:
176: s : Set := Create(p);
177: tdg : constant natural := Total_Degree(p);
178: res : natural := tdg;
179:
180: procedure Evaluate ( nz : in Partition; cont : out boolean ) is
181: nb : constant natural := Bezout_Number(p,nz,res);
182: begin
183: if nb < res
184: then res := nb;
185: m := nz'length; Clear(z);
186: z(nz'range) := Create(nz);
187: end if;
188: cont := true;
189: end Evaluate;
190: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
191:
192: begin
193: Evaluate_Partitions(s);
194: if res = tdg
195: then m := 1; z(1) := s;
196: else Clear(s);
197: end if;
198: b := res;
199: end Bezout_Number;
200:
201: procedure Bezout_Number
202: ( max : in natural; p : in Poly_Sys; b,m : out natural;
203: z : in out Partition ) is
204:
205: s : Set := Create(p);
206: tdg : constant natural := Total_Degree(p);
207: res : natural := tdg;
208: cnt : natural := 0;
209:
210: procedure Evaluate ( nz : in Partition; cont : out boolean ) is
211: nb : constant natural := Bezout_Number(p,nz,res);
212: begin
213: if nb < res
214: then res := nb;
215: m := nz'length; Clear(z);
216: z(nz'range) := Create(nz);
217: end if;
218: cnt := cnt + 1;
219: if cnt < max
220: then cont := true;
221: else cont := false;
222: end if;
223: end Evaluate;
224: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
225:
226: begin
227: Evaluate_Partitions(s);
228: if res = tdg
229: then m := 1; z(1) := s;
230: else Clear(s);
231: end if;
232: b := res;
233: end Bezout_Number;
234:
235: procedure Bezout_Number
236: ( p : in Poly_Sys; min : in natural; b,m : out natural;
237: z : in out Partition ) is
238:
239: s : Set := Create(p);
240: tdg : constant natural := Total_Degree(p);
241: res : natural := tdg;
242:
243: procedure Evaluate ( nz : in Partition; cont : out boolean ) is
244: nb : constant natural := Bezout_Number(p,nz,res);
245: begin
246: if nb < res
247: then res := nb;
248: m := nz'length; Clear(z);
249: z(nz'range) := Create(nz);
250: end if;
251: if res > min
252: then cont := true;
253: else cont := false;
254: end if;
255: end Evaluate;
256: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
257:
258: begin
259: Evaluate_Partitions(s);
260: if res = tdg
261: then m := 1; z(1) := s;
262: else Clear(s);
263: end if;
264: b := res;
265: end Bezout_Number;
266:
267: procedure Bezout_Number
268: ( max : in natural; p : in Poly_Sys; min : in natural;
269: b,m : out natural; z : in out Partition ) is
270:
271: s : Set := Create(p);
272: tdg : constant natural := Total_Degree(p);
273: res : natural := tdg;
274: cnt : natural := 0;
275:
276: procedure Evaluate ( nz : in Partition; cont : out boolean ) is
277: nb : constant natural := Bezout_Number(p,nz,res);
278: begin
279: if nb < res
280: then res := nb;
281: m := nz'length; Clear(z);
282: z(nz'range) := Create(nz);
283: end if;
284: cnt := cnt + 1;
285: if cnt < max and then res > min
286: then cont := true;
287: else cont := false;
288: end if;
289: end Evaluate;
290: procedure Evaluate_Partitions is new Generate_Partitions(Evaluate);
291:
292: begin
293: Evaluate_Partitions(s);
294: if res = tdg
295: then m := 1; z(1) := s;
296: else Clear(s);
297: end if;
298: b := res;
299: end Bezout_Number;
300:
301: function Evaluate ( z : partition; m : natural; p : Poly_Sys )
302: return natural is
303:
304: n : natural := p'length;
305: d : constant matrix := Degree_Table(p,z);
306:
307: function Bezout_number
308: ( n,m : natural; z: partition; d : matrix ) return natural is
309:
310: -- DESCRIPTION : the Bezout number is computed
311:
312: type boolean_array is array ( positive range <> ) of boolean;
313: Ii,Iacc : boolean_array(1..n) := (1..n => false);
314: b,b_mult : natural;
315:
316: procedure column ( j,start,number : in natural;
317: Ii,Iacc : in out boolean_array );
318:
319: -- DESCRIPTION : the computation of a term coming from a column
320: -- of the degree table;
321:
322: procedure row ( j : in natural; Ii,Iacc : in out boolean_array );
323:
324: -- DESCRIPTION : the computation of a row in the degree table
325:
326: procedure column ( j,start,number : in natural;
327: Ii,Iacc : in out boolean_array ) is
328: begin
329: if number > (n - start + 1)
330: then return;
331: elsif number = 0
332: then row(j,Ii,Iacc);
333: else for i in start..n loop
334: if not Ii(i)
335: then Ii(i) := true; Iacc(i) := true;
336: column(j,i+1,number-1,Ii,Iacc);
337: Ii(i) := false; Iacc(i) := false;
338: end if;
339: end loop;
340: end if;
341: end column;
342:
343: procedure row ( j : in natural; Ii,Iacc : in out boolean_array ) is
344: temp : natural := 1;
345: Iacc1 : boolean_array(1..n) := (1..n => false);
346: begin
347: for k in 1..n loop
348: if Iacc(k)
349: then temp := temp * d(k,j);
350: end if;
351: end loop;
352: if (j /= m) and (temp /= 0)
353: then b_mult := b_mult * temp;
354: column(j+1,1,Extent_Of(z(j+1)),Ii,Iacc1);
355: b_mult := b_mult / temp;
356: elsif j = m
357: then temp := temp * b_mult;
358: b := b + temp;
359: end if;
360: end row;
361:
362: begin
363: b := 0; b_mult := 1;
364: column(1,1,Extent_Of(z(1)),Ii,Iacc);
365: return b;
366: end Bezout_number;
367:
368: begin
369: return Bezout_number(n,m,z,d);
370: end Evaluate;
371:
372: procedure PB ( p : in Poly_Sys; b,m : out natural; z : in out Partition ) is
373:
374: n : natural := p'length;
375: wb,b_min : natural;
376: wz,z_min : partition(1..n);
377: wm,m_min : natural := 0;
378:
379: procedure pcopy ( p1,p2 : in out partition; p1n,p2n : in out natural ) is
380: -- DESCRIPTION : the partition p1 is copied to p2
381: begin
382: Clear(p2); p2 := Create(p1);
383: p2n := p1n;
384: end pcopy;
385:
386: begin
387: b_min := Total_Degree(p);
388: for i in 1..n loop
389: for k in 1..wm loop
390: Add(wz(k),i);
391: wb := Evaluate(wz,wm,p);
392: if (k = 1) or else (wb < b_min)
393: then pcopy(wz,z_min,wm,m_min);
394: b_min := wb;
395: end if;
396: Remove(wz(k),i);
397: end loop;
398: wm := wm + 1;
399: wz(wm) := Create(n);
400: Add(wz(wm),i);
401: wb := Evaluate(wz,wm,p);
402: if wb < b_min
403: then pcopy(wz,z_min,wm,m_min);
404: b_min := wb;
405: end if;
406: pcopy(z_min,wz,m_min,wm);
407: end loop;
408: b := b_min;
409: m := m_min;
410: pcopy(z_min,z,m_min,wm);
411: Clear(wz);
412: end PB;
413:
414: end m_Homogeneous_Bezout_Numbers;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>