なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

Bash/Octaveで順列・組み合わせ

Bashで計算しようとしたのだが、結論から言うと遅すぎて使えない。

Octaveで計算すると早かったのでそっちを推奨する。

Bash

順列 (nPr)

#!/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 = [C SUM];
> idx = ( COMPUTE(:,4)==100 );
> SUMMARIZE = A(idx,:);

結論、行列計算は最高