gamma.js 825 B

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