Commit 8f9a1eee authored by Raymond Hettinger's avatar Raymond Hettinger

Inline coefficients in gamma(). Add reflection formula. Add comments.

parent e7cb1ce8
...@@ -5,7 +5,7 @@ import random ...@@ -5,7 +5,7 @@ import random
import time import time
import pickle import pickle
import warnings import warnings
from math import log, exp, sqrt, pi, fsum as msum from math import log, exp, sqrt, pi, fsum, sin
from test import test_support from test import test_support
class TestBasicOps(unittest.TestCase): class TestBasicOps(unittest.TestCase):
...@@ -459,15 +459,23 @@ class MersenneTwister_TestBasicOps(TestBasicOps): ...@@ -459,15 +459,23 @@ class MersenneTwister_TestBasicOps(TestBasicOps):
self.assert_(stop < x <= start) self.assert_(stop < x <= start)
self.assertEqual((x+stop)%step, 0) self.assertEqual((x+stop)%step, 0)
_gammacoeff = (0.9999999999995183, 676.5203681218835, -1259.139216722289, def gamma(z, sqrt2pi=(2.0*pi)**0.5):
771.3234287757674, -176.6150291498386, 12.50734324009056, # Reflection to right half of complex plane
-0.1385710331296526, 0.9934937113930748e-05, 0.1659470187408462e-06) if z < 0.5:
return pi / sin(pi*z) / gamma(1.0-z)
def gamma(z, cof=_gammacoeff, g=7): # Lanczos approximation with g=7
z -= 1.0 az = z + (7.0 - 0.5)
s = msum([cof[0]] + [cof[i] / (z+i) for i in range(1,len(cof))]) return az ** (z-0.5) / exp(az) * sqrt2pi * fsum([
z += 0.5 0.9999999999995183,
return (z+g)**z / exp(z+g) * sqrt(2.0*pi) * s 676.5203681218835 / z,
-1259.139216722289 / (z+1.0),
771.3234287757674 / (z+2.0),
-176.6150291498386 / (z+3.0),
12.50734324009056 / (z+4.0),
-0.1385710331296526 / (z+5.0),
0.9934937113930748e-05 / (z+6.0),
0.1659470187408462e-06 / (z+7.0),
])
class TestDistributions(unittest.TestCase): class TestDistributions(unittest.TestCase):
def test_zeroinputs(self): def test_zeroinputs(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment