File: [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Stalift / integer_lifting_functions.adb (download)
Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:31 2000 UTC (23 years, 10 months ago) by maekawa
Branch: PHC, MAIN
CVS Tags: v2, maekawa-ipv6, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, HEAD Changes since 1.1: +0 -0
lines
Import the second public release of PHCpack.
OKed by Jan Verschelde.
|
with Standard_Floating_Numbers; use Standard_Floating_Numbers;
with Standard_Complex_Numbers; use Standard_Complex_Numbers;
with Standard_Complex_Vectors;
with Standard_Random_Numbers;
package body Integer_Lifting_Functions is
-- AUXILIARIES :
function Convert ( v : Standard_Integer_Vectors.Vector )
return Standard_Complex_Vectors.Vector is
-- DESCRIPTION :
-- Converts the given vector into a vector with complex entries.
res : Standard_Complex_Vectors.Vector(v'range);
begin
for i in v'range loop
res(i) := Create(double_float(v(i)));
end loop;
return res;
end Convert;
function Random_Vector ( m : natural; low,upp : integer ) return Vector is
-- DESCRIPTION :
-- Returns a random vector of range 1..m of randomly generated integer
-- values between low and upp.
res : Vector(1..m);
begin
for k in res'range loop
res(k) := Standard_Random_Numbers.Random(low,upp);
end loop;
return res;
end Random_Vector;
function Random ( vec : Standard_Integer_Vectors.Vector ) return integer is
-- DESCRIPTION :
-- Returns a random number from the given vector.
index : integer := Standard_Random_Numbers.Random(vec'first,vec'last);
begin
return vec(index);
end Random;
-- LINEAR LIFTING :
function Linear_Lift ( lf,v : Vector ) return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := lf*v;
return res;
end Linear_Lift;
function Linear_Lift ( lf : Vector; l : List ) return List is
res,res_last : List;
tmp : List := l;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Linear_Lift(lf,Head_Of(tmp).all));
tmp := Tail_Of(tmp);
end loop;
return res;
end Linear_Lift;
function Linear_Lift ( lf : VecVec;
l : Array_of_Lists ) return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Linear_Lift(lf(i).all,l(i));
end loop;
return res;
end Linear_Lift;
-- POLYNOMIAL LIFTING :
function Polynomial_Lift ( lf : Poly; v : Vector ) return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := integer(REAL_PART(Eval(lf,Convert(v))));
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly; v : Vector ) return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := integer(REAL_PART(Eval(lf,Convert(v))));
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Poly; l : List ) return List is
res : List;
elf : Eval_Poly := Create(lf);
begin
res := Polynomial_Lift(elf,l);
Clear(elf);
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly; l : List ) return List is
res,res_last : List;
tmp : List := l;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Polynomial_Lift(lf,Head_Of(tmp).all));
tmp := Tail_Of(tmp);
end loop;
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Poly_Sys; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
elf : Eval_Poly_Sys(lf'range) := Create(lf);
begin
res := Polynomial_Lift(elf,l);
Clear(elf);
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly_Sys; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Polynomial_Lift(lf(i),l(i));
end loop;
return res;
end Polynomial_Lift;
-- RANDOM LIFTING :
function Random_Lift ( lflow,lfupp : integer; v : Vector ) return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := Standard_Random_Numbers.Random(lflow,lfupp);
return res;
end Random_Lift;
function Random_Lift ( lflow,lfupp : integer; l : List ) return List is
res,res_last : List;
tmp : List := l;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Random_Lift(lflow,lfupp,Head_Of(tmp).all));
tmp := Tail_Of(tmp);
end loop;
return res;
end Random_Lift;
function Random_Lift ( lflow,lfupp : Vector; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Random_Lift(lflow(i),lfupp(i),l(i));
end loop;
return res;
end Random_Lift;
-- RANDOM LINEAR LIFTING :
function Random_Linear_Lift ( lflow,lfupp : integer; v : Vector )
return Vector is
lf : Vector(v'range) := Random_Vector(v'last,lflow,lfupp);
begin
return Linear_Lift(lf,v);
end Random_Linear_Lift;
function Random_Linear_Lift ( lflow,lfupp : integer; l : List )
return List is
begin
if Is_Null(l)
then return l;
else declare
n : constant natural := Head_Of(l)'length;
lf : Vector(Head_Of(l)'range) := Random_Vector(n,lflow,lfupp);
begin
return Linear_Lift(lf,l);
end;
end if;
end Random_Linear_Lift;
function Random_Linear_Lift ( lflow,lfupp : Vector; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Random_Linear_Lift(lflow(i),lfupp(i),l(i));
end loop;
return res;
end Random_Linear_Lift;
-- POINT-WISE LIFTING :
function Point_Lift ( lf : integer; v : Vector ) return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := lf;
return res;
end Point_Lift;
function Point_Lift ( lf : Vector; l : List ) return List is
res,res_last : List;
tmp : List := l;
ind : integer := lf'first;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Point_Lift(lf(ind),Head_Of(tmp).all));
ind := ind + 1;
tmp := Tail_Of(tmp);
end loop;
return res;
end Point_Lift;
function Point_Lift ( lf : VecVec;
l : Array_of_Lists ) return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Point_Lift(lf(i).all,l(i));
end loop;
return res;
end Point_Lift;
end Integer_Lifting_Functions;