LogIntegral.frink

Download or view LogIntegral.frink in plain text format


/**
   Program to calculate the log integral, often called Li[x]

   This is Integrate[1/ln[x], 0, x]

   This goes to -infinity at 1 so don't be surprised if it explodes there.

   This is useful in number theory, such as estimating the number of primes
   below a certain number.

   This function does not currently use arbitrary precision for ln[z] so
   its precision is limited and also limited by the precision of Frink's
   internally-stored value of EulerMascheroniConstant.  But this version is
   relatively fast for about 14 digits of precision.

   If you need arbitrary precision, it will be better to use Frink's
   arbitrary-precision numerical integration, for example:

   use NumericalIntegrationArbitrary.frink">NumericalIntegrationArbitrary.frink
   digits = 80
   setPrecision[digits]
   LogIntegral[a,b,digits=getPrecision[] ] := NIntegrate[{|z| 1/arbitraryLn[z]}, a, b, 10^-digits]
   LogIntegral[2, 10, digits]

   Currently, it will be necessary to set "digits" to a few more than the
   desired number of digits to make the last few digits come out right.

   See:  http://functions.wolfram.com/GammaBetaErf/LogIntegral/
*/

LogIntegral[z] :=
{
   lnz = ln[z]
   sum = (1/2) (ln[lnz] - ln[1/lnz]) + EulerMascheroniConstant

   k = 0
   
   do
   {
      k = k+1
      oldsum = sum
      term = lnz^k / (k k!)
      sum = sum + term
      //  println["$k\t$term\t$sum"]
   } while (oldsum != sum)

   return sum
}


Download or view LogIntegral.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen, eliasen@mindspring.com