順列・組み合わせの計算方法

[OS]ALL
[リリース] 6.12, 8.1, 8.2
[キーワード] DATA STEP, PERM, COMB, GAMMA

[質問]

初等確率論における「順列(permutation)」および「組み合わせ(combination)」を計算する良い方法はありますか。

[回答]

SAS System 8以降では、それぞれPERM関数、COMB関数を用いることにより、簡単に計算できます。

目的 関数の指定方法
nPr PERM(n,r)
nCr COMB(n,r)

SAS 6.12(またはそれ以前のバージョン)をご利用の場合には、GAMMA関数を用いる方法が簡便です。具体的には、Γ(x)=(x-1)!」という関係式を利用します。

data _null_;
  n=12;
  r=5;
  p=gamma(n+1)/gamma(n-r+1);             /*nPrをp に代入する*/
  c=gamma(n+1)/gamma(r+1)/gamma(n-r+1);  /*nCrをc に代入する*/
  put p= c=;                             /*pは95040 、cは792*/
run;

なお、nが大きな場合には、以下のようにLGAMMA関数を利用する必要がありま
す。これは、GAMMA関数に大きな引数を与えると、オーバーフローが発生する
ためです。

data test;
  n=200;
  r=3;
  p=exp(lgamma(n+1)-lgamma(n-r+1));              /* nPr */
  c=exp(lgamma(n+1)-lgamma(r+1)-lgamma(n-r+1));  /* nCr */
run;