フィボナッチ数(多倍長計算版)     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

Made with Macintosh