Implemented `flmultinomial' (not accurately, but it's there); changed

argument types to match `multinomial'
This commit is contained in:
Neil Toronto 2012-11-27 22:31:35 -07:00
parent 10a348815b
commit 7aadf33ead
2 changed files with 11 additions and 6 deletions

View File

@ -13,6 +13,7 @@
(provide flfactorial
flbinomial
flpermutations
flmultinomial
fllog-factorial
fllog-permutations
fllog-binomial
@ -138,10 +139,14 @@
;; ===================================================================================================
;; Multinomial
(: fllog-multinomial (Flonum Flonum * -> Flonum))
(define (fllog-multinomial n . ks)
(: fllog-multinomial (Flonum (Listof Flonum) -> Flonum))
(define (fllog-multinomial n ks)
(cond [(n . < . 0) +nan.0]
[(ormap negative? ks) +nan.0]
[(not (= n (apply + ks))) -inf.0]
[(ormap (λ: ([k : Flonum]) (= n k)) ks) 0.0]
[else (apply - (fllog-factorial n) (map fllog-factorial ks))]))
(: flmultinomial (Flonum (Listof Flonum) -> Flonum))
(define (flmultinomial n ks)
(flexp (fllog-multinomial n ks)))

View File

@ -92,21 +92,21 @@ These functions are as robust and accurate as their corresponding inverses.
@deftogether[(@defproc[(flfactorial [n Flonum]) Flonum]
@defproc[(flbinomial [n Flonum] [k Flonum]) Flonum]
@defproc[(flpermutations [n Flonum] [k Flonum]) Flonum]
@defproc[(flmultinomial [n Flonum] [k Flonum] ...) Flonum])]{
@defproc[(flmultinomial [n Flonum] [ks (Listof Flonum)]) Flonum])]{
Like @racket[(fl (factorial (fl->exact-integer n)))] and so on, but computed in constant
time. Also, these return @racket[+nan.0] instead of raising exceptions.
For @racket[factorial]-family functions that return sensible values for non-integers, see
For factorial-like functions that return sensible values for non-integers, see
@racket[gamma] and @racket[beta].
}
@deftogether[(@defproc[(fllog-factorial [n Flonum]) Flonum]
@defproc[(fllog-binomial [n Flonum] [k Flonum]) Flonum]
@defproc[(fllog-permutations [n Flonum] [k Flonum]) Flonum]
@defproc[(fllog-multinomial [n Flonum] [k Flonum] ...) Flonum])]{
@defproc[(fllog-multinomial [n Flonum] [ks (Listof Flonum)]) Flonum])]{
Like @racket[(fllog (flfactorial n))] and so on, but more accurate and without unnecessary overflow.
For log-@racket[factorial]-family functions that return sensible values for non-integers, see
For log-factorial-like functions that return sensible values for non-integers, see
@racket[log-gamma] and @racket[log-beta].
}