function alpha = step_length_positive_definite(g, Q, p)
  %
  % Find the minimizer alpha of,
  %
  %   phi(alpha) = f(x + alpha*p)
  %
  % where ``p`` is a descent direction,
  %
  %   f(x) = (1/2)<Qx,x> - <b,x>
  %
  % and ``Q`` is positive-definite.
  %
  % The closed-form solution to this problem is given in Nocedal and
  % Wright, (3.55).
  %
  % INPUT:
  %
  %   - ``g`` -- The gradient of f at x.
  %
  %   - ``Q`` -- The positive-definite matrix in the definition of
  %     ``f`` above.
  %
  %   - ``p`` -- The direction in which ``f`` decreases. The line
  %     along which we minimize f(x + alpha*p).
  %
  % OUTPUT:
  %
  %   - ``alpha`` -- The value which causes ``f`` to decrease the
  %     most.
  %
  % NOTES:
  %
  % All vectors are assumed to be *column* vectors.
  %
  denom = (p' * Q * p);

  % denom is non-negative, since it's a Q-norm. No need to abs() it.
  if (denom < eps)
    % Catch divide-by-zeros. If denom is effectively zero, set it to
    % something tiny instead. This trick is also used in the PCGM.
    denom = eps;
  end

  alpha = -(g' * p)/denom;
end
