R: самый быстрый способ выполнять высокоточные вычисления с очень большими числами

Я использую динамическое программирование (в R), чтобы заполнить около 20000 ячеек в массиве. Мне нужно точное целое число в последней ячейке. Функция требует только сложения, умножения и логических выражений.

Если я запускаю свою функцию с числами двойной точности, она выполняет вычисления примерно через 30 с, но точное целое число имеет длину около 50 цифр, и, конечно, числа с двойной точностью не могут полностью ее представить.

Когда я пытаюсь сделать это с числами mpfr или большими целыми числами ('bigz'), функция работает как минимум на порядок медленнее. Есть ли способ, которым я могу получить большие числа, высокую точность и скорость, все сразу?

(Для контекста я пытаюсь вычислить числа Моцкина, чтобы найти, сколько возможных стабильных структур может иметь данная последовательность РНК. Вот код, использующий числа 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])
}

0 ответов

Другие вопросы по тегам