Bash/Octaveで順列・組み合わせ
Bashで計算しようとしたのだが、結論から言うと遅すぎて使えない。
Octaveで計算すると早かったのでそっちを推奨する。
Bash
順列 (nPr)
- bash - Generate combinations of elements with echo - Stack Overflow
- 参考になったが、これはCombinationではなくPermutationだ
#!/bin/bash n=$1 r=$2 elem=$(echo `seq 1 $n` | tr ' ' ',') set="{"${elem}"}" group=$r for ((i=0; i<$group; i++)); do repetition=$set$repetition done bash -c "echo "$repetition""
組み合わせ (nCr)
- ここのやつをコピペして使おう!
Octave
- Octave Online: Free Interface compatible with MATLAB
- まずは 1~100までの縦ベクトルを設定
- nCr (n=100, r=3)の組み合わせを取得、結果は行列になるのでビジュアルでわかりやすい
- 1行ごとに和を求めてみる
- 和が100になるものの数を見る
> A = [1:100]'; > C = nchoosek(A,3); > SUM = sum(C,2) > sum(SUM == 100) ans = 784
-
- 計算結果が見たいので、COMPUTEに行列をとる
- Selecting only a specific number of rows fulfilling a condition
- ちょっとよくわからないけど、これで4列目が100になっているものだけとれる
> COMPUTE = [C SUM]; > idx = ( COMPUTE(:,4)==100 ); > SUMMARIZE = A(idx,:);
結論、行列計算は最高