「諸概念の迷宮(Things got frantic)」用語集

本編で頻繁に使うロジックと関連用語のまとめ。

【数理Computingの基礎】 階乗(factorial)と順列(sequence without repetition)と組み合わせ(combination, choose)について。

まさしく「組合せ爆発Combinatorial explosion)」の語源ですね。

統計言語Rでの計算例

f0<-function(x){factorial(x)}
#グラフのスケール決定
gs_x<-c(0,7)
gs_y<-c(0,1000)
#タイトル定義
Main_title<-c("Combinatorial explosion")
x_title<-c("X")
y_title<-c("Y=X!")
#グラフ描画
plot(f0,xlim=gs_x,ylim=gs_y,type="l", main=Main_title,xlab=x_title,ylab=y_title)

f:id:ochimusha01:20190606203517p:plain
例えばマクローリン展開などで使われます。

階乗(factorial)
組み合わせの数やポアソン分布など、確率にまつわる様々な場面で登場する数。数学において非負整数 n のそれは1 から n までのすべての整数の積と定義されている。ちなみに0!=1。
統計言語Rでの汎用計算機代数ソフトウェアYacasによる計算例

library(Ryacas)
#統計言語Rでの汎用計算機代数ソフトウェアYacasによる計算例 
yacas("5!")
expression(120)
#Rではガンマ関数を使ってn! = gamma(n+1)と計算する。さらに同じ計算をするfactorial(n)も追加された。
n<-5
gamma(n+1)
[1] 120
factorial(n)
[1] 120

#大きな数の階乗を求めようとするとエラーが出る。Rでは階乗を計算するときに、Γ函数と呼ばれる函数を用いているのだが、このエラーは、あまりにも数が大きすぎてΓ函数の計算範囲を超えていることを示している。

factorial(171)
[1] Inf
警告メッセージ:
factorial(171) で: 'gammafn' 中の値が範囲を超えています

#yacasもほぼ同じ反応だが警告なし。
yacas("171!")
expression(Inf)

順列(英sequence without repetition、仏arrangement、nPr=n!/(n-r)!)

異なるn個の中から異なるr個を取り出して1列に並べる数の事。記号Pで表す。例えば5人(A、B、C、D、E)の中から2人を並べる場合を考えると並べ方はAB、BA、AC、CA、DE、EDで合計は20通りになる。ABとBAを違うものとして考えるのがポイント。
統計言語Rでの汎用計算機代数ソフトウェアYacasによる計算例

library(Ryacas)
#nPr=n!/(n-r)!
yacas("(5!)/((5-2)!)")
expression(20)

#Rには順列を直接計算する函数はないので例えば相乗の函数prodを用いる。nPrはprod((n-r+1):n)と計算するが、この方法はr=0のときうまくいかない。
n<-5; r<-2
prod((n-r+1):n)
[1] 20
#なおRの場合、e1071というパッケージに含まれるpermutationsという函数は、引数にとった数までの順列のパターンをすべて表示してくれる。例えばpermutations(3)とすれば、1から3までの数をすべて1回ずつ使った場合、どういう並べ方があるかを教えてくれる。
library(e1071)
permutations(3)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 1 3
[3,] 2 3 1
[4,] 1 3 2
[5,] 3 1 2
[6,] 3 2 1

組み合わせcombination, choose、nCr=nPr/r!

異なるn個の中から異なるr個とる組み合わせの数の事。記号Cで表す。例えば5人(A、B、C、D、E)の中から2人を選ぶ組み合わせを考えると{AB}、{CD}、{AC}…のようになり合計10通り。{AB}と{BA}のチームを同じと考えるので順列の総数の半分となる。

#統計言語Rでの汎用計算機代数ソフトウェアYacasによる計算例 
library(Ryacas)
#yacasでは組合せnCr=nPr/r!はBin(n,r) 。bin はbinomial coeffients(2項係数)から来ている。これは2項係数の係数がnCrだからである。
yacas("Bin(5,2)")
expression(10)

#Rで組み合わせの数を求めるには函数chooseを用いる。 nCrを求めたければchoose(n, r)となる。
n<-5; r<-2
choose(n, r)
[1] 10
#なおRではcombnという函数を用いると、ありうる組み合わせのすべてを行列の形で表示させることができる。
people <- c("A", "B", "C", "D")
combn(people, 3)
[,1] [,2] [,3] [,4]
[1,] "A" "A" "A" "B"
[2,] "B" "B" "C" "C"
[3,] "C" "D" "D" "D"

尤度計算等では対数値が求まれば良いので、対数値を与える関数 lgamma(n+1)lchoose(n, r) が用意されています。これらは対数値を直接計算するもので、後から対数をとっているわけではありません。

#例えば choose(1000000,1000) がどれくらいの大きさかを知りたければ、次のようにする。つまり、百万人の中から千人を抽出する可能性は 1.507833e+3432 通りある。
x <- lchoose(1000000,1000)/log(10) # 自然対数値を常用対数値に変換
x
[1] 3432.178
10^(x-3432) # 仮数部を計算
[1] 1.507833

以下続報…