r - 如何在没有不必要溢出的情况下计算大阶乘的比率?

标签 r overflow factorial

我正在编写一个程序(在 R 中,以防万一),我需要在其中计算元素向量的唯一排列数,其中可以包含重复值。 mathematical formula因为这很简单:元素总数的阶乘除以每个唯一元素的计数的阶乘的乘积。然而,即使实际答案不是很大,天真地计算结果也很可能导致溢出。例如:

# x has 200 elements, but 199 of them are identical
x <- c(rep(1, 199), 2)
num_unique_permutations <- factorial(length(x)) / prod(factorial(table(x)))

如果这没有溢出,那么 num_unique_permutations 将是 200!/(199!*1!) = 200。但是,两者都是 200!和199!溢出 double 的最大值,因此实际结果为 NaN。只要答案本身不溢出,是否有一种好的方法可以始终避免溢出(或下溢)? (或者,只要它不在溢出的 length(x) 因素之内?)


(请注意,R 在大多数数值计算中使用 double ,但问题并非特定于 double 。任何具有范围的数字类型都有相同的问题。另外,我不在乎 float 会失去一点精度数学,因为我只是用它来获得某事的粗略上限。)

最佳答案

在基数 R 中,使用 lfactorial 计算分子和分母的对数。然后对适当的差取幂。

numer <- lfactorial(length(x))
denom <- sum(lfactorial(table(x)))
exp(numer - denom)
#[1] 200

这可以很容易地写成一个函数。

num_unique_permutations <- function(x){
  numer <- lfactorial(length(x))
  denom <- sum(lfactorial(table(x)))
  exp(numer - denom)
}

num_unique_permutations(x)
#[1] 200

关于r - 如何在没有不必要溢出的情况下计算大阶乘的比率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63690732/

相关文章:

r - 使用 ggraph/ggplot2 在网络图中定位节点和边

r - 如何在同一个 ggplot2 (R) 上拟合负二项式、正态和泊松密度函数但缩放到计数数据?

r - 错误curlMultiperform(多句柄): embedded nul in string

recursion - SICP 中的迭代阶乘过程

c - 如何显示数字的总和除以阶乘?

r - 将参数传递给 react 函数

c++ - 函数的堆栈分配

html - 应该流到下一行的文本不会增加父框模型

html - 诺基亚 5800 浏览器中的 div 溢出

使用循环计算 e 常数的 C++ 程序