R:如何在n-choose-k中计算大数?
发布时间:2020-12-14 04:32:16 所属栏目:大数据 来源:网络整理
导读:参见英文答案 How would you program Pascal’s triangle in R?????????????????????????????????????2个 ???????????? How to work with large numbers in R?????????????????????????????????????1个 对于类赋值,我需要创建一个计算n选择k的函数.我做到了
参见英文答案 >
How would you program Pascal’s triangle in R?????????????????????????????????????2个
>???????????? How to work with large numbers in R?????????????????????????????????????1个 对于类赋值,我需要创建一个计算n选择k的函数.我做到了这一点,并且它适用于小数字(例如6选2),但我应该让它与200选择50,它自然不会. 答案太大,R输出NaN或Inf,说: > q5(200,50) [1] "NaN" Warning message: In factorial(n) : value out of range in 'gammafn' 我尝试使用日志和指数,但它没有削减它. q5 <- function (n,k) { answer <- log(exp( factorial(n) / ( (factorial(k)) * (factorial(n - k)) ))) paste0(answer) } 解决方法
实际问题的答案是R不能显示它无法表示的数字,并且等式中的某些项太大而无法表示.所以它失败了.然而,可以使用的是阶乘的近似值 – 它们使用的对数变得更慢.
最着名的一个,斯特林的近似,不够准确,但Ramanujan’s approximation来救援:) ramanujan <- function(n){ n*log(n) - n + log(n*(1 + 4*n*(1+2*n)))/6 + log(pi)/2 } nchoosek <- function(n,k){ factorial(n)/(factorial(k)*factorial(n-k)) } bignchoosek <- function(n,k){ exp(ramanujan(n) - ramanujan(k) - ramanujan(n-k)) } nchoosek(20,5) # [1] 15504 bignchoosek(20,5) # [1] 15504.06 bignchoosek(200,50) # [1] 4.538584e+47 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |