裏 RjpWiki

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

破局噴火の発生確率

2017年01月13日 | 統計学

http://www.nikkei-science.com/?p=52031

> 本誌に掲載した破局噴火の記事がウェブ上で話題になっています。破局噴火が国内のいずれかの火山で今後100年間に起きる確率は約1%であることを紹介したうえで,「期間を100倍に延ばすと1万年間で確率100%になる」としたところが数学的におかしいとの指摘です。破局噴火は膨大な量のマグマが放出される非常に大規模な噴火です。もし今後100年間起きなかった場合,100年分,地下深部から新たなマグマが供給されるので,その先の100年間に破局噴火が起きる確率は1%より高くなります。さらにその先はもっと高くなります。つまり破局噴火の発生確率はサイコロの特定の目が出る確率などとは違って,長い時間の発生確率を考えるほど上がり,その上がり方も急になっていきます。日本列島の火山活動の歴史を考えると,次の破局噴火は1万年よりもかなり前の時期に確実に起こるとみられています。「期間を100倍に延ばすと確率100%」というのは,いわば非常に甘い見積もりなわけです

確率というのは「在る事象が起きる確からしさ」で0〜1の値で表されるものです。

件の記事について言えば,

> 「期間を100倍に延ばすと確率100%」というのは,いわば非常に甘い見積もりなわけです

というのは,「期間を200倍に延ばすと確率は200%になる」ということをいっているわけで,そんなばかなということにだれも気づくでしょう。

 

ここでいっている「確率」は「期待値」に相当するものでしょう。

つまり,「今後100年間に起きる確率は約1%」というのは,「今後100年間に起きる確率は約1/100回起きる」

比例で言えば,「今後10000年間に起きる確率は約(1/100)×(10000/100)=1回起きる」つまり,1万年あたりは1回起きるということ。

20000年には2回ということ。

 

確率と期待値を混同してはいけない。

というか,「100年間に起きる確率は約1%」という言い方自体,確率論とは異なるものだと言うこと。

少なくとも,ここで言っている「確率」と,「サイコロを振って1の目が出る確率は1/6」というときの確率は全く違うと言うこと。

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

単調増加で単調減少な数

2017年01月13日 | ブログラミング

単調増加で単調減少な数
2017年1月13日(金)10:00AMが締め切りなので,その 1 分後に投稿されるように予約

【概要】
たとえば,179 のような数のことを「10 進数で狭義単調増加な数」と呼ぶことにします。
つまり,各桁を見ると狭義単調増加列になっています。

逆に,8631 のような数のことを「10 進数で狭義単調減少な数」と呼ぶことにします。
つまり,各桁を見ると狭義単調減少列になっています。

さて,a 進数で狭義単調増加,b 進数で狭義単調減少な数のうち,もっとも大きな数を求めるプログラムを書いてください。

【入出力】
入力は
5 6
こんな感じで標準入力から来ます。
スペース区切りで2つの10進数が並んでいます。
スペースの前が先程の a,つまりa進数で表記すると狭義単調増加になります。
スペースの後は先程の b,つまりb進数で表記すると狭義単調減少になります。

出力は,条件を満たす値を 10 進数で。先ほどの入力なら,19 を出力すると正解です。

【例】
入力      出力    a進数    b進数
5    6    19    34    31
6    11    101    245    92
4    3    7    13    21

【補足】
• 不正な入力に対処する必要はありません。
• 長さ 1 でも狭義単調増加列になります。
• a も b も,2 以上 16 以下です。

==========================

bc = function(p) { # 要素の組み合わせを行列として求める
    retval = matrix(0, nrow = 2^p, ncol = p)
    for (n in 1:p) {
        retval[, n] = rep(c(rep(0, (2^p/2^n)), rep(1, (2^p/2^n))), length = 2^p)
    }
    retval
}

is.ok = function(u, b) { # 10 進数の u が,「「b 進数で狭義単調減少な数」か
    v = NULL
    repeat {
        v = c(v, u %% b)
        u = u %/% b
        if (u == 0) break
    }
    all(diff(v) > 0)
}

is.ok = function(u, b) { # 順次判定すれば,効率がよいので,こちらを使う
    prev = u %% b
    u = u %/% b
    repeat {
        if (u == 0) {
            return(TRUE)
        }
        v = u %% b
        if (prev >= v) { # 狭義減少になっていない桁があると FALSE
            return(FALSE)
        }
        u = u %/% b
        prev = v
    }
}

f = function(a, b) {
    mx.b = sum((b-1):1 * b ^ (0:(b-2))) # 「b 進数で狭義単調減少な数」の最大値
    w = a ^ (0:(a-2)) # a 進数の各桁の重み(要素1が最下位桁であるように逆順に保存)
    mx =  0 # 求める数(最大値)
    for (least in (a-1):1) { # 「a 進数で狭義単調増加な数」
        x = least:1 # 最下位桁が least,最上位桁が 1
        if (length(x) == 1) {
            y = 1
        } else { # 可能なすべての狭義単調増加な数の各桁
            y = apply(cbind(1, bc(least-1)), 1, function(i) x[i==1])
        }
        for (i in 1:length(y)) {
            z = y[[i]]
            u = sum(z * w[1:length(z)]) # 10 進数に変換
            if (length(z) == 1 && u > mx && is.ok(u, b)) { #「b 進数で狭義単調減少な数」か
                mx = u # 今までで一番大きければ記録
            } else if (mx.b >= u && u > mx && is.ok(u, b)) {
                mx = u
            }
        }
    }
    cat(mx) # 結果を表示
}

system.time(f(5, 6)) # 19
system.time(f(15, 16)) # 15571062
system.time(f(13, 16)) # 16558437
system.time(f(2, 16)) # 1
system.time(f(2, 2)) # 1
system.time(f(3, 2)) # 2
system.time(f(7, 11)) # 1266
system.time(f(11, 7)) # 2276
system.time(f(11, 10)) # 3210  7.252 sec.
system.time(f(16, 2)) # 2
system.time(f(16, 15)) # 35806
system.time(f(16, 16)) # 15
system.time(f(16, 13)) # 363743

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

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

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