module Numeric.Combinatorics
( factorial
, choose
, doubleFactorial
) where
import Control.Composition
import Foreign.C
foreign import ccall unsafe factorial_ats :: CInt -> CInt
foreign import ccall unsafe choose_ats :: CInt -> CInt -> CInt
foreign import ccall unsafe double_factorial :: CInt -> CInt
choose :: Int
-> Int
-> Int
choose = fromIntegral .* on choose_ats fromIntegral
doubleFactorial :: Int -> Int
doubleFactorial = fromIntegral . double_factorial . fromIntegral
factorial :: Int -> Int
factorial = fromIntegral . factorial_ats . fromIntegral