[Haskell-cafe] ANN: combinatorics
wren ng thornton
wren at freegeek.org
Sun Jan 29 05:06:08 CET 2012
--------------------------------------------
-- combinatorics 0.1.0
--------------------------------------------
The combinatorics package offers efficient *exact* computation of common
combinatorial functions like the binomial coefficients and factorial.
(For fast *approximations*, see the math-functions package instead.)
--------------------------------------------
-- Long Description
--------------------------------------------
* Math.Combinatorics.Primes: provides the prime numbers via Runciman's
lazy wheel sieve algorithm. Provided here since efficient algorithms for
combinatorial functions often require prime numbers. The current version
memoizes the primes as an infinite list CAF, which could lead to memory
leaks in long-running programs with irregular access to large primes.
I'm looking into a GHC patch to allow resetting individual CAFs from
within compiled programs so that you can explicitly decide when to
un-memoize the primes. (In GHCi when you reload a module all the CAFs
are reset. However, there's no way to access this feature from within
compiled programs as yet.)
* Math.Combinatorics.Binomial: offers a fast computation of the binomial
coefficients based on the prime factorization of the result. As it turns
out, it's easier to compute the prime factorization of the answer than
it is to compute the answer directly! And you don't even need the
factorial function to do so. Albeit, with a fast factorial function, the
naive definition of binomial coefficients gives this algorithm a run for
its money.
* Math.Combinatorics.Factorial: offers a fast computation of factorial
numbers. As Peter Luschny comments[1], the factorial function is often
shown as a classic example of recursive functions, like addition of
Peano numbers, however that naive way of computing factorials is
extremely inefficient and does a disservice to those learning about
recursion. The current implementation uses the split-recursive algorithm
which is more than sufficient for casual use. I'm working on
implementing the parallel prime-swing algorithm, which should be a bit
faster still.
[1] http://www.luschny.de/math/factorial/FastFactorialFunctions.htm
--------------------------------------------
-- Links
--------------------------------------------
Homepage:
http://code.haskell.org/~wren/
Hackage:
http://hackage.haskell.org/package/combinatorics
Darcs:
http://community.haskell.org/~wren/combinatorics
Haddock (Darcs version):
http://community.haskell.org/~wren/combinatorics/dist/doc/html/combinatorics
--
Live well,
~wren
More information about the Haskell-Cafe
mailing list