# [racket] Math library kudos

On 02/19/2013 05:28 PM, Joe Gilray wrote:
>* Racketeers,
*>*
*>* Thanks for putting together the fantastic math library. It will be a
*>* wonderful resource. Here are some quick impressions (after playing
*>* mostly with math/number-theory)
*
The thanks in this case goes to Jens Axel, who wrote almost all of the
number theory functions.
>* 1) The functions passed all my tests and were very fast. If you need
*>* even more speed you can keep a list of primes around and write functions
*>* to use that, but that should be rarely necessary
*
I'm glad to hear they passed your tests as well. FWIW, when I reviewed
Jens Axel's code before its initial commit, I didn't find any errors,
either. (Which is amazing. Usually, adding another observer to a
software system collapses its state to a mess of bug-ridden filth.)
>* ...
*>*
*>* 2b) combinations calculator
*>*
*>* ; function that returns the number of combinations, not the combinations
*>* themselves
*>* ; faster than using n! / (r! (n-r)!)
*>* (define (combinations n r)
*>* (cond
*>* [(or (< n 0) (< r 0)) (error "combinations: illegal arguments, n
*>* and r must be >= 0")]
*>* [(> r n) 0]
*>* [else
*>* (let lp ([mord n] [total 1] [mult #t])
*>* (cond
*>* [(or (= 0 mord) (= 1 mord)) total]
*>* [(and mult (= mord (- n r))) (lp r total #f)]
*>* [(and mult (= mord r)) (lp (- n r) total #f)]
*>* [mult (lp (sub1 mord) (* total mord) #t)]
*>* [else (lp (sub1 mord) (/ total mord) #f)]))]))
*
We have this one under the name `binomial'. But yours is about 8% faster
in my tests with random inputs in [0..1000], which has me curious.
Neil ⊥