module Combinatorics.BellNumbers where

import Combinatorics (binomials, )
import Combinatorics.Utility (scalarProduct, )
import qualified PowerSeries


{- $setup
>>> import qualified Combinatorics.BellNumbers as Bell
>>> import Test.Utility (equalFuncList)
-}


{- |
List of Bell numbers computed with the recursive formula
given in Wurzel 2004-06, page 136
-}
bellRec :: Num a => [a]
bellRec :: forall a. Num a => [a]
bellRec =
   a
1 forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall a. Num a => [a] -> [a] -> a
scalarProduct forall a. Num a => [a]
bellRec) forall a. Num a => [[a]]
binomials

{- |
prop> equalFuncList (\k -> round (Bell.bellSeries (fromInteger k) :: Double)) (Bell.bellRec :: [Integer]) 20
-}
bellSeries :: (Floating a, Enum a) => Int -> a
bellSeries :: forall a. (Floating a, Enum a) => Int -> a
bellSeries Int
n =
   forall a. Num a => [a] -> [a] -> a
scalarProduct
      (forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (Num a, Integral b) => a -> b -> a
^Int
n) [a
0..])
      (forall a. Int -> [a] -> [a]
take Int
30 forall a. Fractional a => T a
PowerSeries.derivativeCoefficients)
     forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
exp a
1