[BACK]Return to reduction_of_polynomials.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Homotopy

Annotation of OpenXM_contrib/PHC/Ada/Homotopy/reduction_of_polynomials.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             2: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             3: with Standard_Natural_Vectors;           use Standard_Natural_Vectors;
        !             4:
        !             5: package body Reduction_of_Polynomials is
        !             6:
        !             7: -- AUXILIARIES :
        !             8:
        !             9:   function Leading_Term ( p : Poly ) return Term is
        !            10:
        !            11:   -- DESCRIPTION :
        !            12:   --   Returns the leading term of the polynomial p.
        !            13:
        !            14:     res : Term;
        !            15:
        !            16:     procedure First_Term ( t : in Term; continue : out boolean ) is
        !            17:     begin
        !            18:       Standard_Natural_Vectors.Copy
        !            19:         (Link_to_Vector(t.dg),Link_to_Vector(res.dg));
        !            20:       res.cf := t.cf;
        !            21:       continue := false;
        !            22:     end First_Term;
        !            23:     procedure Get_First_Term is new Visiting_Iterator(First_Term);
        !            24:
        !            25:   begin
        !            26:     Get_First_Term(p);
        !            27:     return res;
        !            28:   end Leading_Term;
        !            29:
        !            30:   function LEQ ( d1,d2 : Degrees ) return boolean is
        !            31:
        !            32:   -- DESCRIPTION :
        !            33:   --   Returns true if all degrees of d1 are lower than
        !            34:   --   or equal to the degrees of d2.
        !            35:
        !            36:   begin
        !            37:     for i in d1'range loop
        !            38:       if d1(i) > d2(i)
        !            39:        then return false;
        !            40:       end if;
        !            41:     end loop;
        !            42:     return true;
        !            43:   end LEQ;
        !            44:
        !            45:   function Search (p : Poly; pt : Term) return Term is
        !            46:
        !            47:   -- DESCRIPTION :
        !            48:   --   Returns the first term of p for which the following holds :
        !            49:   --   LEQ(result,pt).
        !            50:
        !            51:     result : Term;
        !            52:
        !            53:     procedure Search_Term (t : in Term; continue : out boolean) is
        !            54:     begin
        !            55:       if LEQ(t.dg,pt.dg)
        !            56:        then result.cf := t.cf;
        !            57:             result.dg := new Standard_Natural_Vectors.Vector(t.dg'range);
        !            58:             for i in t.dg'range loop
        !            59:               result.dg(i) := t.dg(i);
        !            60:             end loop;
        !            61:             continue := false;
        !            62:        else continue := true;
        !            63:       end if;
        !            64:     end Search_Term;
        !            65:     procedure Search_Terms is new Visiting_Iterator(Search_Term);
        !            66:
        !            67:   begin
        !            68:     result.cf := Create(0.0);
        !            69:     Search_Terms(p);
        !            70:     return result;
        !            71:   end Search;
        !            72:
        !            73:   procedure Purify ( p : in out Poly; tol : in double_float ) is
        !            74:
        !            75:   -- DESCRIPTION :
        !            76:   --   All terms of which the coefficient are in AbsVal smaller
        !            77:   --   than tol are deleted.
        !            78:
        !            79:     procedure Purify_Term ( t : in out Term; continue : out boolean ) is
        !            80:     begin
        !            81:       if AbsVal(t.cf) < tol
        !            82:        then t.cf := Create(0.0);
        !            83:       end if;
        !            84:       continue := true;
        !            85:     end Purify_Term;
        !            86:     procedure Purify_Terms is new Changing_Iterator(Purify_Term);
        !            87:
        !            88:   begin
        !            89:     Purify_Terms(p);
        !            90:     if Number_Of_Unknowns(p) = 0
        !            91:      then Clear(p);
        !            92:           p := Null_Poly;
        !            93:     end if;
        !            94:   end Purify;
        !            95:
        !            96: -- TARGET ROUTINES :
        !            97:
        !            98:   function Spoly ( p,q : poly ) return Poly is
        !            99:
        !           100:     S,pp,qq : Poly;
        !           101:     tfp,tfq,facq,facp : Term;
        !           102:     abstmp : double_float;
        !           103:     tol : constant double_float := 10.0**(-13);
        !           104:
        !           105:   begin
        !           106:     if (p = Null_Poly) or else (Number_Of_Unknowns(p) = 0)
        !           107:       or else (q = Null_Poly) or else (Number_Of_Unknowns(q) = 0)
        !           108:      then return Null_Poly;
        !           109:     end if;
        !           110:
        !           111:     tfp := Leading_Term(p);
        !           112:     tfq := Leading_Term(q);
        !           113:
        !           114:     facp.dg := new Standard_Natural_Vectors.Vector'(tfp.dg'range => 0);
        !           115:     facq.dg := new Standard_Natural_Vectors.Vector'(tfq.dg'range => 0);
        !           116:     for i in tfp.dg'range loop
        !           117:       if tfp.dg(i) > tfq.dg(i)
        !           118:        then facq.dg(i) := tfp.dg(i) - tfq.dg(i);
        !           119:        elsif tfp.dg(i) < tfq.dg(i)
        !           120:            then facp.dg(i) := tfq.dg(i) - tfp.dg(i);
        !           121:       end if;
        !           122:     end loop;
        !           123:     abstmp := AbsVal(tfp.cf);
        !           124:     if abstmp > AbsVal(tfq.cf)
        !           125:      then facp.cf := Create(1.0);
        !           126:           facq.cf := - tfp.cf / tfq.cf;
        !           127:      else facp.cf := tfq.cf / tfp.cf;
        !           128:           facq.cf := Create(-1.0);
        !           129:     end if;
        !           130:     pp := facp * p;
        !           131:     qq := facq * q;
        !           132:     S := pp + qq;
        !           133:     Clear(pp); Clear(qq);
        !           134:     Standard_Natural_Vectors.Clear(Link_to_Vector(facp.dg));
        !           135:     Standard_Natural_Vectors.Clear(Link_to_Vector(tfp.dg));
        !           136:     Standard_Natural_Vectors.Clear(Link_to_Vector(facq.dg));
        !           137:     Standard_Natural_Vectors.Clear(Link_to_Vector(tfq.dg));
        !           138:     Purify(S,tol);
        !           139:     return S;
        !           140:   end Spoly;
        !           141:
        !           142:   function Rpoly ( p,q : Poly ) return Poly is
        !           143:
        !           144:     tol : constant double_float := 10.0**(-13);
        !           145:
        !           146:   begin
        !           147:     if (p = Null_Poly) or else (Number_Of_Unknowns(p) = 0)
        !           148:      then return Null_Poly;
        !           149:      elsif (q = Null_Poly) or else (Number_Of_Unknowns(q) = 0)
        !           150:          then null;
        !           151:      else declare
        !           152:             ltp,tq : Term;
        !           153:           begin
        !           154:             ltp := Leading_Term(p);
        !           155:             tq := Search(q,ltp);
        !           156:             if tq.cf /= Create(0.0)
        !           157:              then
        !           158:                declare
        !           159:                  R,qq : Poly;
        !           160:                  fac : Term;
        !           161:                begin
        !           162:                  fac.dg
        !           163:                    := new Standard_Natural_Vectors.Vector'(ltp.dg'range => 0);
        !           164:                  for i in ltp.dg'range loop
        !           165:                    if ltp.dg(i) > tq.dg(i)
        !           166:                     then fac.dg(i) := ltp.dg(i) - tq.dg(i);
        !           167:                    end if;
        !           168:                  end loop;
        !           169:                  fac.cf := -ltp.cf / tq.cf;
        !           170:                  qq := fac * q;
        !           171:                  R := p + qq;
        !           172:                  Clear(qq);
        !           173:                  Standard_Natural_Vectors.Clear(Link_to_Vector(fac.dg));
        !           174:                  Purify(R,tol);
        !           175:                  return R;
        !           176:                end;
        !           177:             end if;
        !           178:             Standard_Natural_Vectors.Clear(Link_to_Vector(ltp.dg));
        !           179:             Standard_Natural_Vectors.Clear(Link_to_Vector(tq.dg));
        !           180:           end;
        !           181:     end if;
        !           182:     declare
        !           183:       temp : Poly;
        !           184:     begin
        !           185:       Copy(p,temp);
        !           186:       return temp;
        !           187:     end;
        !           188:   end Rpoly;
        !           189:
        !           190: end Reduction_of_Polynomials;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>