R:使用非常大的数字进行高精度计算的最快方法

时间:2017-03-07 17:36:49

标签: r performance largenumber arbitrary-precision motzkin-numbers

我使用动态编程(在R中)来填充数组中的大约20,000个单元格。我需要最后一个单元格中的确切整数。该函数只需要加法,乘法和逻辑表达式。

如果我使用双精度数运行我的函数,它会在大约30秒内进行计算,但是精确整数大约是50位数,当然双精度数字不能完全代表它。

当我尝试使用mpfr数字或大整数(' bigz')时,该函数运行速度至少慢一个数量级。有没有办法可以同时获得大数,高精度,速度?

(对于上下文,我试图计算Motzkin数,以找出可能存在给定RNA序列的稳定结构的数量。这里是代码,使用mpfr数字。" s& #34;是一个长度约为200个字符的字符串。)

Motzkin_v7 <- function(s){
  b <- list(A = c("U"), C = c("G"), G = c("C","U"), U = c("A","G"))

  d <- new("mpfrArray",
           rep(mpfr(0, precBits = 256),
               times = (nchar(s)+1)^2),
           Dim = c(as.integer(nchar(s)+1),as.integer(nchar(s)+1)))

  #d <- array(0, dim = c(nchar(s)+1,nchar(s)+1))

  for (m in 1:5){
    for (i in m:nrow(d)){
      d[i,(i+1-m)]<-mpfr(1, precBits = 256)
    }
  }
  for (i in 6:nrow(d)){
    cat (i, nrow(d), "\n")
    for (j in (i-5):1){
      d[i,j] <- d[i,(j+1)]
      for (k in 4:(i-j-1)){
        d[i,j] <- d[i,j] + (d[i,(j+1+k)]*d[(j+k),(j+1)]*u(s,j,j) %in% b[[u(s,(j+k),(j+k))]])
      }
    }
  }
  return(d[nrow(d),1])
}

0 个答案:

没有答案