File : zeros.ads


with Reps, Ada.Text_IO;
use Reps, Ada.Text_IO;

pragma Elaborate (Reps);

generic

-------------------- begin_include scalars Number

  type Number is private;

--- addition and multiplication
  with function IsZero(S: Number) return Boolean is  <>;
  with procedure SetZero(S: out Number) is <>;
  with procedure Neg(S: in out Number) is <>;
  with procedure Neg(S1: in Number; S2: out Number) is <>;
  with function "-"(S: Number) return Number is <>;
  with procedure Add(S1: in Number; S2: in out Number) is <>;
  with procedure Sum(S1,S2: in Number; S3: out Number) is <>;
  with function "+"(S1,S2: Number) return Number is <>;
  with procedure Sub(S1: in Number; S2: in out Number) is <>;
  with procedure Diff(S1,S2: in Number; S3: out Number) is <>;
  with function "-"(S1,S2: Number) return Number is <>;
  with procedure Mult(I: in Integer; S: in out Number) is <>;
  with procedure Prod(I: in Integer; S1: in Number; S2: out Number) is <>;
  with function "*"(I: Integer; S: Number) return Number is <>;
  with procedure MultAdd(I: Integer; S1: in Number; S2: in out Number) is <>;
  with procedure Mult(S1: in Number; S2: in out Number) is <>;
  with procedure Prod(S1,S2: in Number; S3: out Number) is <>;
  with function "*"(S1,S2: Number) return Number is <>;
  with procedure MultAdd(S1,S2: in Number; S3: in out Number) is <>;
  with function "**"(S: Number; I: Integer) return Number is <>;

--- conversion and i/o
  with function Scal(K: Integer) return Number is <>;
  with function Scal(R: Rep) return Number is <>;
  with procedure ShowType(S: in Number) is <>;
  with procedure Show1(N: in String; S: in Number) is <>;
  with procedure Show2(N: in String; S,S2: in Number) is <>;
  with procedure Get(F: in File_Type; S: out Number; Decimal: in Boolean := False) is <>;
  with procedure Put(F: in File_Type; S: in Number; Decimal: in Boolean := False) is <>;
-------------------- end_include scalars
-------------------- begin_include scalars-more Number

--- basic
  with function IsNumeric(S: Number) return Boolean is <>;
  with function IsSharp(S: Number) return Boolean is <>;
  with function IsNumbers(S: Number) return Boolean is <>;
  with procedure ModNumbers(S: in out Number) is <>;
  with procedure ToBalls(S: in out Number) is <>;
  with function Approx(S: Number) return Rep is <>;

--- sets
  with function Center0(S: Number) return Boolean is <>;
  with function Contains0(S: Number) return Boolean is <>;
  with function Contains(S1,S2: Number) return Boolean is <>;
  with function BallAt0(R: Rep) return Number is <>;
  with function BallAt0(S: Number) return Number is <>;
  with function DiskAt0(R: Rep) return Number is <>;
  with function DiskAt0(S: Number) return Number is <>;
  with function Disk(R1,R2: Rep) return Number is <>;
  with function Disk(S: Number) return Number is <>;
  with function Center(S: Number) return Number is <>;
  with function CenterDisk(S: Number) return Number is <>;
  with function ModCenter(S: Number) return Number is <>;
  with function Union(S1,S2: Number) return Number is <>;
  with function Intersection(S1,S2: Number) return Number is <>;

--- order
  with function "<"(S1,S2: Number) return Boolean is <>;
  with function "<="(S1,S2: Number) return Boolean is <>;
  with function ">="(S1,S2: Number) return Boolean is <>;
  with function ">"(S1,S2: Number) return Boolean is <>;
  with function Min(S1,S2: Number) return Number is <>;
  with function Max(S1,S2: Number) return Number is <>;
  with function Inf(S: Number) return Rep is <>;
  with function Sup(S: Number) return Rep is <>;

--- functions
  with function Norm(S: Number) return Number is <>;
  with function MaxNorm(S: Number) return Radius is <>;
  with function Sqr(S: Number) return Number is <>;
  with function "*"(R: Rep; S: Number) return Number is <>;
  with function "/"(S: Number; R: Rep) return Number is <>;
  with function Inv(S: Number) return Number is <>;
  with function "/"(S1,S2: Number) return Number is <>;
  with function Exp(S: Number) return Number is <>;
  with function Log(S: Number) return Number is <>;
  with function Sqrt(S: Number) return Number is <>;

-------------------- end_include scalars-more

package Zeros is --- find zeros of functions

  pragma Elaborate_Body;

  generic
    with function F(S: Number) return Number;
    with function DF(S: Number) return Number;
  function FindZero(S0,S1,S2: Number; Eps1,Eps2: Radius) return Number;

  Scal_Zero: constant Number  := Scal(0);
  Scal_One:  constant Number  := Scal(1);
  Scal_Two:  constant Number  := Scal(2);
  Z_Trunc:   constant Boolean := IsNumeric(Scal_Zero);

end Zeros;