Scilabで同じものを含む数珠順列の全パターン

Scilabで同じものを含む円順列の全パターンでは円順列の全パターンを出力しました。今回は数珠順列に関して同じことを行います。スクリプトの変更点はほんの少しです。

【例題】
白玉3個、黒玉2個、赤玉2個の合計7個で数珠を作るとき、その方法は何通りあるか。

【解答】
18通り

Scilabスクリプト


clear;

// *** 問題設定 ***
// 白玉3つ、黒玉2つ、赤玉2つ
X = [3, 3, 3, 2, 2, 1, 1];

// 全順列の計算
Y = perms(X)';
// 重複を削除
Y = unique(Y,"c");

// *** 回転で一致するものを削除 ***
[nr, nc]=size(Y);
Z = []; // 最終的なパターンの格納先
while nc > 1
Y1 = Y(:,1); // 最初のパターンについて調べる
Z = [Z, Y1]; // 最初のパターンは絶対に被っていない
Y = Y(:,2:$); // 残りのパターン
// *** 最初のパターンを回転する ***
Yrot = []; // 回転したパターンの格納先
for i=1:nr
Y1 = [Y1(2:$); Y1(1)];
Yrot = [Yrot, Y1];
end
Yrot = [Yrot, flipdim(Yrot,1)];
Yrot = unique(Yrot,"c"); // 回転したパターンから重複を削除
Y = setdiff(Y, Yrot, "c"); // 残りから回転と一致するものを削除
[nr, nc] = size(Y); // 残り何パターンか
end
Z = [Z, Y];

// 何通りあるか確認
[nr, nc]=size(Z);
Z
nc

// *** 全パターンをファイルに書き出し ***
fprintfMat("juzujunretsu001.txt",Z', "%1.0f");


前回とほぼ同一ですが、回転後のすべてのパターンを含む行列Yrotを更に反転させてからsetdiffします。反転にはflipdim関数を利用します。

結果


重複円順列・重複数珠順列についての公式から求められたパターンは18通りで、今回のScilabスクリプトで出力されたパターンの数と一致します。

関連エントリ




参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 順列・組み合わせ 確率論 

Scilabで同じものを含む円順列の全パターン

Scilabで同じものを含む順列の全パターンでは、Scilabを用いて順列の結果として得られるすべてのパターンの書き出しを行いました。今回は、普通の順列から円順列へと拡張を行います。

【例題】
青玉4つ、赤玉2つ、白玉2つがある。すべての玉を円形に並べる方法は何通りあるか。

【解答】
山田一男重複円順列・重複数珠順列についての公式を用いて
\begin{equation}
\frac{1}{8}\left(\frac{4!}{1!1!2!}+\frac{8!}{2!2!4!} \right) = 54 通り
\end{equation}

Scilabスクリプト


clear;

// *** 問題設定 ***
// 青玉4つ、赤玉2つ、白玉2つ
X = [3, 3, 3, 3, 2, 2, 1, 1];

// 全順列の計算
Y = perms(X)';
// 重複を削除
Y = unique(Y,"c");

// *** 回転で一致するものを削除 ***
[nr, nc]=size(Y);
Z = []; // 最終的なパターンの格納先
while nc > 1
Y1 = Y(:,1); // 最初のパターンについて調べる
Z = [Z, Y1]; // 最初のパターンは絶対に被っていない
Y = Y(:,2:$); // 残りのパターン
// *** 最初のパターンを回転する ***
Yrot = []; // 回転したパターンの格納先
for i=1:nr
Y1 = [Y1(2:$); Y1(1)];
Yrot = [Yrot, Y1];
end
Yrot = unique(Yrot,"c"); // 回転したパターンから重複を削除
Y = setdiff(Y, Yrot, "c"); // 残りから回転と一致するものを削除
[nr, nc] = size(Y); // 残り何パターンか
end
Z = [Z, Y];

// 何通りあるか確認
[nr, nc]=size(Z);
Z
nc

// *** 全パターンをファイルに書き出し ***
fprintfMat("enjunretsu001.txt",Z', "%1.0f");


前回と同様にまず全順列を作って重複する分をuniqueで削除します。円順列は開店したものも同じパターンと考えるので、これも削除する必要があります。そこで最初のパターンを回転させたパターンをすべて含む行列を作ります。
作った回転後のパターンは、最終的に削除する必要があります。uniqueだとこれらが残ってしまうので、代わりにsetdiff関数を使います。この関数はScilab 6.0.2からこの用途に使えるようになりました。

関連エントリ




参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 順列・組み合わせ 確率論 

Scilabで同じものを含む順列の全パターン

Scilabで重複円順列などでは、順列で何通り作れるのかをScilabで計算しました。これだけでは何パターンありえるのかは分かりますが、具体的にどのようなパターンがあり得るのかまでは分かりません。そこで今回はScilabを用いて、同じものを含む順列の全パターンの出力を行います。

【例題】
青玉3つ、赤玉2つ、白玉1つがある。すべての玉を1列に並べる方法は何通りあるか。

【解答】
\begin{equation}
\frac{6!}{3!2!1!}=60 通り
\end{equation}

Scilabスクリプト


clear;

// *** 問題設定 ***
// 青玉3つ、赤玉2つ、白玉1つ
X = [1, 1, 1, 2, 2, 3];

// 全順列の計算
Y = perms(X)';
// 重複を削除
Z = unique(Y,"c")

// 何通りあるか確認
[nr, nc]=size(Z);
nc

// *** 全パターンをファイルに書き出し ***
fprintfMat("junretsu001.txt",Z', "%1.0f");


perms関数は与えられたベクトルの要素をすべて使った全順列を返します。このままでは同じパターンが複数回出てきます。
そこでunique関数を使います。これは与えられた引数の中でユニークなものを返します。

結果


結果として得られる全パターンを格納している変数Z(を転置したもの)が以下です。1="青玉", 2="赤玉", 3="白玉"と読み替えるとすべての並べ方のパターンになります。例えば1行目の111223は青青青赤赤白という並びを意味しています。全部で60通りになっていることが確認できます。

1 1 1 2 2 3 
1 1 1 2 3 2
1 1 1 3 2 2
1 1 2 1 2 3
1 1 2 1 3 2
1 1 2 2 1 3
1 1 2 2 3 1
1 1 2 3 1 2
1 1 2 3 2 1
1 1 3 1 2 2
1 1 3 2 1 2
1 1 3 2 2 1
1 2 1 1 2 3
1 2 1 1 3 2
1 2 1 2 1 3
1 2 1 2 3 1
1 2 1 3 1 2
1 2 1 3 2 1
1 2 2 1 1 3
1 2 2 1 3 1
1 2 2 3 1 1
1 2 3 1 1 2
1 2 3 1 2 1
1 2 3 2 1 1
1 3 1 1 2 2
1 3 1 2 1 2
1 3 1 2 2 1
1 3 2 1 1 2
1 3 2 1 2 1
1 3 2 2 1 1
2 1 1 1 2 3
2 1 1 1 3 2
2 1 1 2 1 3
2 1 1 2 3 1
2 1 1 3 1 2
2 1 1 3 2 1
2 1 2 1 1 3
2 1 2 1 3 1
2 1 2 3 1 1
2 1 3 1 1 2
2 1 3 1 2 1
2 1 3 2 1 1
2 2 1 1 1 3
2 2 1 1 3 1
2 2 1 3 1 1
2 2 3 1 1 1
2 3 1 1 1 2
2 3 1 1 2 1
2 3 1 2 1 1
2 3 2 1 1 1
3 1 1 1 2 2
3 1 1 2 1 2
3 1 1 2 2 1
3 1 2 1 1 2
3 1 2 1 2 1
3 1 2 2 1 1
3 2 1 1 1 2
3 2 1 1 2 1
3 2 1 2 1 1
3 2 2 1 1 1


関連エントリ




参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 順列・組み合わせ 確率論 

Scilabで重複数珠順列

前々回前回に続いて、重複円順列・重複数珠順列についての公式をScilabで計算してみます。

今回は重複数珠順列の計算を行います。
n種類の中から重複を許してr個で数珠を作るとき、その総数は
\begin{eqnarray*}
&&rが奇数のとき, \frac{1}{2r}\left( \sum_{k=1}^{r} n^{(r,k)} + r \cdot n^{\frac{r+1}{2}} \right) \\
&&rが偶数のとき, \frac{1}{2r}\left( \sum_{k=1}^{r} n^{(r,k)} + \frac{r}{2}n^{\frac{r}{2}+1} + \frac{r}{2}n^{\frac{r}{2}} \right)
\end{eqnarray*}
である。記号 (a, b) は整数 a, b の最大公約数を表すものとする。



この公式に関しては例題が設定されていません。なので答え合わせはしていないのですがScilabスクリプトを載せます。

clear;

// *** 入力パラメータ ***
n = 3;
r = 10;

// *** 最大公約数の和 ***
N = 0;
for k=1:r
N = N + n ^ gcd([r, k]);
end

// *** 答え ***
if modulo(r, 2) == 0 then
// r が偶数の時
(N + (r / 2) * (n ^ ((r/2) + 1)) + (r / 2) * (n ^ (r / 2))) / (2 * r)
else
// r が奇数の時
(N + r * (n ^ ((r + 1) / 2))) / (2 * r)
end


関連エントリ




参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 順列・組み合わせ 確率論 

Scilabで同じものを含む円順列

前回に続いて、重複円順列・重複数珠順列についての公式をScilabで計算してみます。

今回は同じものを含む円順列の計算を行います。
玉 P1 が n1 個、玉 P2が n2 個、…、玉 Pm が nm 個の合計 n1 + n2 + … + nm = n 個を円形に並べる並べ方の総数は
\begin{equation}
\frac{1}{n}\left( \sum_{\begin{array}{c} k=1 \\ \frac{n_{1}(n,k)}{n}, \frac{n_{2}(n,k)}{n},\cdots ,\frac{n_{m}(n,k)}{n}は自然数 \end{array}}^{n} \frac{(n, k)!}{\frac{n_{1}(n,k)}{n}!\frac{n_{2}(n,k)}{n}!\cdots\frac{n_{m}(n,k)}{n}!}\right)
\end{equation}
である。記号 (a, b) は整数 a, b の最大公約数を表すものとする。


上記の公式は、並べ替えるものが m 種類存在する場合の公式ですが、任意の m に対応できるスクリプトを書くのは大変だし、あまり使い勝手もよくありません。(以前Scilabでおもりの吊り下げの計算をした時には、任意の n 個のおもりのつり合いの計算ができるようにスクリプトを書きましたが、使い勝手は良くなかった。)
また重複円順列・重複数珠順列についてのPDFでも m = 3 のときの公式を改めて書き直しています。

白玉p個, 赤玉q個, 青玉r個を円形に並べる並べ方の総数はp+q+r=nとおくと,
\begin{equation}
\frac{1}{n}\left(\sum_{\begin{array}{c} k=1 \\
\frac{p(n,k)}{n}, \frac{q(n,k)}{n}, \frac{r(n,k)}{n}は自然数
\end{array}
}^{n}
\frac{(n,k)!}{\frac{p(n,k)}{n}!\frac{q(n,k)}{n}!\frac{r(n,k)}{n}!} \right)
\end{equation}
である。記号 (a, b) は整数 a, b の最大公約数を表すものとする。


例題
白玉2個,赤玉2個, 青玉4個がある。これらを机の上に円形に並べる方法は何通りあるか。

答え
\begin{equation}
\frac{1}{8} \sum_{k=4, 8}\frac{(8,k)!}{\frac{2(8,k)}{8}!\frac{2(8,k)}{8}!\frac{4(8,k)}{8}!}
= \frac{1}{8}\left(\frac{4!}{1!1!2!} + \frac{8!}{2!2!4!} \right)
= 54
\end{equation}
を得る。


これをScilabのスクリプトにしたのが以下です。

clear;

// *** 入力パラメータ ***
p = 2;
q = 2;
r = 4;

n = p + q + r;

// *** 自然数か確認する関数 ***
function y = isnatural(x)
y = x == int(x) & x > 0
endfunction

// *** 最大公約数の和 ***
N = 0;
for k=1:n
x1 = gcd([n, k]);
p2 = p * gcd([n, k]) / n;
q2 = q * gcd([n, k]) / n;
r2 = r * gcd([n, k]) / n;
if isnatural(p2) & isnatural(q2) & isnatural(r2) then
N = N + factorial(double(x1)) / (factorial(double(p2)) * factorial(double(q2)) * factorial(double(r2)));
end
end

// *** 答え ***
N / n


このScilabスクリプトには注意点が2か所あります。

ひとつ目は、ある数が自然数か確認する関数について。
// *** 自然数か確認する関数 ***
function y = isnatural(x)
y = x == int(x) & x > 0
endfunction

Scilabは表立って変数の型を宣言する言語ではなく、勝手にいい感じに型を決めてくれます。
おそらく計算で用いられている方は浮動小数で、上記の関数は自然数っぽい浮動小数点数を入力されると true を返します。

ついでに書いておくと、自然数か確認する関数はベクトルとか行列とかを入れてもちゃんと動いてるっぽいです。
--> x = [1, 1.5 2; %pi, 0, -2; 1.00000, 1.00001, -2.3]
x =

1. 1.5 2.
3.1415927 0. -2.
1. 1.00001 -2.3

--> isnatural(x)
ans =

T F T
F F F
T F F


ふたつ目の注意点は、階乗を計算する関数 factorial が、階乗を計算する関数のくせに(内部的に)int型(であると思われる)入力を与えるとエラーを吐く点です。なので factorial に引数を渡すときは double を使って明示的に浮動小数点数にしておく必要がある模様です。

関連エントリ




参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 順列・組み合わせ 確率論 

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度モンテカルロ解析常微分方程式odeトランジスタインターフェースDOSPDS5022定電流スイッチング回路確率論半導体分散関係シェルスクリプト乱数レベルシフトHP6632Aトランジスタ技術温度解析可変抵抗I2CブレッドボードR6452A反強磁性数値積分バンド構造バンドギャップセミナー絶縁偏微分方程式非線形方程式ソルバPWscf熱設計シュミットトリガLED三端子レギュレータ順列・組み合わせLM358GW近似カオスマフィンティン半径ISO-I2CフォトカプラA/Dコンバータ発振回路74HC4053数値微分直流動作点解析サーボPC817CアナログスイッチUSB補間TL431カレントミラーbzqltyVESTA電子負荷イジング模型LDA開発環境ブラべ格子FFT量子力学2ちゃんねるチョッパアンプ単振り子ポケモンGOスーパーリーグ標準ロジックQuantumESPRESSO基本並進ベクトルパラメトリック解析アセンブラBSchトレーナーバトル抵抗Maximaラプラス方程式失敗談状態方程式SMPキュリー温度スイッチト・キャパシタ位相図繰り返し熱伝導gfortranコバルトewidthTLP621不規則合金ランダムウォーク六方最密充填構造FET最適化相対論スピン軌道相互作用QSGWQuantum_ESPRESSOGGAVCA仮想結晶近似スレーターポーリング曲線cygwinZnOシュレディンガー方程式フォノンNE555詰め回路条件分岐固有値問題最大値ダイヤモンドガイガー管TLP552マントル自動計測データロガーQNAPUPSCIF井戸型ポテンシャルMCUxcrysdenゼーベック係数格子比熱最小値LM555フェルミ面fsolve過渡解析差し込みグラフ三角波起電力スーパーセル第一原理計算ブラウン運動FXA-7020ZROpenMPTLP521Ubuntuハーフメタル熱力学Writer509ubuntu平均場近似テスタawkLMC662フィルタMAS830LCK1026トランスPIC16F785AACircuit負帰還安定性ハイパーリーグCapSenseナイキスト線図ノコギリ波2SC1815EAGLEPvPP-10OPA2277MBEPGA入出力固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型磁気モーメント電荷密度重積分不純物問題擬ポテンシャル状態図cif2cellPWguiSIC二相共存リジッドバンド模型edeltquantumESPRESSOスワップ領域ルチル構造ウルツ鉱構造BaO岩塩構造ヒストグラム確率論マテリアルデザインフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデル文字列不規則局所モーメント陰解法熱拡散方程式HiLAPWCrank-Nicolson法連立一次方程式specx.fifort境界条件両対数グラフ片対数グラフGimp円周率ヒストグラムシンボル線種グラフの分割軸ラベル凡例トラックボール

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ