17.4.24 原子の崩壊

もう少しこみいった繰り返しの例として,放射性物質が崩壊する割合の計算を考えてみよう. テクネチウム99mは,原子1個あたり 1 秒間に .0000320362394891 個の割合で崩壊する.つまり,この割合をrとすると,N個のテクネチウム99mは1秒後で Nr 個が崩壊して N(1-r) 個に減り,2秒後には N(1-r)^2 個に,3秒後には N(1-r)^3 個に減っている.

そこで,x秒後に残っているテクネチウム99mの割合を求める関数 tc99m を定義してみよう.(ただしxは整数とする.)まず,1秒間に崩壊する割合を変数 disintegration_per_sec として定義しておく.

# let disintegration_per_sec = 0.0000320362394891;; return2 val disintegration_per_sec : float = 3.20362394891e-05

例えば100秒後の割合は次のように考えることができます.

100までの和と同じように,最後を除いて同じ形をしているので,これを次のように書くことができます.

ここまでくれば,あとは「n秒後の割合」をtc99m(n)という関数として定義することができます.

# let rec tc99m x = return2 if x=0 then 1.0 return2 else (1.0-.disintegration_per_sec)*.(tc99m (x-1)) ;; return2 val tc99m : int -> float = <fun>

割合は小数点数であり,秒数は整数であることに注意しましょう.前に見たようにOcamlでは小数の計算には *.-. のようにピリオドの付いた演算子を使い,整数の計算と区別しなければなりません.また,整数の 1 と 小数の 1.0 も区別が必要です.

さあ,これでテクネチウムの残る割合が計算できます.1時間後,つまり 60*60 秒後の割合はいくらでしょうか.

# tc99m (60*60) ;; return2 - : float = 0.891069983611