From 86518c7f74d9499b5d46c38dbb3b444657362452 Mon Sep 17 00:00:00 2001 From: Bill Date: Thu, 15 Aug 2019 21:18:07 -1000 Subject: [PATCH 1/2] Broaden types accepted by stirlings1 and stirlings2 functions The functions stirlings1(n, k) and stirlings1(n, k) are currently (mid 2019) written to specify Int arguments for n and k, but the documentation states that they should optionally take a BigInt as well. This can be fixed by changing them not to specify an Int for n and k. --- src/numbers.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/numbers.jl b/src/numbers.jl index 4465c77..5e7abf2 100644 --- a/src/numbers.jl +++ b/src/numbers.jl @@ -125,7 +125,7 @@ function lucasnum(n::Integer) return z[] end -function stirlings1(n::Int, k::Int, signed::Bool=false) +function stirlings1(n, k, signed::Bool=false) if signed == true return (-1)^(n - k) * stirlings1(n, k) end @@ -151,7 +151,7 @@ function stirlings1(n::Int, k::Int, signed::Bool=false) return (n - 1) * stirlings1(n - 1, k) + stirlings1(n - 1, k - 1) end -function stirlings2(n::Int, k::Int) +function stirlings2(n, k) if n < 0 throw(DomainError(n, "n must be nonnegative")) elseif n == k == 0 From 4b2c99ac4eb5b05f0446931e396e53c9cc8ca62d Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 18 Aug 2019 03:32:40 -1000 Subject: [PATCH 2/2] Update numbers.jl --- src/numbers.jl | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/numbers.jl b/src/numbers.jl index 5e7abf2..60e989a 100644 --- a/src/numbers.jl +++ b/src/numbers.jl @@ -125,19 +125,23 @@ function lucasnum(n::Integer) return z[] end -function stirlings1(n, k, signed::Bool=false) +stirlings1cache = Dict() + +function stirlings1(n::Integer, k::Integer, signed::Bool=false) if signed == true return (-1)^(n - k) * stirlings1(n, k) end - if n < 0 + if haskey(stirlings1cache, Pair(n, k)) + return stirlings1cache[Pair(n, k)] + elseif n < 0 throw(DomainError(n, "n must be nonnegative")) elseif n == k == 0 - return 1 + return one(n) elseif n == 0 || k == 0 - return 0 + return zero(n) elseif n == k - return 1 + return one(n) elseif k == 1 return factorial(n-1) elseif k == n - 1 @@ -148,21 +152,29 @@ function stirlings1(n, k, signed::Bool=false) return binomial(n, 2) * binomial(n, 4) end - return (n - 1) * stirlings1(n - 1, k) + stirlings1(n - 1, k - 1) + ret = (n - 1) * stirlings1(n - 1, k) + stirlings1(n - 1, k - 1) + stirlings1cache[Pair(n, k)] = ret + return ret end -function stirlings2(n, k) +stirlings2cache = Dict() + +function stirlings2(n::Integer, k::Integer) if n < 0 throw(DomainError(n, "n must be nonnegative")) + elseif haskey(stirlings2cache, Pair(n, k)) + return stirlings2cache[Pair(n, k)] elseif n == k == 0 - return 1 + return one(n) elseif n == 0 || k == 0 - return 0 + return zero(n) elseif k == n - 1 return binomial(n, 2) elseif k == 2 return 2^(n-1) - 1 end - return k * stirlings2(n - 1, k) + stirlings2(n - 1, k - 1) + ret = k * stirlings2(n - 1, k) + stirlings2(n - 1, k - 1) + stirlings2cache[Pair(n, k)] = ret + ret end