function [ value, ifault ] = digamma ( x )

%*****************************************************************************80
%
%% digamma() calculates DIGAMMA ( X ) = d ( LOG ( GAMMA ( X ) ) ) / dX
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    18 January 2008
%
%  Author:
%
%    Original FORTRAN77 version by Jose Bernardo.
%    MATLAB version by John Burkardt.
%
%  Reference:
%
%    Jose Bernardo,
%    Algorithm AS 103:
%    Psi ( Digamma ) Function,
%    Applied Statistics,
%    Volume 25, Number 3, 1976, pages 315-317.
%
%  Input:
%
%    real X, the argument of the digamma function.
%    0 < X.
%
%  Output:
%
%    real VALUE, the value of the digamma function at X.
%
%    integer IFAULT, error flag.
%    0, no error.
%    1, X <= 0.
%
  c = 8.5;
  d1 = -0.5772156649;
  s = 0.00001;
  s3 = 0.08333333333;
  s4 = 0.0083333333333;
  s5 = 0.003968253968;
%
%  Check the input.
%
  if ( x <= 0.0 )
    value = 0.0;
    ifault = 1;
    return
  end
%
%  Initialize.
%
  ifault = 0;
  y = x;
  value = 0.0;
%
%  Use approximation if argument <= S.
%
  if ( y <= s )
    value = d1 - 1.0 / y;
    return
  end
%
%  Reduce to DIGAMA(X + N) where (X + N) >= C.
%
  while ( y < c )
    value = value - 1.0 / y;
    y = y + 1.0;
  end
%
%  Use Stirling's (actually de Moivre's) expansion if argument > C.
%
  r = 1.0 / y;
  value = value + log ( y ) - 0.5 * r;
  r = r * r;
  value = value - r * ( s3 - r * ( s4 - r * s5 ) );

  return
end
