同じものを含む円順列 その4
最後に一般化して,どんな場合でもパッと確認できるように,コード化します。
一般化
友田 勝久さんがまとめているものを参考にしました。
http://www.osaka-kyoiku.ac.jp/~tomodak/report/junretsu2012.pdf
$S_1,,S_2,,\cdots,,S_m$の$m$種類の球がそれぞれ$n_1,,n_2,,\cdots,, n_m$個の球が作る円順列の総数を $f(n_1,,\cdots,,n_m)$と表すと,
$$f(n_1,,\cdots,,n_m)=\frac1N\sum_{k|l}\phi(k)\frac{\left(\frac{N}k\right)!}{\left(\frac{n_1}k\right)!\left(\frac{n_2}k\right)!\cdots\left(\frac{n_m}k\right)!}$$
- $l=GCM(n_1,,\cdots,,n_m)$,$N=n_1+n_2+\cdots+n_m$です。
- $\sum_{k|l}$は$l$の正の約数である$k$で和をとります。
- $\phi(k)$はオイラー(Euler)の関数で, $k$以下で$k$と互いに素な自然数の個数を返します。
コード化
Jupiter notebookでWolfram Engineが使えるようになったので,Mathematicaで作ってみます。数学関数がたくさんあるので,パッとできそうです。
f[a_]:=1/(Total[a]) Sum[EulerPhi[k] Multinomial@@(a/k),{k,Divisors@(GCD@@a)}]
a
はリストです。このように関数を定義すると,前回までに紹介した同じものを含む円順列は次のように求められます。
f[{4,4}]
f[{4,6}]
f[{2,3,4}]
f[{3,3,3}]
こんな感じに次々と求めることができます!

これで,生徒からどんな同じものを含む円順列の質問がきても大丈夫です!