裏 RjpWiki

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

モンテカルロ法で π を求める

2015年05月25日 | ブログラミング

pi を,試行回数 n = 10, 100, 1000, ..., 1000000 として,モンテカルロ法で求めよという単純な問題。

ずっと前にここにも書いたが,R では基本的に
mean(1 >= colSums(matrix(runif(2*n)^2, 2)))*4
の 1 行で書ける(複数の関数を使うが)

junk = sapply(10^(1:6), function(n) {
  pi0 = mean(1 >= colSums(matrix(runif(2*n)^2, 2)))*4
  cat(sprintf("n = %7i pi = %.9f error = %10.7f\n", n, pi0, pi-pi0))
}

n =      10 pi = 3.200000000 error = -0.0584073
n =     100 pi = 3.120000000 error =  0.0215927
n =    1000 pi = 3.252000000 error = -0.1104073
n =   10000 pi = 3.150000000 error = -0.0084073
n =  100000 pi = 3.142480000 error = -0.0008873
n = 1000000 pi = 3.144192000 error = -0.0025993

なお,
「ランダムな点を増やしていくと、段々と Πに近づいていくはずです」
というのは,一見正しそうであるが,一時的に遠ざかることもあるということで,実行例のような n が小さいときの値の方が誤差が少ないということもある(あたりまえなんだ)。

また,
「精度は単精度で構いません」
とは,時代遅れ。今時,単精度でプログラムすることなんかないだろう。

 

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

暗号(その2)

2015年05月25日 | ブログラミング

ガラケーを使っている人が出した暗号というのが,ヒントなんだろうとピンときた。

2 タッチ入力かと思ったが,ちょと違った。
ケータイ入力の方だ。

まずは,平文化

decoding = function(x) {
  char = list(c("あ", "い", "う", "え", "お", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ"),
  c("か", "き", "く", "け", "こ"),
  c("さ", "し", "す", "せ", "そ"),
  c("た", "ち", "つ", "て", "と", "っ"),
  c("な", "に", "ぬ", "ね", "の"),
  c("は", "ひ", "ふ", "へ", "ほ"),
  c("ま", "み", "む", "め", "も"),
  c("や", "ゆ", "よ", "ゃ", "ゅ", "ょ"),
  c("ら", "り", "る", "れ", "ろ"),
  c("わ", "を", "ん", "ゎ"))
  res = NULL
  result = sapply(x, function(z) {
    z1 = z%/%10
    if (z1 == 0) z1 = 10
    z2 = z%%10
    res = c(res, char[[z1]][z2])
    })
  return(res)
}

decoding(c(11,32,41,25,46,35,92,33,71,65,52,43,12,44,15,32,14,44,23,94))
decoding(c(25,94,21,91,75,94,03,91,23,61,25,55,65,13,65,13))

暗号化も考えれば,文字と数字の対応ベクトルを作っておけばよい。
2 つの関数に同じデータを書くのは気が進まないので,暗号化か平文化かを引数で指定するようにしよう。

なお,作者の暗号法では,「ぉ」をどのように表すかが不定であることが明らかになったが,「ぉ」は 10 で表すようにしておく。
結果は関数の中で cat によって書き出す仕様にした。

ango = function(x, way=c("decoding", "encoding")) {
  char = c("あ", "い", "う", "え", "お", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
  "か", "き", "く", "け", "こ",
  "さ", "し", "す", "せ", "そ",
  "た", "ち", "つ", "て", "と", "っ",
  "な", "に", "ぬ", "ね", "の",
  "は", "ひ", "ふ", "へ", "ほ",
  "ま", "み", "む", "め", "も",
  "や", "ゆ", "よ", "ゃ", "ゅ", "ょ",
  "ら", "り", "る", "れ", "ろ",
  "わ", "を", "ん", "ゎ")
  num = c(11:19, 10, 21:25, 31:35, 41:46, 51:55, 61:65, 71:75, 81:86, 91:95, "01", "02", "03", "04")
  way = match.arg(way)
  if (way == "decoding") {
    x = as.character(x)
    result = sapply(x, function(z) {
      if (nchar(z) == 1) z = sprintf("0%s", z)
      char[grep(z, num)]
    })
    cat(paste(result, collapse=""))
  } else {
    x = unlist(strsplit(x, ""))
    result = sapply(x, function(z) {
      sprintf("%02i", as.integer(num[grep(z, char)]))
    })
    cat(result)
  }
}

ango(c(11,32,41,25,46,35,92,33,71,65,52,43,12,44,15,32,14,44,23,94))
ango(c(25,94,21,91,75,94,03,91,23,61,25,55,65,13,65,13))

ango("りょうかいしました", way="encoding")
ango("あしたのおひるあいてます", way="e")

ango(c(92, 86, 13, 21, 12, 32, 71, 32, 41), way="d")
ango(c(11, 32, 41, 55, 15, 62, 93, 11, 12, 44, 71, 33))

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

簡単な暗号

2015年05月25日 | ブログラミング

待ち合わせの時間と場所を表しているという
ヒント:2x+3

解答
2x+3=169 で,x=83=0x53 ASCII コードだろう

R なら簡単
intToUtf8 関数だけで答が出る

x = c(169, 147, 161, 173, 145, 161, 67, 159, 149, 67, 171, 133, 153, 133, 161, 169, 133, 159, 67, 137, 147, 161, 173, 151, 161, 173, 67, 139, 141)
intToUtf8((x-3)/2)

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

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

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