我正在使用动态编程(在 R 中)来填充数组中的大约 20,000 个单元。我需要最后一个单元格中的确切整数。该函数只需要加法、乘法和逻辑表达式。
如果我用双精度数运行我的函数,它会在大约 30 秒内完成计算,但确切的整数大约是 50 位长,当然双精度数不能完全表示它。
当我尝试使用 mpfr 数字或大整数 ('bigz') 时,该函数的运行速度至少慢了一个数量级。有没有一种方法可以同时获得大量、高精度和速度?
(对于上下文,我正在尝试计算 Motzkin 数,以找出给定 RNA 序列有多少可能的稳定结构。这是使用 mpfr 数的代码。“s”是一个长度约为 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])
}