[BACK]Return to durand_kerner.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Implift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Implift/durand_kerner.adb, Revision 1.1

1.1     ! maekawa     1: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             2: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
        !             3:
        !             4: procedure Durand_Kerner ( p : in Vector; z,res : in out Vector;
        !             5:                          maxsteps : in natural; eps : in double_float;
        !             6:                          nb : out natural ) is
        !             7:
        !             8:   pp : Vector(p'range);
        !             9:
        !            10:   function Horner ( p : Vector; x : Complex_Number ) return Complex_Number is
        !            11:
        !            12:   -- DESCRIPTION :
        !            13:   --   Returns (..((a[n]*x + a[n-1])*x + a[n-2])*x + .. + a[1])*x + a[0].
        !            14:
        !            15:   begin
        !            16:     if p'first = p'last
        !            17:      then return p(p'first);
        !            18:      else declare
        !            19:            res : Complex_Number := p(p'last);
        !            20:           begin
        !            21:            for i in reverse p'first..(p'last-1) loop
        !            22:               res := res*x + p(i);
        !            23:             end loop;
        !            24:            return res;
        !            25:           end;
        !            26:     end if;
        !            27:   end Horner;
        !            28:
        !            29:   procedure DK ( p : in Vector; z,res : in out Vector ) is
        !            30:
        !            31:   -- DESCRIPTION :
        !            32:   --   Computes one step in the Durand-Kerner iteration.
        !            33:
        !            34:     function Compute_q ( i : integer; a : Vector ) return Complex_Number is
        !            35:
        !            36:     -- DESCRIPTION :
        !            37:     --   Computes the quotient needed in the Durand-Kerner step.
        !            38:
        !            39:       res : Complex_Number;
        !            40:
        !            41:     begin
        !            42:       res := Create(1.0);
        !            43:       for j in a'range loop
        !            44:         if j /= i
        !            45:          then res := res*(a(i)-a(j));
        !            46:         end if;
        !            47:       end loop;
        !            48:       return res;
        !            49:     end Compute_q;
        !            50:
        !            51:   begin
        !            52:     for i in z'range loop
        !            53:       z(i) := z(i) - Horner(p,z(i))/Compute_q(i,z);
        !            54:       res(i) := Horner(p,z(i));
        !            55:     end loop;
        !            56:   end DK;
        !            57:
        !            58: begin
        !            59:   if p(p'last) /= Create(1.0)
        !            60:    then for i in p'range loop
        !            61:          pp(i) := p(i) / p(p'last);
        !            62:         end loop;
        !            63:    else for i in p'range loop
        !            64:          pp(i) := p(i);
        !            65:         end loop;
        !            66:   end if;
        !            67:   for k in 1..maxsteps loop
        !            68:     nb := k;
        !            69:     DK(pp,z,res);
        !            70:     Write(k,z,res);
        !            71:     exit when (Max_Norm(res) <= eps);
        !            72:   end loop;
        !            73: end Durand_Kerner;

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