目的 n 番目のフィボナッチ数を求める Fibonacci 関数も参照のこと 使用法 longFibonacci(n) 引数 n n 番目のフィボナッチ数を求める。 ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/longFibonacci.R", encoding="euc-jp") # 多倍長計算により,n 番目のフィボナッチ数を返す longFibonacci <- function(n) { "%add%" <- function(ans, b) # 足し算の演算子 ans %add% b を行い結果を返す { # ans, b は多倍長整数 if (length(ans) != length(b)) { ans <- c(ans, 0) } ans <- ans+b # 各桁の足し算を行う if (ans[length(ans)] >= 10000000000) { ans <- c(ans, 0) } for (i in 1:length(ans)) { # 各桁について下の桁から, if (ans[i] >= 10000000000) { # 繰り上がり処理を行う ans[i] <- ans[i]-10000000000 ans[i+1] <- ans[i+1]+1 } } return(ans) # 結果を返す } if (n <= 2) { c <- 1 } else { a <- b <- c <- numeric(1) a[1] <- b[1] <- 1 for (i in 3:n) { c <- a %add% b a <- b b <- c } } class(c) <- "longFibonacci" return(c) } print.longFibonacci <- function(x) # プリント・メソッド { top.zero <- " " for (i in length(x):1) { if (x[i] != 0 || top.zero == FALSE) { out <- paste(top.zero, as.character(x[i]), sep="") len <- nchar(out) cat(sprintf("%10s ", substring(out, len-9, len))) top.zero <- "0000000000" } } cat("\n") } 使用例 longFibonacci(10) longFibonacci(300) 出力結果例 > longFibonacci(10) 55 > longFibonacci(300) # 10 桁ずつに区切って出力 222 2322446294 2044552973 9893461909 9672066669 3909649976 4990979600 > library(gmp) > fibnum(10) Big Integer ('bigz') : [1] 55 > fibnum(300) Big Integer ('bigz') : [1] 222232244629420445529739893461909967206666939096499764990979600