16 lines
644 B
Clojure
16 lines
644 B
Clojure
(defn gamma
|
|
"Returns Gamma(z + 1 = number) using Lanczos approximation."
|
|
[number]
|
|
(if (< number 0.5)
|
|
(/ Math/PI (* (Math/sin (* Math/PI number))
|
|
(gamma (- 1 number))))
|
|
(let [n (dec number)
|
|
c [0.99999999999980993 676.5203681218851 -1259.1392167224028
|
|
771.32342877765313 -176.61502916214059 12.507343278686905
|
|
-0.13857109526572012 9.9843695780195716e-6 1.5056327351493116e-7]]
|
|
(* (Math/sqrt (* 2 Math/PI))
|
|
(Math/pow (+ n 7 0.5) (+ n 0.5))
|
|
(Math/exp (- (+ n 7 0.5)))
|
|
(+ (first c)
|
|
(apply + (map-indexed #(/ %2 (+ n %1 1)) (next c))))))))
|