private static double FactorLn(int n)
{
if (n < 0)
throw new ArgumentException("n must be zero or greater");
if (n <= 1)
return 0;
if (n > 50000)
return n*Math.Log(n) - n + 0.5*Math.Log(6.28318530717959*n) + 0.08333333333333/n - 0.00333333333333/(n*n*n);
while (_factorLnTop <= n)
{
int j = _factorLnTop++;
factorLnArray[j + 1] = factorLnArray[j] + Math.Log(_factorLnTop);
}
return factorLnArray[n];
}