simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

gamma.js (825B)


      1 /*
      2  * A gamma function implementation based on Lanczos Approximation
      3  * https://en.wikipedia.org/wiki/Lanczos_approximation
      4  */
      5 
      6 var Complex = require('../complex');
      7 
      8 var P = [Complex(0.99999999999980993),
      9   Complex(676.5203681218851), Complex(-1259.1392167224028), Complex(771.32342877765313),
     10   Complex(-176.61502916214059), Complex(12.507343278686905), Complex(-0.13857109526572012),
     11   Complex(9.9843695780195716e-6), Complex(1.5056327351493116e-7)];
     12 
     13 var SQRT2PI = Complex(Math.sqrt(2 * Math.PI));
     14 
     15 function gamma(z) {
     16 
     17   z = z.sub(1);
     18 
     19   var x = P[0];
     20   var t = z.add(7.5);
     21   for (var i = 1; i < P.length; i++) {
     22     x = x.add(P[i].div(z.add(i)));
     23   }
     24   return SQRT2PI.mul(t.pow(z.add(0.5))).mul(t.neg().exp()).mul(x);
     25 }
     26 
     27 var fac = 1;
     28 for (var i = 1; i <= 10; i++) {
     29   console.log(fac, gamma(Complex(i)));
     30   fac *= i;
     31 }