唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Derangement

Derangementは\(1, 2, \dots, n - 1, n\)を要素とする順列のうち、すべての\(i\)番目の要素が\(i\)と等しくない順列のこと(不動点の個数が\(0\))

たとえば\(1, 2, 3\)を要素とする順列は以下の6通りのものがあります(不動点に下線を引いています)

  • \(\underline 1, \underline 2, \underline 3\)
  • \(\underline 1, 3, 2\)
  • \(2, 1, \underline 3\)
  • \(2, 3, 1\)
  • \(3, 1, 2\)
  • \(3, \underline 2, 1\)

この内、Derangementは以下の2通りになります

  • \(2, 3, 1\)
  • \(3, 1, 2\)

日本語では攪乱順列とか完全順列とか言うらしいです
この個数を求めるのはモンモール問題と呼ばれるらしくて(?)、Derangementの個数はモンモール数とかsubfactorial \(!n\)とか呼ばれるらしいです

以下ではDerangementの個数とか確率とかを求めていきます

解法1 - 包除原理

\(i\)番目の要素が\(i\)でない順列の集合を\(A_i\)とします
この時subfactorialは\(!n = \Biggl|\bigcap_i^n A_i\Biggr|\)と表すことができる

和集合や積集合の要素数は包除原理を使うと簡単に求めることができる

包除原理

二つの集合の和集合の大きさを求めるときに使う以下の式の\(n\)個の集合での一般化
\(|A \cup B| = |A| + |B| - |A \cap B|\)
集合の数が増えた時には、組み合わせる集合を増やしながら足すのと引くのとを交互に繰り返していけばよい
\(|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C|\)
集合が\(n\)個の場合
$$\Biggl|\bigcup_{i=1}^n A_i\Biggr| = \sum_{k = 1}^{n} (-1)^{k+1} \left( \sum_{1 \leq i_{1} < \cdots < i_{k} \leq n} \left| A_{i_{1}} \cap \cdots \cap A_{i_{k}} \right| \right)$$

積集合を求める場合にはド・モルガンの法則より全体集合を\(S\)と置いて
$$\Biggl|\bigcap_{i=1}^n A_i\Biggr| = \Biggl|\overline {\bigcup_{i=1}^n \overline{ A_i}}\Biggr| = |S| - \sum_{k = 1}^{n} (-1)^{k+1} \left( \sum_{1 \leq i_{1} < \cdots < i_{k} \leq n} \left| \overline{A_{i_{1}}} \cap \cdots \cap \overline{A_{i_{k}}} \right| \right)$$

ちなみに昨日の記事で書いたオイラーのトーシェント関数も包除原理で求められるらしいです
以下の記事のApplicationsのところにいろいろと書いてあります

subfactorialの導出

\(i\)番目の要素が\(i\)でない順列の集合を\(A_i\)と置いた時包除原理とド・モルガンの法則より\(!n = \Biggl|\bigcap_i^n A_i\Biggr| = |S| - \sum_{k = 1}^{n} (-1)^{k+1} \left( \sum_{1 \leq i_{1} < \cdots < i_{k} \leq n} \left| \overline{A_{i_{1}}} \cap \cdots \cap \overline{A_{i_{k}}} \right| \right)\)
このとき\(\sum_{1 \leq i_{1} < \cdots < i_{k} \leq n} \left| \overline{A_{i_{1}}} \cap \cdots \cap \overline{A_{i_{k}}} \right|\)は不動点が\(k\)個以上である順列の集合なので
\(\sum_{k = 1}^{n} (-1)^{k+1} \left( \sum_{1 \leq i_{1} < \cdots < i_{k} \leq n} \left| \overline{A_{i_{1}}} \cap \cdots \cap \overline{A_{i_{k}}} \right| \right) = \sum_{k = 1}^{n} (-1)^{k+1} \binom{n}{k} (n - k)!\)
二項係数\( \binom{n}{k}=\frac{n!}{k!(n - k)!}\)を代入すると
\(\sum_{k = 1}^{n} (-1)^{k+1} \binom{n}{k} (n - k)! = \sum_{k = 1}^{n} (-1)^{k+1} \frac{n!}{k!(n - k)!} (n - k)! = \sum_{k = 1}^{n} (-1)^{k+1} \frac{n!}{k!}\)
以上より\(|S| = n!\)なので\(!n = n! - n!\sum_{k = 1}^{n} \frac{(-1)^{k+1} }{k!} = n!\sum_{k = 0}^{n} \frac{(-1)^{k} }{k!}\)
この結果からDerangementになる確率
$$P(n) = \frac{!n}{n!} = \sum_{k = 0}^{n} \frac{(-1)^{k} }{k!}$$ \(\lim_{n \to \infty}P(n)\)は\(e^x\)のマクローリン展開に\(x=-1\)を代入したものに等しいので、Derangementになる確率は以下のようになる
$$\lim_{n \to \infty}P(n)=\frac{1}{e}\approx36.8\%$$

解法2 - 漸化式

次のような漸化式がなりたつそうです(自力で導出できる気はしませんが
$$!n=(n-1)(!(n-1)+!(n-2))$$位置\(i=1\)に置くことができる要素は\(1\)以外の\(n-1\)通りあります
位置\(i=1\)に置いた要素を\(j\)としたとき、以下の2種類に場合分けします

  • 位置\(j\)に\(i\)を置いた時(つまり\(i\)と\(j\)が入れ替わった状態になっている時)
    • 残りの選び方は\(!(n-2)\)に等しい
    • \(j\)の選び方が\((n-1)\)通りなので、全体では\((n-1)(!(n-2))\)
  • 位置\(j\)に\(i\)以外を置いた時
    • 選び方は\(!(n-1)\)に等しい
    • \(j\)の選び方が\((n-1)\)通りなので、全体では\((n-1)(!(n-1))\)

以上より合計すると\(!n=(n-1)(!(n-1)+!(n-2))\)

この漸化式の一般項を求めるのは結構めんどくさいので以下の記事あたりを参考にしてください
最終的に包除原理で求めた結果と同じになります
イズミの数学>大学入試数学演習>完全順列[2004 東工大(後)]

combinatorics - I have a problem understanding the proof of Rencontres numbers (Derangements) - Mathematics Stack Exchange

この記事を書いたきっかけ

この辺のツイートを見てDerangementについて調べました
面白いツイートをありがとうございます