8章 分割数 再び


3章で紹介した分割数 p(n)=pn は、以下の母関数によって定義される。

p0+p1x+p2x2+……


Σ
n=0
pnxn  

Π
n=1
1
------
(1−xn)
 
1
-----------------------
(1−x)(1−x2)(1−x3) ・……

(0の分割数は、便宜上1と定義する。)

よって、7章で求めた無限乗積と、 『数学者の密室』11章 数論的アルゴリズム
6.形式べき級数の係数決定 で示した方法で、分割数を計算することができる。


まず、無限乗積 (1−x)(1−x2)(1−x3)・…… を、

=a0+a1x+a2x2+……

とする。

(p0+p1x+p2x2+……) (a0+a1x+a2x2+……)=1

の左辺を展開すると、

0次:p0a0=1
1次:p1a0+p0a1=0
2次:p2a0+p1a1+p0a2=0

 …………

k次:pka0+pk-1a1+……+p0ak=0

∴ pk=−1/(a0)・(pk-1a1+……+p0ak)

a0=1だから、

∴ pk=−pk-1a1−……−p0ak

これを、前の章のマクロの中に追加する。
マクロは、以下のようになる。


分割数を計算するためのマクロ。

Sub Record3()
    Worksheets("Sheet3").Activate

    Dim a(10), w(10), p(10)
    k = 10

    Cells(1, 1).Value = "n"
    Cells(1, 2).Value = "a(n)"
    Cells(1, 3).Value = "p(n)"

    a(0) = 1: a(1) = -1
    For i = 2 To k
        For j = i To k: w(j) = a(j) - a(j - i): Next j
        For j = 2 To k: a(j) = w(j): Next j
    Next i

    p(0) = 1
    For i = 1 To k
        For j = 0 To i - 1: p(i) = p(i) - p(j) * a(i - j): Next j
    Next i

    For i = 0 To k
        Cells(i + 2, 1).Value = i
        Cells(i + 2, 2).Value = a(i)
        Cells(i + 2, 3).Value = p(i)
    Next i
End Sub

実行結果は以下のとおり。

  A  B  C 
1na(n)p(n)
2011
31-11
42-12
5303
6405
7517
86011
97115
108022
119030
1210042

3章の結果と比較すると、確かにあっている。


それでは、桁あふれしない程度までkの値を大きくして、100以下の分割数を求めてみよう。
結果は以下のようになる。

np(n)np(n) np(n)np(n) np(n)
1121792 4144583611121505 8118004327
2222100242531746213001568220506255
3323125543632616315054998323338469
4524157544751756417416308426543660
5725195845891346520125588530167357
611262436461055586623235208634262962
715273010471247546726796898738887673
822283718481472736830877358844108109
930294565491735256935543458949995925
1042305604502042267040879689056634173
1156316842512399437146972059164112359
1277328349522815897253927839272533807
131013310143533299317361856899382010177
141353412310543861557470895009492669720
1517635148835545127675811826495104651419
1623136179775652682376928909196118114304
17297372163757614154771061986397133230930
18385382601558715220781213216498150198136
19490393118559831820791384865099169229875
206274037338609664678015796476100190569292

kは、269までは桁あふれしないようである。

UBASICを使えば、BASEの変更で、配列としてとれる範囲まで分割数を求めることができる。
例えば、1万以下の分割数計算、というのも夢ではない。


前頁 目次 次頁

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典