フィボナッチ数(多倍長計算版) Last modified: Jun 27, 2009
目的
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
直前のページへ戻る
E-mail to Shigenobu AOKI