Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Product/m_homogeneous_bezout_numbers.adb, Revision 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>