裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

64 bit integer 登場

2011年11月29日 | ブログラミング

int64 パッケージ

> library(int64)
> a <- as.int64(1)
> for (i in 1:300) {a <- a*i; print(a)}
[1] 1
[1] 2
[1] 6
[1] 24
[1] 120
[1] 720
[1] 5040
[1] 40320
[1] 362880
[1] 3628800
[1] 39916800
[1] 479001600
[1] 6227020800
[1] 87178291200
[1] 1307674368000
[1] 20922789888000
[1] 355687428096000
[1] 6402373705728000
[1] 121645100408832000
[1] 2432902008176640000
[1] NA   オーバーフロー

gmp パッケージ

> library(help=gmp)
> a <- as.bigz(1)
> for (i in 1:21) { a <- a*i; print(a) }
[1] "1"
[1] "2"
[1] "6"
[1] "24"
[1] "120"
[1] "720"
[1] "5040"
[1] "40320"
[1] "362880"
[1] "3628800"
[1] "39916800"
[1] "479001600"
[1] "6227020800"
[1] "87178291200"
[1] "1307674368000"
[1] "20922789888000"
[1] "355687428096000"
[1] "6402373705728000"
[1] "121645100408832000"
[1] "2432902008176640000"
[1] "51090942171709440000"
[1] "1124000727777607680000"
[1] "25852016738884976640000"

単なる numeric

> options(digits=22)
> a <- 1
> for (i in 1:23) { a <- a*i; print(a) }
[1] 1
[1] 2
[1] 6
[1] 24
[1] 120
[1] 720
[1] 5040
[1] 40320
[1] 362880
[1] 3628800
[1] 39916800
[1] 479001600
[1] 6227020800
[1] 87178291200
[1] 1307674368000
[1] 20922789888000
[1] 355687428096000
[1] 6402373705728000
[1] 121645100408832000
[1] 2432902008176640000
[1] 51090942171709440000
[1] 1124000727777607680000
[1] 25852016738884978212864   オーバーフロー!!

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

等式を成り立たせよう

2011年11月29日 | ブログラミング

等式を成り立たせよう
さっきのと同じように解ける。ユニークな解は1つだけど。

> library(e1071)
> invisible(apply(permutations(9), 1, function(i) {
+     st <- paste(c("", "/", "", "+", "/", "", "+", "/", ""), i, collapse="", sep="")
+     if (eval(parse(text=st)) == 1) cat(st, "\n")
+ }))
5/34+7/68+9/12
7/68+5/34+9/12
7/68+9/12+5/34
5/34+9/12+7/68
9/12+5/34+7/68
9/12+7/68+5/34

別解

> library(e1071)
> invisible(apply(permutations(9), 1, function(i) {
+     d1 <- i[2]*10+i[3]
+     d2 <- i[5]*10+i[6]
+     d3 <- i[8]*10+i[9]
+     if ((i[1]*d2*d3+i[4]*d1*d3+i[7]*d1*d2)== d1*d2*d3) cat(i, "\n")
+ }))
5 3 4 7 6 8 9 1 2
7 6 8 5 3 4 9 1 2
7 6 8 9 1 2 5 3 4
5 3 4 9 1 2 7 6 8
9 1 2 5 3 4 7 6 8
9 1 2 7 6 8 5 3 4

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

式を成り立たせる問題

2011年11月29日 | ブログラミング

式を成り立たせる問題。簡単すぎる。×を*,÷を/,=を==とする。

> library(e1071)
> op <- c("+", "-", "*", "/", "==")
> invisible(apply(permutations(5), 1, function(i) {
+     st <- paste(paste(5:1, op[i], collapse="", sep=""), "0", sep="")
+     if (eval(parse(text=st))) cat(st, "\n")
+ }))
5-4*3/2+1==0
5==4*3/2-1+0

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

pbirthday の改訂

2011年11月29日 | ブログラミング

R 2.14.0 から,
pbirthday() and qbirthday() now use exact calculations for coincident = 2.
になった。

R 2.13.1 では,
pbirthday() and qbirthday() did not implement the algorithm exactly as given in their reference and so were unnecessarily inaccurate.
などとうそぶいており,

ずっとまえから,近似解だよといいながら不適切な関数を提供し続けてきた。やっと悔い改めたと言うことか。頑固なんだから。

誕生日のパラドックスは,R 1.9.0 あたりかな。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

既約分数クイズ

2011年11月29日 | ブログラミング

既約分数クイズ にあるもの。

0/q, q/q は自明なので,除く。いかにもRらしい解??。ただし,メモリ節約も最適化も何にも考えない。既存関数を利用し,ひたすら短く難解なプログラムを目指す。

> func <- function(d0)
+ {
+     euclid <- function(m, n)
+     {
+         m0 <- m
+         n0 <- n
+         while ((temp <- n %% m) != 0) {
+             n <- m
+             m <- temp
+         }
+         return(c(m0/m, n0/m))
+     }
+     a <- unique(data.frame(t(combn(d0, 2, function(x) euclid(x[1], x[2])))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3 
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

別解(さらに横着)

> library(gmp)
> func <- function(d0)
+ {
+     euclid <- function(m, n)
+     {
+         k <- as.numeric(gcd.bigz(m, n))
+         return(c(m/k, n/k))
+     }
+     a <- unique(data.frame(t(combn(d0, 2, function(x) euclid(x[1], x[2])))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

さらに短く複雑に

> library(gmp)
> func <- function(d0)
+ {
+     a <- unique(data.frame(t(combn(d0, 2, function(x) {k <- as.numeric(gcd.bigz(x[1], x[2]));
+          return(c(x[1]/k, x[2]/k))}))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村