-- peval.adb Horners method for evaluating a polynomial -- eval is the function that computes Horners method with Ada.Text_IO; use Ada.Text_IO; procedure peval is y : long_float; type vector is array(integer range <>) of long_float; c, r : vector(0..11); function eval(n : integer; x : long_float; c : vector) return long_float is -- Horners method for evaluating a polynomial -- an nth order polynomial has n+1 coefficients -- stored in c(0) through c(n) -- y := c(0) + c(1)*x + c(2)*x^2 +...+ c(n)*x^n y : long_float; begin if n<=0 then return c(0); end if; y := c(n)*x; for i in reverse 1..n-1 loop -- do i:=n-1, 1, -1 y := (c(i)+y)*x; end loop; y := y+c(0); return y; end eval; begin put_line("peval.adb running"); -- test peval by generation roots of a polynomial, -- then generating the polynomial, then evaluating for n in 3..10 loop -- do n:=3,10 -- n is degree of polynomial new_line; put_line("y := c(0) + c(1)*x + c(2)*x^2 +...+ c(n)*x^n, for n=" & integer'image(n)); put_line("roots are:"); r(0) := 0.1; put_line("r(0)=" & long_float'image(r(0))); r(1) := 2.5; put_line("r(1)=" & long_float'image(r(1))); for i in 2..n-1 loop -- do i:=2,n-1 r(i) := r(i-1)+r(i-2); put_line("r("&integer'image(i)&")="&long_float'image(r(i))); end loop; -- generate polynomial coefficients c(0) := r(0)*r(1); c(1) := -(r(0)+r(1)); c(2) := 1.0; for j in 2..n-1 loop -- do j:=2,n-1 for i in reverse 1..j+1 loop -- do i:=j+1,1,-1 c(i) := c(i-1); end loop; c(0) := 0.0; for i in 0..j loop -- do i:=0,j c(i) := c(i) - r(j)*c(i+1); end loop; end loop; put_line("polynomial coefficients are:"); for i in 0..n loop -- do i:=0,n put_line("c("&integer'image(i)&")="&long_float'image(c(i))); end loop; put_line("polynomial evaluated at each root:"); for i in 0..n-1 loop -- do i:=0, n-1 y := eval(n, r(i), c); put_line("r("&integer'image(i)&")="&long_float'image(r(i))& ", eval("&integer'image(n)&",r("&integer'image(i)&"),c)="& long_float'image(y)); end loop; end loop; end peval;