function [x,nit,er,res]=gs(A,b,toll,nmax)
  x=zeros(size(b));
  nit=0;
  er='';
  res=norm(b-A*x);
  N=length(A);
  d=diag(A);
  if min(abs(d))==0
    er='La diagonale di A ha un elemento uguale a zero';
    return
  end
  C=norm(b);
  tollC=C*toll;
  while nit < nmax & res > tollC
    nit=nit+1;
    x(1)=(b(1)-A(1,2:N)*x(2:N))/d(1);
    for i=2:N-1
      s1=A(i,1:i-1)*x(1:i-1);
      s2=A(i,i+1:N)*x(i+1:N);
      x(i)=(b(i)-s1-s2)/d(i);
    end
    x(N)=(b(N)-A(N,1:N-1)*x(1:N-1))/d(N);
    res=norm(b-A*x);
  end
  if res > tollC | isnan(res)
    er='Test di arresto non soddisfato';
  end
