File : taylors2-num.adb


with Reps.Ops, Messages;
use Reps.Ops, Messages;

package body Taylors2.Num is

  function NumInv(F: Taylor2) return Taylor2 is
--- inverse by power series
    C: Scalar;
    Ft,G: Taylor2;
  begin
    C := F.C(0,0);
    if C=ScalZero then
      Error("Taylors2.Num.NumInv error: division by 0");
    end if;
    C := Inv(C);
    Ft := (-C)*F;
    Ft.C(0,0) := ScalZero;
    G := Ft;
    G.C(0,0) := ScalOne;
    for I in 1 .. PDeg loop
      Mult(Ft,G);
      G.C(0,0) := ScalOne;
    end loop;
    return C*G;
  end NumInv;

  function GuessRho(D0,D1: Power; F: Taylor2) return RadPair is
    J,N1,N2: Integer := 0;
    Q1,Q2: Rep := One;
    R: RadPair := (9.9,9.9);
    procedure NewQuot(S0,S1: in Scalar; Q: in out Rep; N: in out Integer) is
    begin
      if (S0 /= ScalZero) and then (S1 /= ScalZero) then
        Q := Q*MaxNorm(S0)/MaxNorm(S1);
        N := N+1;
      end if;
    end NewQuot;
  begin
    if QuasiDeg(F) >= D1 then
      for D in D0 .. D1-1 loop
        for I in 0 .. D loop
          J := D-I;
          NewQuot(F.C(I,J),F.C(I+1,J),Q1,N1);
          NewQuot(F.C(I,J),F.C(I,J+1),Q2,N2);
        end loop;
      end loop;
      R(1) := Exp(Log(Q1)/Rep(N1));
      R(2) := Exp(Log(Q2)/Rep(N2));
    end if;
    return R;
  end GuessRho;

end Taylors2.Num;