module Bell where import Data.MemoTrie import Stirling -- A000110 -- number of partitions of a set -- also the number of n-types in the structure (N, =) bell :: Int -> Integer bell = memo bell0 where bell0 n = if n <= 12 then table !! n else sum [ secondStirling n k | k <- [0 .. n] ] table = [1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597] -- number of n-types in the structure (N, <=) orderedBell :: Int -> Integer orderedBell = memo ob where ob n = if n <= 10 then table !! n else sum [ fac k * secondStirling n k | k <- [0 .. n] ] table = [1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, 102247563] fac k = product [1 .. fromIntegral k]