Implemented `flmultinomial' (not accurately, but it's there); changed
argument types to match `multinomial'
This commit is contained in:
parent
10a348815b
commit
7aadf33ead
|
@ -13,6 +13,7 @@
|
||||||
(provide flfactorial
|
(provide flfactorial
|
||||||
flbinomial
|
flbinomial
|
||||||
flpermutations
|
flpermutations
|
||||||
|
flmultinomial
|
||||||
fllog-factorial
|
fllog-factorial
|
||||||
fllog-permutations
|
fllog-permutations
|
||||||
fllog-binomial
|
fllog-binomial
|
||||||
|
@ -138,10 +139,14 @@
|
||||||
;; ===================================================================================================
|
;; ===================================================================================================
|
||||||
;; Multinomial
|
;; Multinomial
|
||||||
|
|
||||||
(: fllog-multinomial (Flonum Flonum * -> Flonum))
|
(: fllog-multinomial (Flonum (Listof Flonum) -> Flonum))
|
||||||
(define (fllog-multinomial n . ks)
|
(define (fllog-multinomial n ks)
|
||||||
(cond [(n . < . 0) +nan.0]
|
(cond [(n . < . 0) +nan.0]
|
||||||
[(ormap negative? ks) +nan.0]
|
[(ormap negative? ks) +nan.0]
|
||||||
[(not (= n (apply + ks))) -inf.0]
|
[(not (= n (apply + ks))) -inf.0]
|
||||||
[(ormap (λ: ([k : Flonum]) (= n k)) ks) 0.0]
|
[(ormap (λ: ([k : Flonum]) (= n k)) ks) 0.0]
|
||||||
[else (apply - (fllog-factorial n) (map fllog-factorial ks))]))
|
[else (apply - (fllog-factorial n) (map fllog-factorial ks))]))
|
||||||
|
|
||||||
|
(: flmultinomial (Flonum (Listof Flonum) -> Flonum))
|
||||||
|
(define (flmultinomial n ks)
|
||||||
|
(flexp (fllog-multinomial n ks)))
|
||||||
|
|
|
@ -92,21 +92,21 @@ These functions are as robust and accurate as their corresponding inverses.
|
||||||
@deftogether[(@defproc[(flfactorial [n Flonum]) Flonum]
|
@deftogether[(@defproc[(flfactorial [n Flonum]) Flonum]
|
||||||
@defproc[(flbinomial [n Flonum] [k Flonum]) Flonum]
|
@defproc[(flbinomial [n Flonum] [k Flonum]) Flonum]
|
||||||
@defproc[(flpermutations [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
|
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.
|
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].
|
@racket[gamma] and @racket[beta].
|
||||||
}
|
}
|
||||||
|
|
||||||
@deftogether[(@defproc[(fllog-factorial [n Flonum]) Flonum]
|
@deftogether[(@defproc[(fllog-factorial [n Flonum]) Flonum]
|
||||||
@defproc[(fllog-binomial [n Flonum] [k Flonum]) Flonum]
|
@defproc[(fllog-binomial [n Flonum] [k Flonum]) Flonum]
|
||||||
@defproc[(fllog-permutations [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.
|
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].
|
@racket[log-gamma] and @racket[log-beta].
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user