2012年7月29日日曜日

二元の分割数の母関数

何日か悩んで、やっと二元の分割数の母関数が分かった。そもそも分割数も母関数もよく分かっておらず、骨が折れた。数学的素養のある人には難しくないのかもしれないが・・・
   ( 1 + b      + b^2    + … )
 * ( 1 + b^2    + b^4    + … )
 * ( 1 + b^3    + b^6    + … )
   … 
 * ( 1 +    w   +    w^2 + … )
 * ( 1 +   bw   + b^2w^2 + … )
 * ( 1 + b^2w   + b^4w^2 + … )
 * ( 1 + b^3w   + b^6w^2 + … )
   … 
 * ( 1 +    w^2 +    w^4 + … )
 * ( 1 +   bw^2 + b^2w^4 + … )
 * ( 1 + b^2w^2 + b^4w^4 + … )
 * ( 1 + b^3w^2 + b^6w^4 + … )
   … 
 * ( 1 +    w^3 +    w^6 + … )
 * ( 1 +   bw^3 + b^2w^6 + … )
 * ( 1 + b^2w^3 + b^4w^6 + … )
 * ( 1 + b^3w^3 + b^6w^6 + … )
   … 
   … 

この多項式を計算して、bnwm の係数を調べれば、n 個の 黒玉(b) と m 個の 白玉(w) を分割するパターン数が得られる。

項の数が無限だから計算できないように思えるかもしれないが(自分も母関数をいろいろ調べるまではそうだった)、必要な部分は限られているので、元の式と計算途中の式から、範囲外の項は除外していけば計算できる。

試しに黒玉、白玉、ともに 3個までに限定して手計算してみると、以下のようになる。

1bb2b3 wbwb2wb3w w2bw2b2w2b3w2 w3bw3b2w3b3w3
1+b+b2+b3 1111
1+b2 1122
1+b3 1123
1+w+w2+w3 11231123 11231123
1+bw+b2w2+b3w3 11231235 12461247
1+b2w 11231246 12581259
1+b3w 11231247 125912510
1+w2 11231247 2371224917
1+bw2 11231247 24814251121
1+b2w2 11231247 24915251223
1+b3w2 11231247 24916251224
1+w3 11231247 24916361427
1+bw3 11231247 24916371529
1+b2w3 11231247 24916371630
1+b3w3 11231247 24916371631

例えば、黒玉3個、白玉1個は b3wの係数で7パターン、黒玉2個白玉2個ならb2w2の係数で9パターン、黒玉3個白玉3個ならb3w3の係数で31パターンとなり、手作業で調べた結果と一致する。

ここまで分かれば、任意の個数の黒玉白玉について、分割パターンの数を求めるプログラムを書くのはそう難しくない。Project Euler の Problem 181 がこれで解ける。

0 件のコメント:

コメントを投稿