Annotation of OpenXM_contrib/PHC/Ada/Homotopy/reduction_of_polynomial_systems.adb, Revision 1.1
1.1 ! maekawa 1: --with text_io,integer_io; use text_io,integer_io;
! 2: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
! 3: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
! 4: with Standard_Natural_Vectors;
! 5: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
! 6: with Standard_Complex_Linear_Solvers; use Standard_Complex_Linear_Solvers;
! 7: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
! 8: with Reduction_of_Polynomials; use Reduction_of_Polynomials;
! 9:
! 10: package body Reduction_of_Polynomial_Systems is
! 11:
! 12: -- AUXALIARY DATA FOR LINEAR REDUCTION :
! 13:
! 14: mach_eps : constant double_float := 10.0**(-13);
! 15:
! 16: type Degrees_Array is array(positive range <>) of Degrees;
! 17: type Terms_Array is array(positive range <>) of Term;
! 18: type Boolean_Array is array(positive range <>) of boolean;
! 19:
! 20: -- AUXILIARY PROCEDURES FOR LINEAR REDUCTION :
! 21:
! 22: procedure Pop_First_Term ( p : in out Poly; t : in out Term ) is
! 23:
! 24: -- DESCRIPTION :
! 25: -- The term on return is the leading term of p.
! 26: -- This term is removed from p.
! 27:
! 28: procedure First_Term ( tt : in Term; continue : out boolean ) is
! 29: begin
! 30: Copy(tt,t);
! 31: continue := false;
! 32: end First_Term;
! 33: procedure Get_First_Term is new Visiting_Iterator(First_Term);
! 34:
! 35: begin
! 36: t.cf := Create(0.0);
! 37: Get_First_Term(p);
! 38: if t.cf /= Create(0.0)
! 39: then Sub(p,t);
! 40: end if;
! 41: end Pop_First_Term;
! 42:
! 43: procedure Leading_Terms ( p : in out Poly_Sys; ta : in out Terms_Array ) is
! 44:
! 45: -- DESCRIPTION :
! 46: -- Puts the leading terms of the polynomials in p in the array ta.
! 47: -- The leading terms are removed afterwards.
! 48:
! 49: begin
! 50: for i in p'range loop
! 51: Clear(ta(i));
! 52: Pop_First_Term(p(i),ta(i));
! 53: end loop;
! 54: end Leading_Terms;
! 55:
! 56: procedure Find_Max ( ta : in Terms_Array; index : in out Boolean_Array;
! 57: stop : in out boolean ) is
! 58:
! 59: res : Degrees := new Standard_Natural_Vectors.Vector'(ta(1).dg'range => 0);
! 60:
! 61: begin
! 62: stop := true;
! 63: for i in ta'range loop
! 64: if ta(i).cf /= Create(0.0)
! 65: then if ta(i).dg > res
! 66: then res.all := Standard_Natural_Vectors.Vector(ta(i).dg.all);
! 67: index(1..(i-1)) := (1..(i-1) => false);
! 68: index(i) := true;
! 69: stop := false;
! 70: elsif Equal(ta(i).dg,res)
! 71: then index(i) := true;
! 72: stop := false;
! 73: end if;
! 74: end if;
! 75: end loop;
! 76: Standard_Natural_Vectors.Clear
! 77: (Standard_Natural_Vectors.Link_to_Vector(res));
! 78: end Find_Max;
! 79:
! 80: procedure Update ( p : in out Poly_Sys; n : in natural;
! 81: ta : in out Terms_Array; da : in out Degrees_Array;
! 82: nda,cnt : in out natural; mat : in out Matrix;
! 83: stop : in out boolean ) is
! 84:
! 85: index : natural;
! 86: is_max : Boolean_Array(1..n) := (1..n => false);
! 87:
! 88: begin
! 89: Find_Max(ta,is_max,stop);
! 90: if not stop
! 91: then
! 92: -- Get the next Degrees for in the Degrees_Array
! 93: for i in is_max'range loop
! 94: if is_max(i)
! 95: then index := i; exit;
! 96: end if;
! 97: end loop;
! 98: nda := nda + 1;
! 99: Standard_Natural_Vectors.Copy
! 100: (Standard_Natural_Vectors.Link_to_Vector(ta(index).dg),
! 101: Standard_Natural_Vectors.Link_to_Vector(da(nda)));
! 102: -- Fill in the matrix and update the window :
! 103: for i in is_max'range loop
! 104: if is_max(i)
! 105: then mat(i,nda) := ta(i).cf;
! 106: Pop_First_Term(p(i),ta(i));
! 107: cnt := cnt+1;
! 108: else mat(i,nda) := Create(0.0);
! 109: end if;
! 110: end loop;
! 111: end if;
! 112: end Update;
! 113:
! 114: procedure Coefficient_Matrix
! 115: ( p : in Poly_Sys; mat : in out Matrix;
! 116: da : in out Degrees_Array; nda : in out natural;
! 117: diagonal : in out boolean ) is
! 118:
! 119: -- DESCRIPTION :
! 120: -- Constructs the coefficient matrix of the polynomial system.
! 121: -- Stops when the system is diagonal.
! 122:
! 123: -- REQUIRED :
! 124: -- mat'range(1) = p'range, mat'range(2) = 1..Sum_Number_of_Terms(p),
! 125: -- da'range = mat'range(2).
! 126:
! 127: -- ON ENTRY :
! 128: -- p a polynomial system.
! 129:
! 130: -- ON RETURN :
! 131: -- mat coefficient matrix, up to column nda filled up;
! 132: -- da da(1..nda) collects the different terms in the system;
! 133: -- nda number of different terms;
! 134: -- diagonal true if the leading terms are all different.
! 135:
! 136: work : Poly_Sys(p'range);
! 137: stop : boolean := false;
! 138: Window : Terms_Array(p'range);
! 139: cnt : natural := 0;
! 140:
! 141: begin
! 142: Copy(p,work);
! 143: Leading_Terms(work,Window);
! 144: diagonal := false;
! 145: while not stop and not diagonal loop
! 146: Update(work,p'last,Window,da,nda,cnt,mat,stop);
! 147: if (cnt = p'last) and then (cnt = nda)
! 148: then diagonal := true;
! 149: end if;
! 150: exit when diagonal;
! 151: end loop;
! 152: Clear(work);
! 153: end Coefficient_Matrix;
! 154:
! 155: procedure Coefficient_Matrix
! 156: ( p : in Poly_Sys; mat : in out Matrix;
! 157: da : in out Degrees_Array; nda : in out natural ) is
! 158:
! 159: -- DESCRIPTION :
! 160: -- Constructs the coefficient matrix of the polynomial system.
! 161:
! 162: -- REQUIRED :
! 163: -- mat'range(1) = p'range, mat'range(2) = 1..Sum_Number_of_Terms(p),
! 164: -- da'range = mat'range(2).
! 165:
! 166: -- ON ENTRY :
! 167: -- p a polynomial system.
! 168:
! 169: -- ON RETURN :
! 170: -- mat coefficient matrix, up to column nda filled up;
! 171: -- da da(1..nda) collects the different terms in the system;
! 172: -- nda number of different terms.
! 173:
! 174: work : Poly_Sys(p'range);
! 175: stop : boolean := false;
! 176: Window : Terms_Array(p'range);
! 177: cnt : natural := 0;
! 178:
! 179: begin
! 180: Copy(p,work);
! 181: Leading_Terms(work,Window);
! 182: while not stop loop
! 183: Update(work,p'last,Window,da,nda,cnt,mat,stop);
! 184: end loop;
! 185: Clear(work);
! 186: end Coefficient_Matrix;
! 187:
! 188: procedure Make_Polynomial_System
! 189: ( p : in out Poly_Sys; mat : in Matrix;
! 190: da : in Degrees_Array; nda : in natural;
! 191: inconsistent,infinite : out boolean ) is
! 192:
! 193: t : Term;
! 194: n : natural := p'length;
! 195:
! 196: begin
! 197: inconsistent := false;
! 198: infinite := false;
! 199: Clear(p);
! 200: for i in p'range loop
! 201: p(i) := Null_Poly;
! 202: for j in 1..nda loop
! 203: if AbsVal(mat(i,j)) > mach_eps
! 204: then t.dg := new Standard_Natural_Vectors.Vector'(da(j).all);
! 205: t.cf := mat(i,j);
! 206: Add(p(i),t);
! 207: Clear(t);
! 208: end if;
! 209: end loop;
! 210: if p(i) = Null_Poly
! 211: then infinite := true;
! 212: elsif Degree(p(i)) = 0
! 213: then inconsistent := true;
! 214: end if;
! 215: end loop;
! 216: end Make_Polynomial_System;
! 217:
! 218: function Sum_Number_of_Terms ( p : Poly_Sys ) return natural is
! 219:
! 220: -- DESCRIPTION :
! 221: -- Returns the sum of the number of terms of every polynomial in p.
! 222:
! 223: sum : natural := 0;
! 224:
! 225: begin
! 226: for i in p'range loop
! 227: sum := sum + Number_of_Terms(p(i));
! 228: end loop;
! 229: return sum;
! 230: end Sum_Number_of_Terms;
! 231:
! 232: -- TARGET ROUTINES FOR LINEAR REDUCTION :
! 233:
! 234: procedure Reduce ( p : in out Poly_Sys;
! 235: diagonal,inconsistent,infinite : in out boolean ) is
! 236:
! 237: n : natural := p'length;
! 238: cp : Poly_Sys(p'range);
! 239: max_terms : constant natural := Sum_Number_of_Terms(p);
! 240: columns : Degrees_Array(1..max_terms);
! 241: numb_columns : natural := 0;
! 242: mat : Matrix(p'range,1..max_terms);
! 243:
! 244: begin
! 245: Coefficient_Matrix(p,mat,columns,numb_columns,diagonal);
! 246: if diagonal
! 247: then inconsistent := false;
! 248: infinite := false;
! 249: else declare
! 250: coeffmat : Matrix(p'range,1..numb_columns);
! 251: begin
! 252: for i in coeffmat'range(1) loop
! 253: for j in coeffmat'range(2) loop
! 254: coeffmat(i,j) := mat(i,j);
! 255: end loop;
! 256: end loop;
! 257: Triangulate(coeffmat,n,numb_Columns);
! 258: Make_Polynomial_System(p,coeffmat,columns,numb_columns,
! 259: inconsistent,infinite);
! 260: for i in 1..numb_Columns loop
! 261: Standard_Natural_Vectors.Clear
! 262: (Standard_Natural_Vectors.Link_to_Vector(Columns(i)));
! 263: end loop;
! 264: end;
! 265: end if;
! 266: end Reduce;
! 267:
! 268: procedure Sparse_Reduce ( p : in out Poly_Sys;
! 269: inconsistent,infinite : in out boolean ) is
! 270:
! 271: n : natural := p'length;
! 272: max_terms : constant natural := Sum_Number_of_Terms(p);
! 273: columns : Degrees_Array(1..max_terms);
! 274: numb_columns : natural := 0;
! 275: mat : Matrix(1..n,1..max_terms);
! 276:
! 277: begin
! 278: Coefficient_Matrix(p,mat,columns,numb_columns);
! 279: declare
! 280: coeffmat : Matrix(p'range,1..numb_columns);
! 281: begin
! 282: for i in coeffmat'range(1) loop
! 283: for j in coeffmat'range(2) loop
! 284: coeffmat(i,j) := mat(i,j);
! 285: end loop;
! 286: end loop;
! 287: Diagonalize(coeffmat,n,numb_Columns);
! 288: Make_Polynomial_System(p,coeffmat,columns,numb_columns,
! 289: inconsistent,infinite);
! 290: for i in 1..numb_Columns loop
! 291: Standard_Natural_Vectors.Clear
! 292: (Standard_Natural_Vectors.Link_to_Vector(columns(i)));
! 293: end loop;
! 294: end;
! 295: end Sparse_Reduce;
! 296:
! 297: -- NONLINEAR REDUCTION :
! 298:
! 299: function Total_Degree ( p : Poly_Sys ) return natural is
! 300:
! 301: d : natural := 1;
! 302: tmp : integer;
! 303:
! 304: begin
! 305: for i in p'range loop
! 306: tmp := Degree(p(i));
! 307: if tmp >= 0
! 308: then d := d * tmp;
! 309: end if;
! 310: end loop;
! 311: return d;
! 312: end Total_Degree;
! 313:
! 314: function LEQ ( d1,d2 : Degrees ) return boolean is
! 315:
! 316: -- DESCRIPTION :
! 317: -- Returns true if all degrees of d1 are lower than
! 318: -- or equal to the degrees of d2
! 319:
! 320: begin
! 321: for i in d1'range loop
! 322: if d1(i) > d2(i)
! 323: then return false;
! 324: end if;
! 325: end loop;
! 326: return true;
! 327: end LEQ;
! 328:
! 329: function Leading_Term ( p : Poly ) return Term is
! 330:
! 331: -- DESCRIPTION :
! 332: -- Returns the leading term of the polynomial p.
! 333:
! 334: tf : Term;
! 335:
! 336: procedure First_Term (t : in Term; continue : out boolean) is
! 337: begin
! 338: Copy(t,tf);
! 339: continue := false;
! 340: end First_Term;
! 341: procedure Get_First_Term is new Visiting_Iterator (First_Term);
! 342: begin
! 343: Get_First_Term(p);
! 344: return tf;
! 345: end Leading_Term;
! 346:
! 347: function Can_Be_Eliminated ( p : Poly_Sys; j : natural ) return boolean is
! 348:
! 349: -- DESCRIPTION :
! 350: -- returns true if the degree of the j-th unknown in each equation
! 351: -- is zero.
! 352:
! 353: begin
! 354: for i in p'range loop
! 355: if Degree(p(i),j) > 0
! 356: then return false;
! 357: end if;
! 358: end loop;
! 359: return true;
! 360: end Can_Be_Eliminated;
! 361:
! 362: procedure Shift_Null_Polynomial ( p : in out Poly_Sys ) is
! 363:
! 364: -- DESCRIPTION :
! 365: -- The null polynomial in the system p will be shifted down
! 366: -- towards the end.
! 367:
! 368: begin
! 369: for i in p'range loop
! 370: if p(i) = Null_Poly
! 371: then for j in i..(p'last-1) loop
! 372: Copy(p(j+1),p(j));
! 373: Clear(p(j+1));
! 374: end loop;
! 375: end if;
! 376: end loop;
! 377: end Shift_Null_Polynomial;
! 378:
! 379: procedure Eliminate ( p : in out Poly; j : in natural ) is
! 380:
! 381: -- DESCRIPTION :
! 382: -- The j-th unknown will be eliminated out of the polynomial p
! 383:
! 384: n : natural := Number_Of_Unknowns(p);
! 385:
! 386: procedure Eliminate_Term (t : in out Term; continue : out boolean) is
! 387:
! 388: d : Degrees := new Standard_Natural_Vectors.Vector(1..(n-1));
! 389:
! 390: begin
! 391: for i in 1..(j-1) loop
! 392: d(i) := t.dg(i);
! 393: end loop;
! 394: for i in j..(n-1) loop
! 395: d(i) := t.dg(i+1);
! 396: end loop;
! 397: Clear(t);
! 398: t.dg := d;
! 399: continue := true;
! 400: end Eliminate_Term;
! 401: procedure Eliminate_Terms is new Changing_Iterator(Eliminate_Term);
! 402:
! 403: begin
! 404: Eliminate_Terms(p);
! 405: end Eliminate;
! 406:
! 407: procedure Eliminate ( p : in out Poly_Sys; j : in natural ) is
! 408:
! 409: -- DESCRIPTION :
! 410: -- The j-th unknown will be eliminated out of each equation.
! 411:
! 412: begin
! 413: for i in p'range loop
! 414: Eliminate(p(i),j);
! 415: end loop;
! 416: end Eliminate;
! 417:
! 418: procedure Replace ( p : in out Poly_Sys; pp : in Poly; i : in natural ) is
! 419:
! 420: -- DESCRIPTION :
! 421: -- This procedure replaces the i-th polynomial in the system p
! 422: -- by the polynomial pp. If pp is a null polynomial then the procedure
! 423: -- tries to eliminate an unknown, in order to have as much equations
! 424: -- as there are unknowns.
! 425:
! 426: tmp : natural;
! 427:
! 428: begin
! 429: if (pp = Null_Poly) or else (Number_Of_Unknowns(pp) = 0)
! 430: then -- try to eliminate an unknown
! 431: tmp := Number_Of_Unknowns(p(1));
! 432: Clear(p(i)); p(i) := Null_Poly;
! 433: for j in reverse 1..Number_Of_Unknowns(p(1)) loop
! 434: if Can_Be_Eliminated(p,j)
! 435: then Eliminate(p,j);
! 436: end if;
! 437: end loop;
! 438: Shift_Null_Polynomial(p);
! 439: else Clear(p(i)); Copy(pp,p(i));
! 440: end if;
! 441: end Replace;
! 442:
! 443: function red ( p,b1,b2 : Poly ) return Poly is
! 444:
! 445: Rpb1 : Poly := Rpoly(p,b1);
! 446:
! 447: begin
! 448: if Number_Of_Unknowns(Rpb1) = 0
! 449: then return Null_Poly;
! 450: else declare
! 451: Rpb2 : Poly := Rpoly(Rpb1,b2);
! 452: begin
! 453: Clear(Rpb1);
! 454: return Rpb2;
! 455: end;
! 456: end if;
! 457: end red;
! 458:
! 459: function Reduce ( p,b1,b2 : Poly ) return Poly is
! 460:
! 461: -- DESCRIPTION :
! 462: -- returns p mod < b1,b2 >
! 463:
! 464: temp : Poly := red(p,b1,b2);
! 465: begin
! 466: if Number_Of_Unknowns(temp) = 0
! 467: then return Null_Poly;
! 468: else Clear(temp);
! 469: return red(p,b2,b1);
! 470: end if;
! 471: end Reduce;
! 472:
! 473: function Simple_Criterium ( p1,p2 : Poly ) return boolean is
! 474:
! 475: -- DESCRIPTION :
! 476: -- returns true if lcm(in(p1),in(p2)) = in(p1), if in(p2) | in(p1).
! 477:
! 478: lt1,lt2 : Term;
! 479: res : boolean;
! 480:
! 481: begin
! 482: lt1 := Leading_Term(p1);
! 483: lt2 := Leading_Term(p2);
! 484: res := LEQ(lt2.dg,lt1.dg);
! 485: Clear(lt1); Clear(lt2);
! 486: return res;
! 487: end Simple_Criterium;
! 488:
! 489: procedure Rpoly_Criterium ( p,b1,b2 : in Poly; cnt : in out natural;
! 490: res : out boolean ) is
! 491:
! 492: -- DESCRIPTION :
! 493: -- Applies the R-polynomial criterium and counts the number of
! 494: -- R-polynomials computed.
! 495:
! 496: Rpb1 : Poly := Rpoly(p,b1);
! 497: Rpb2 : Poly;
! 498:
! 499: begin
! 500: cnt := cnt + 1;
! 501: if Number_Of_Unknowns(Rpb1) = 0
! 502: then res := true;
! 503: else Rpb2 := Rpoly(Rpb1,b2);
! 504: cnt := cnt + 1;
! 505: Clear(Rpb1);
! 506: if Number_of_Unknowns(Rpb2) = 0
! 507: then res := true;
! 508: else Clear(Rpb2);
! 509: Rpb2 := Rpoly(p,b2);
! 510: cnt := cnt + 1;
! 511: if Number_of_Unknowns(Rpb2) = 0
! 512: then res := true;
! 513: else Rpb1 := Rpoly(Rpb2,b1);
! 514: cnt := cnt + 1;
! 515: Clear(Rpb2);
! 516: if Number_of_Unknowns(Rpb1) = 0
! 517: then res := true;
! 518: else res := false;
! 519: Clear(Rpb1);
! 520: end if;
! 521: end if;
! 522: end if;
! 523: end if;
! 524: end Rpoly_Criterium;
! 525:
! 526: function Criterium ( p,q,s : Poly ) return boolean is
! 527:
! 528: -- DESCRIPTION :
! 529: -- returns true if p may be replaced by s.
! 530:
! 531: begin
! 532: if Simple_Criterium(p,q)
! 533: then return true;
! 534: else declare
! 535: temp : Poly := Reduce(p,q,s);
! 536: res : boolean := (Number_Of_Unknowns(temp) = 0);
! 537: begin
! 538: Clear(temp);
! 539: return res;
! 540: end;
! 541: end if;
! 542: end Criterium;
! 543:
! 544: procedure Criterium ( p,q,s : in Poly; cnt : in out natural;
! 545: res : out boolean ) is
! 546:
! 547: -- DESCRIPTION :
! 548: -- returns true if p may be replaced by s.
! 549:
! 550: begin
! 551: if Simple_Criterium(p,q)
! 552: then res := true;
! 553: else Rpoly_Criterium(p,q,s,cnt,res);
! 554: end if;
! 555: end Criterium;
! 556:
! 557: procedure Reduce ( p : in Poly_Sys; res : in out Poly_Sys;
! 558: cnt_eq : in out natural; max_eq : in natural;
! 559: cnt_sp : in out natural; max_sp : in natural;
! 560: cnt_rp : in out natural; max_rp : in natural ) is
! 561:
! 562: S : Poly;
! 563: n : natural := p'last - p'first + 1;
! 564: dS,dpi,dpj : integer;
! 565: ok : boolean;
! 566:
! 567: procedure try ( i,dpi : in natural ) is
! 568:
! 569: -- DESCRIPTION : try to replace p_i by S
! 570:
! 571: p_red : Poly_Sys(1..n);
! 572:
! 573: begin
! 574: if cnt_eq > max_eq then return; end if;
! 575: if cnt_sp > max_sp then return; end if;
! 576: Clear(p_red); Copy(p,p_red);
! 577: Replace(p_red,S,i);
! 578: -- put("replaced polynomial p("); put(i,1); put_line(").");
! 579: if dS = 0
! 580: then return;
! 581: elsif Total_Degree(p_red) < Total_Degree(res)
! 582: then Copy(p_red,res);
! 583: Reduce(p_red,res,cnt_eq,max_eq,cnt_sp,max_sp,cnt_rp,max_rp);
! 584: elsif cnt_eq <= max_eq
! 585: then cnt_eq := cnt_eq + 1;
! 586: Reduce(p_red,res,
! 587: cnt_eq,max_eq,cnt_sp,max_sp,cnt_rp,max_rp);
! 588: end if;
! 589: Clear(p_red);
! 590: end try;
! 591:
! 592: begin
! 593: if cnt_eq > max_eq then return; end if;
! 594: if cnt_sp > max_sp then return; end if;
! 595: if cnt_rp > max_rp then return; end if;
! 596: for i in 1..n loop
! 597: for j in (i+1)..n loop
! 598: if (p(i) /= Null_Poly) and (p(j) /= Null_Poly)
! 599: then
! 600: Clear(S); S := Spoly(p(i),p(j));
! 601: cnt_sp := cnt_sp + 1;
! 602: dS := Degree(S); dpi := Degree(p(i)); dpj := Degree(p(j));
! 603: -- put("S-polynomial of p("); put(i,1); put(") and p(");
! 604: -- put(j,1); put_line(") computed.");
! 605: if dS <= dpi and then dpi > dpj
! 606: and then Criterium(p(i),p(j),S)
! 607: then try(i,dpi);
! 608: elsif dS <= dpj and then dpi < dpj
! 609: and then Criterium(p(j),p(i),S)
! 610: then try(j,dpj);
! 611: else -- dpi = dpj
! 612: if dS <= dpi
! 613: then Criterium(p(i),p(j),S,cnt_rp,ok);
! 614: if ok then try(i,dpi); end if;
! 615: end if;
! 616: if dS <= dpj
! 617: then Criterium(p(j),p(i),S,cnt_rp,ok);
! 618: if ok then try(j,dpj); end if;
! 619: end if;
! 620: end if;
! 621: Clear(S);
! 622: end if;
! 623: exit when (dS = 0);
! 624: end loop;
! 625: end loop;
! 626: end Reduce;
! 627:
! 628: procedure Sparse_Reduce ( p : in Poly_Sys; res : in out Poly_Sys;
! 629: cnt_eq : in out natural; max_eq : in natural ) is
! 630:
! 631: S : Poly;
! 632: n : natural := p'last - p'first + 1;
! 633: dS,dpi,dpj : integer;
! 634:
! 635: procedure try ( i,dpi : in natural ) is
! 636:
! 637: -- DESCRIPTION : try to replace p_i by S
! 638:
! 639: p_red : Poly_Sys(1..n);
! 640: inconsistent,infinite : boolean := false;
! 641: begin
! 642: if cnt_eq > max_eq then return; end if;
! 643: Clear(p_red); Copy(p,p_red);
! 644: Replace(p_red,S,i);
! 645: if dS /= 0
! 646: then Sparse_Reduce(p_red,inconsistent,infinite);
! 647: end if;
! 648: if dS = 0 or inconsistent
! 649: then cnt_eq := max_eq + 1;
! 650: return;
! 651: elsif Total_Degree(p_red) < Total_Degree(res)
! 652: then Copy(p_red,res);
! 653: Sparse_Reduce(p_red,res,cnt_eq,max_eq);
! 654: else cnt_eq := cnt_eq + 1;
! 655: Sparse_Reduce(p_red,res,cnt_eq,max_eq);
! 656: end if;
! 657: Clear(p_red);
! 658: end try;
! 659:
! 660: begin
! 661: if cnt_eq > max_eq then return; end if;
! 662: for i in 1..n loop
! 663: for j in (i+1)..n loop
! 664: if (p(i) /= Null_Poly) and (p(j) /= Null_Poly)
! 665: then
! 666:
! 667: Clear(S); S := Spoly(p(i),p(j));
! 668:
! 669: dS := Degree(S);
! 670: dpi := Degree(p(i));
! 671: dpj := Degree(p(j));
! 672:
! 673: if dS <= dpi and then dpi > dpj
! 674: and then Criterium(p(i),p(j),S)
! 675: then try(i,dpi);
! 676: elsif dS <= dpj and then dpi < dpj
! 677: and then Criterium(p(j),p(i),S)
! 678: then try(j,dpj);
! 679: else -- dpi = dpj
! 680: if dS <= dpi
! 681: and then Criterium(p(i),p(j),S) then try(i,dpi); end if;
! 682: if dS <= dpj
! 683: and then Criterium(p(j),p(i),S) then try(j,dpj); end if;
! 684: end if;
! 685:
! 686: Clear(S);
! 687:
! 688: end if;
! 689: end loop;
! 690: end loop;
! 691: end Sparse_Reduce;
! 692:
! 693: end Reduction_of_Polynomial_Systems;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>