場合の数と確率
1 場合の数
問1. 1から100までの整数のうち,3と4の少なくとも一方で割り切れる数は何個あるか。
問2. 200の正の約数は何個あるか,またその総和はいくつか。
2 確率
問題としては,反復試行くらいかな。
問 1個のサイコロを5回続けて投げる反復試行において,1の目がちょうど3回出る確率を求めよ。
場合の数と確率
1 場合の数
問1. 1から100までの整数のうち,3と4の少なくとも一方で割り切れる数は何個あるか。
問2. 200の正の約数は何個あるか,またその総和はいくつか。
lcm(最小公倍数)を使ったりするときは,functs をロードして
(%i1) | load ("functs")$ |
(%i2) | Or(n,a,b):=quotient(n,a)+quotient(n,b)-quotient(n,lcm(a,b))$ |
(%i3) | Or(100,3,4); |
整数の集合を直接作れば
(%i4) | mult(a,n):=setify(makelist(a*i,i,1,quotient(n,3)))$ |
(%i5) | A:mult(3,100); |
(%i6) | B:mult(4,100); |
(%i7) | cardinality(intersection(A,B)); |
(%i8) | cardinality(union(A,B)); |
約数も約数の和も直接つくる関数がある。
(%i9) | cardinality(divisors(200)); |
(%i10) | divsum(200); |
順列,組み合わせは functs にあります,二項係数は縦に書く標記の仕方。
(%i13) | permutation(n,m);combination(n,m);binomial(n,m); |
(%i14) | l:[a,a,a,b,b]; |
(%i15) | permutations(l); |
少し実験をしてみると,factcomb は結合かな。
二項係数の和はすぐには計算してくれないが,simpsum を使えば計算してくれる。
重複組み合わせを作っておく。
(%i19) | 4!;4!!;factcomb(n!/n);factcomb(n!*(n+1)); |
(%i20) | sum(binomial(n,k),k,0,n); |
(%i21) | sum(binomial(n,k),k,0,n),simpsum; |
(%i22) | Homo(n,r):=combination(n+r-1,r)$ |
2 確率
例題をやる前に,試行をMaximaにやらせる方法を紹介しよう。
random(n) で0からn-1の乱数を,random(1.0)で0から1より小さい乱数(実数)を発生する。
使う乱数表が気になるなら,make_random_state (true) とする。
例えばサイコロを何回か振って1の目が出る割合を計算する関数を作って,
この値が1/6に近づく(大数の法則)のをグラフで見てみよう。
(%i23) | make_random_state (true)$ |
(%i24) |
dice(n):=block( s:0, for i:1 thru n do if random(6)+1=1 then s:s+1, return(float(s/n)) )$ |
(%i25) | xx:makelist(i,i,0,5); |
(%i26) | yy:makelist(dice(10^i),i,0,5); |
(%i27) | wxplot2d([1/6,[discrete,xx,yy]],[x,0,5]); |
これの収束は遅いです。
横軸は10の累乗の指数ですから,1回目は1でない目が出て,十万回やっても0.1677だというグラフです。
当たり前ですが,2つのサイコロを振る時は2つのサイコロを区別して確率を求めます。
そうしないと,根元事象が同程度に確からしくなくなるから,という理由で。
でも,これはもっとミクロに原子レベルの話で言うとそうでもなくて,区別しないでやる場合もあるそうです。
つまり,区別するのは実験にあうからというのがもう一つの理由。
じゃあ,実験してみよう,というわけでサイコロ2つの場合です。
区別すれば,両方に1の目が出る確率は1/36,区別しなければ((1,2)と(2,1)を一通りとする)1/21。
グラフよりやっぱり区別しようということになります。
(%i28) |
dice2(n):=block( s:0, for i:1 thru n do if random(6)+1=1 and random(6)+1=1 then s:s+1, return(float(s/n)) )$ |
(%i29) | yy:makelist(dice2(10^i),i,0,5); |
(%i30) | wxplot2d([1/21,1/36,[discrete,xx,yy]],[x,0,5]); |
ここまでやると,モンテカルロ法もやってみたくなるのが人の常。
一辺の長さ1の正方形へランダムに点を打って,それが半径1の円の4分の1の扇形に入る確率は,π/4。
このプログラム,結構苦労しました。括弧とかコンマとか,変数の使い方とか。
x:random(1.0)とやると,グラフをかくときに文句を言うんです。
上と同様に横軸は10の累乗の指数のグラフです。
(%i31) |
mont(n):=block( s:0, for i:1 thru n do( p:random(1.0),q:random(1.0), if p^2+q^2<=1 then s:s+1 ), return(4*float(s/n)) )$ |
(%i32) | yy:makelist(mont(10^i),i,0,5); |
(%i33) | wxplot2d([%pi,[discrete,xx,yy]],[x,0,5]); |
モンテカルロ法をやると,ブュッフォンの針もということになりますか。
モンテカルロは賭博場がある町の名前で,ビュッフォンは人の名前。
間隔 2l の平行線に長さ 2l の針を落とす。
針の中心と一番近い平行線の距離を d (平行線の間隔は2lなのでd<l),
針と平行線とのなす角をθとすると(0≦θ≦π),d<l sinθならば,針と平行線が交わる。
両辺をθで0からπまで積分すると,πd<2l。よって針が平行線に交わる確率はd/lで2/π。
(%i34) |
byu(n):=block( s:0, for i:1 thru n do( p:random(1.0),q:random(float(%pi)), if p<sin(q) then s:s+1), if s=0 then return(0) else return(2*float(n/s)) )$ |
(%i35) | yy:makelist(byu(10^i),i,0,5); |
(%i36) | wxplot2d([%pi,[discrete,xx,yy]],[x,0,5]); |
問題としては,反復試行くらいかな。
問 1個のサイコロを5回続けて投げる反復試行において,1の目がちょうど3回出る確率を求めよ。
(%i37) | load(functs)$ |
(%i38) | Ret(n,r,p):=combination(n,r)*p^r*(1-p)^(n-r)$ |
(%i39) | Ret(5,3,1/6); |
場合の数と確率
1 場合の数
樹形図:tree diagram
和の法則:law of sum かなあ
sum は最も高い最上級という,で summit が頂上
積の法則:law of product かなあ
順列:permutation
組合せ:combination
combiのbiはbinomialのbiか
階乗:factorial
円順列:circular(数珠順列:necklace)
数珠順列は言いにくいし,辛気くさいので,ネックレスパーミュテイションがいいなあ
重複順列:repeated permutation
重複組合せ:repeated combination
二項定理:binomial theorem
二項係数:binomial coefficients
2 確率
試行:trial
事象:event
全事象:whole event
根元事象:elementary event
空事象:empty event
同様に確からしい:eqally likely,equiprobable
確率:probability
ラテン語「証明する(prove)」の意から,じゃあproveはというとラテン語「試す」の意からだって
積事象:product event
和事象:sum event
余事象:complementary event
排反:exclusive
加法定理:addition theorem
独立:independent
反復試行:recurrent trial
期待値:expectasion ラテン語「外に見る, 待ち望む」の意から