\( \DeclareMathOperator{\abs}{abs} \newcommand{\ensuremath}[1]{\mbox{$#1$}} \)

場合の数と確率

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

問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);
\[(\%o3) 50\]

整数の集合を直接作れば

(%i4) mult(a,n):=setify(makelist(a*i,i,1,quotient(n,3)))$
(%i5) A:mult(3,100);
\[\tag{A}\label{A}{3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99}\]
(%i6) B:mult(4,100);
\[\tag{B}\label{B}{4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132}\]
(%i7) cardinality(intersection(A,B));
\[(\%o7) 8\]
(%i8) cardinality(union(A,B));
\[(\%o8) 58\]

約数も約数の和も直接つくる関数がある。

(%i9) cardinality(divisors(200));
\[(\%o9) 12\]
(%i10) divsum(200);
\[(\%o10) 465\]

順列,組み合わせは functs にあります,二項係数は縦に書く標記の仕方。

(%i13) permutation(n,m);combination(n,m);binomial(n,m);
\[(\%o11) m! \begin{pmatrix}n\\ m\end{pmatrix} \] \[(\%o12) \begin{pmatrix}n\\ m\end{pmatrix} \] \[(\%o13) \begin{pmatrix}n\\ m\end{pmatrix} \]
(%i14) l:[a,a,a,b,b];
\[\tag{l}\label{l}[a,a,a,b,b]\]
(%i15) permutations(l);
\[(\%o15)\]

少し実験をしてみると,factcomb は結合かな。
二項係数の和はすぐには計算してくれないが,simpsum を使えば計算してくれる。
重複組み合わせを作っておく。

(%i19) 4!;4!!;factcomb(n!/n);factcomb(n!*(n+1));
\[(\%o16) 24\] \[(\%o17) 8\] \[(\%o18) \left( n-1\right) !\] \[(\%o19) \left( n+1\right) !\]
(%i20) sum(binomial(n,k),k,0,n);
\[(\%o20) \sum_{k=0}^{n}{\left. \begin{pmatrix}n\\ k\end{pmatrix} \right.}\]
(%i21) sum(binomial(n,k),k,0,n),simpsum;
\[(\%o21)2^n\]
(%i22) Homo(n,r):=combination(n+r-1,r)$

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 ラテン語「外に見る, 待ち望む」の意から

例題をやる前に,試行を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);
\[\tag{xx}\label{xx}[0,1,2,3,4,5]\]
(%i26) yy:makelist(dice(10^i),i,0,5);
\[\tag{yy}\label{yy}[0.0,0.2,0.22,0.182,0.1679,0.16499]\]
(%i27) wxplot2d([1/6,[discrete,xx,yy]],[x,0,5]);
\[(\%t27) \]  (Graphics)
\[(\%o27) \]

これの収束は遅いです。
横軸は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);
\[[0.0,0.0,0.03,0.026,0.0265,0.02702]\]
(%i30) wxplot2d([1/21,1/36,[discrete,xx,yy]],[x,0,5]);
\[(\%t30) \]  (Graphics)
\[(\%o30) \]

ここまでやると,モンテカルロ法もやってみたくなるのが人の常。
一辺の長さ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);
\[[0.0,3.6,3.24,3.18,3.134,3.15468]\]
(%i33) wxplot2d([%pi,[discrete,xx,yy]],[x,0,5]);
\[(\%t33) \]  (Graphics)
\[(\%o33) \]

モンテカルロ法をやると,ブュッフォンの針もということになりますか。
モンテカルロは賭博場がある町の名前で,ビュッフォンは人の名前。
間隔 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);
\[[2.0,2.5,3.448275862068965,3.194888178913738,3.114779629341224,3.151591553734636]\]
(%i36) wxplot2d([%pi,[discrete,xx,yy]],[x,0,5]);
\[(\%t36) \]  (Graphics)
\[(\%o36) \]

問題としては,反復試行くらいかな。
問 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);
\[(\%o39) \frac{125}{3888}\]
Created with wxMaxima. inserted by FC2 system