http://r-statistics-fan.hatenablog.com/entry/2014/08/09/103123
「Rで多倍長精度計算~とりあえず10000の階乗を計算してみる」であるが...
小数点以下も表示されてしまうので,整数部分だけを表示するように別解を。
先頭桁から区切っていくという仕様にした。別仕様は練習用。
library(Rmpfr)
one = mpfr(1,200000)
x = 10000
x = 100
fact.x = Reduce("*", c(one, 1:x))
print.mpfr = function(mpfr, n=100, m=10, Rev=FALSE) {
num = sub("\\..+", "", formatMpfr(mpfr))
blk = n-nchar(num) %% n
num = c(unlist(strsplit(num, "")), rep(" ", blk))
num = matrix(num, m)
num = matrix(apply(num, 2, paste, collapse=""), n %/% m)
num = apply(num, 2, paste, collapse=" ")
num = gsub(" +", "", num)
invisible(sapply(num, cat, "\n"))
}
> print.mpfr(fact.x) # print(fact.x) はよいが,fact.x だけではダメ
9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000
なお,factorialZ() があるので,gmp パッケージも便利
print.gmp = function(gmp, n=100, m=10, Rev=FALSE) {
num = as.character(gmp)
blk = n-nchar(num) %% n
num = c(unlist(strsplit(num, "")), rep(" ", blk))
num = matrix(num, m)
num = matrix(apply(num, 2, paste, collapse=""), n %/% m)
num = apply(num, 2, paste, collapse=" ")
num = gsub(" +", "", num)
invisible(sapply(num, cat, "\n"))
}
> library(gmp)
> a = factorialZ(x)
> print.gmp(a) # print(a) ではダメ
9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000
なお,文字列に直した後,gsub によって,m 桁ごとに空白,n桁ごとには改行文字を挿入してやるというのも一興かと。
print.gmp2 = function(gmp, n=100, m=10, Rev=FALSE) {
num = as.character(gmp)
com = sprintf('cat(gsub("(.{%i})", "\\\\1\n", gsub("(.{%i})", "\\\\1 ",num)))', (m+1)*n%/%m, m)
eval(parse(text=com))
}
> print.gmp2(a)
9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000