module Numeric.Combinatorics ( choose
, doubleFactorial
, catalan
, factorial
, derangement
, permutations
, maxRegions
) where
import Control.Composition
import Control.Monad
import Data.GMP
import Foreign.C
import Foreign.Ptr
import Foreign.Storable
import System.IO.Unsafe (unsafePerformIO)
foreign import ccall unsafe double_factorial_ats :: CInt -> Ptr GMPInt
foreign import ccall unsafe factorial_ats :: CInt -> Ptr GMPInt
foreign import ccall unsafe choose_ats :: CInt -> CInt -> Ptr GMPInt
foreign import ccall unsafe catalan_ats :: CInt -> Ptr GMPInt
foreign import ccall unsafe derangements_ats :: CInt -> Ptr GMPInt
foreign import ccall unsafe permutations_ats :: CInt -> CInt -> Ptr GMPInt
foreign import ccall unsafe max_regions_ats :: CInt -> Ptr GMPInt
derangement :: Int -> Integer
derangement = unsafePerformIO . conjugateGMP derangements_ats
catalan :: Int -> Integer
catalan = unsafePerformIO . conjugateGMP catalan_ats
choose :: Int -> Int -> Integer
choose = unsafePerformIO .* (gmpToInteger <=<) . (peek .* on choose_ats fromIntegral)
permutations :: Int -> Int -> Integer
permutations = unsafePerformIO .* (gmpToInteger <=<) . (peek .* on permutations_ats fromIntegral)
factorial :: Int -> Integer
factorial = unsafePerformIO . conjugateGMP factorial_ats
doubleFactorial :: Int -> Integer
doubleFactorial = unsafePerformIO . conjugateGMP double_factorial_ats
maxRegions :: Int
-> Integer
maxRegions = unsafePerformIO . conjugateGMP max_regions_ats