在 R 中计算 *integer* 二项式系数

Posted

技术标签:

【中文标题】在 R 中计算 *integer* 二项式系数【英文标题】:Calculating an *integer* binomial coefficient in R 【发布时间】:2018-11-21 20:27:06 【问题描述】:

n中选择k个对象的方式数,即二项式系数n!/(k!(nk)!) , 当 nk 是整数时是整数。我如何计算这个以保证结果既正确又是整数类型? choose 函数即使使用整数参数也会返回双精度:

> typeof(choose(4L, 2L))  
[1] "double"  

与手动计算一样,例如n-choose-2 = n(n-1)/2

typeof((4L * (4L - 1L)) / 2L)
[1] "double"  

当然,我可以用 as.integer() 强制转换为整数,但我对机器精度感到紧张:

> as.integer(3.999999999999999)
[1] 3
> as.integer(3.9999999999999999)
[1] 4

round()(默认为digits=0)四舍五入到最接近的整数,但返回一个双精度类型的值。如果我可以确定向as.integer(round(...)) 提供一个以双精度格式存储的整数可以保证四舍五入到正确的整数,而不会被机器精度绊倒,那么as.integer(round(choose(n, k))) 是可以接受的。是这样吗?或者有没有替代choose() 的方法可以为整数参数返回一个整数?

【问题讨论】:

typeof((4L * (4L - 1L)) %/% 2L) 会给你整数,如果你选择使用%/% 而不是/ 你会得到整数 我不确定这是@ChrisW 想要的...因为5 %/% 2 = 2 确实,我认为这不能回答我的问题。 既然 n!/(k!(n-k)!) 如果 n 和 k 是整数,则总是返回一个整数,因此无需round 它,只需执行as.integer(choose(n, k))。如果您的输入是非整数,您只需要四舍五入。 【参考方案1】:

一种方法是使用 VeryLargeIntegers 包。功能是:

binom(n, k)

例如binom(1000,50) 甚至 binom(10000000,50)

学习如何制作非常大的整数也是明智之举,参见:as.vli('1234567890123456789')

https://www.rdocumentation.org/packages/VeryLargeIntegers/versions/0.1.8/topics/06.%20Binomial%20coefficients

该软件包并非完全没有错误,更大的计算需要一段时间。

乔博士。

【讨论】:

【参考方案2】:

不用担心转换,机器精度不会有问题。整数后面的L肯定不是double,[R]语法怪怪的,肯定不是long值,不能有小数点。

【讨论】:

以上是关于在 R 中计算 *integer* 二项式系数的主要内容,如果未能解决你的问题,请参考以下文章

二项式系数和公式

多项式的系数怎么求

如何找到固定 n 的前 r 二项式系数的总和?

每日一小练——二项式系数加法解

二项式系数相关小结

以二进制计算二项式系数