2019年4月21日日曜日

[Python vs Julia] 順列・組合せ

以前に,順列・組合せに関する計算をPythonで行う投稿をしました.
今回は,それをJuliaで行ってみます.計算例はREPLで行なったものです.

順列
1, 2, 3の3つの数字の並べ方は $3! = 3 \times 2 \times 1 = 6$ 通りです.
階乗を求めるには factorial() 関数を使用します.
julia> factorial(3)
6

順列
${}_n P _r = \cfrac{n!}{(n - r)!}$
を表示するには,以下のように permutations()  関数を使用します.

1, 2, 3, 4, 5 から3つを選ぶ並べ方は,${}_5 P _3=5 \times 4 \times 3 = 60$ 通りとなります.
何通りあるかだけを知りたい場合には,以下のようにして求めます.
julia> binomial(5, 3) * factorial(3)
60

順列の並びを表示させるには,permutations() 関数を用いて,第一引数に対象とする配列,第二引数に選ぶ数を指定します.
julia> using Combinatorics


julia> seq = (1, 2, 3)
(1, 2, 3)

julia> collect(permutations(seq))
6-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 3, 2]
 [2, 1, 3]
 [2, 3, 1]
 [3, 1, 2]
 [3, 2, 1]
順列,組合せを扱うには,Combinatorics パッケージ*を使用します.
なお,collect は,配列を展開して表示するためのコマンドです.

上記のように特に配列(seq)を定義しなくても実行可能です.

julia> collect(permutations([1, 2, 3]))
6-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 3, 2]
 [2, 1, 3]
 [2, 3, 1]
 [3, 1, 2]
 [3, 2, 1]


julia> collect(permutations([1, 2, 3, 4, 5], 3))
60-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 2]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 2]
 [1, 4, 3]
 [1, 4, 5]
 [1, 5, 2]
 [1, 5, 3]
 [1, 5, 4]
 [2, 1, 3]
 [2, 1, 4]
 [2, 1, 5]
 [2, 3, 1]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 1]
 [2, 4, 3]
 [2, 4, 5]
 ⋮        
 [4, 2, 1]
 [4, 2, 3]
 [4, 2, 5]
 [4, 3, 1]
 [4, 3, 2]
 [4, 3, 5]
 [4, 5, 1]
 [4, 5, 2]
 [4, 5, 3]
 [5, 1, 2]
 [5, 1, 3]
 [5, 1, 4]
 [5, 2, 1]
 [5, 2, 3]
 [5, 2, 4]
 [5, 3, 1]
 [5, 3, 2]
 [5, 3, 4]
 [5, 4, 1]
 [5, 4, 2]
 [5, 4, 3]

組合せ
1, 2, 3, 4, 5 から3つを選ぶ組合せは,${}_5 C _3= \frac{{}_5 P_3}{3!} = 10$ 通りとなります.
何通りあるかを知りたい場合には以下のようにします.
julia> binomial(5, 3)
10


組合せ

${}_n C _r= \cfrac{{}_n P_r}{r!} = \cfrac{n!}{r! (n - r)!}$

を表示するには,以下のように combinations() 関数を用いて,第一引数に対象とする配列,第二引数に選ぶ数を指定します.
julia> seq2 = (1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)

julia> collect(combinations(seq2, 3))
10-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]

順列の例と同様に,配列を事前に定義せずに,第一引数に記載しても同様な結果が得られます.

なお,上記の例のJupyter Notebookファイルは,GitHubDiscreteProbabilityCombinationというファイルで見ることができます.

* Combinatorics パッケージを追加する際には,パッケージモードで " add Combinatorics "と入力します.すると以下のようにインストールが行われます.
(v1.1) pkg> add Combinatorics
 Resolving package versions...
 Installed Combinatorics ─ v0.7.0
 Installed Polynomials ─── v0.5.2
  Updating `~/.julia/environments/v1.1/Project.toml`
  [861a8166] + Combinatorics v0.7.0
  Updating `~/.julia/environments/v1.1/Manifest.toml`
  [861a8166] + Combinatorics v0.7.0
  [f27b6e38] + Polynomials v0.5.2


0 件のコメント :

コメントを投稿