function [radici,iter]=newtonhorner(a,x0,tol,nmax)
%NEWTONHORNER Metodo di Newton-Horner
%   [RADICI,ITER]=NEWTONHORNER(A,X0) calcola le
%   radici del polinomio
%    P(X) = A(1)*X^N + A(2)*X^(N-1) + ...
%                                + A(N)*X + A(N+1)
%   con il metodo di Newton-Horner a partire dal dato
%   iniziale X0. Il metodo si arresta per ogni radice
%   al massimo dopo 100 iterazioni o dopo che il valore
%   assoluto della differenza fra due iterate conse-
%   cutive e' minore di 1.e-04.
%   [RADICI,ITER]=NEWTONHORNER(A,X0,TOL,KMAX) consente
%   di definire la tolleranza sul criterio d'arresto
%   ed il numero massimo di iterazioni.

if nargin == 2
    tol = 1.e-04;
    nmax = 100;
elseif nargin == 3
    nmax = 100;
end
n=length(a)-1;
radici = zeros(n,1);
iter = zeros(n,1);

for k = 1:n
    % Iterazioni di Newton
    niter = 0;
    x = x0;
    diff = tol + 1;
    while niter < nmax & diff >= tol
        [pz,b] = horner(a,x);
        [dpz,b] = horner(b,x);
        xnew = x - pz/dpz;
        diff = abs(xnew-x);
        niter = niter + 1;
        x = xnew;
    end

    if (niter==nmax & diff> tol)
      fprintf([' Il metodo non converge nel numero',...
              ' massimo di iterazioni\n ']);
    end
    % Deflazione
    [pz,a] = horner(a,x);
    radici(k) = x;
    iter(k) = niter;
end
return
