-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

組合せ
[tex:{}_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