食玩問題とネールント多項式
はじめに
食玩問題、別名クーポンコレクター問題(Coupon collector's problem)と言われる問題について、少し前に執筆した。
その執筆当時から少し進展があったので、そのことについて記事を執筆していく。
ネールント多項式
今回キーワードとなるネールント多項式について説明する。以下2つの記事を参考にした。
定義
ネールント多項式
を満たす多項式として定義される(便宜上、元記事と変数の文字を変えている)。2つ目の記事の PDF に
となっている。
食玩問題とネールント多項式
以前書いた記事では
のように定義した。右辺の式は、
という関係式が成り立つ。それを踏まえて、改めて確率
と表すことができる。
ネールント多項式の導出
求め方
1つ目の参考文献より
という関係式もあるので、
以下は sagemath で雑に書いたコードになる。
def getB(dim):
k = var('k', domain='integer')
n = var('n', domain='integer')
m = var('m', domain='integer')
p(n, m) = (1/n^(n+m)) * sum((-1)^(n-k) * binomial(n, k) * k^(n+m), k, 0, n)
b(n, m) = factorial(m)/factorial(n+m) * sum((-1)^(n-k) * binomial(n, k) * k^(n+m), k, 0, n)
A = Matrix(
[[(i+1)^(j+1) for j in range(dim)] for i in range(dim)]
)
v = vector([b(i + 1, dim).unhold() for i in range(dim)])
a = list(A.solve_right(v))
a.reverse()
return a
結果
1 [1/2]
2 [1/4, 1/12]
3 [1/8, 1/8, 0]
4 [1/16, 1/8, 1/48, -1/120]
5 [1/32, 5/48, 5/96, -1/48, 0]
6 [1/64, 5/64, 5/64, -13/576, -1/96, 1/252]
7 [1/128, 7/128, 35/384, -7/1152, -7/192, 1/72, 0]
8 [1/256, 7/192, 35/384, 7/288, -469/6912, 1/64, 101/8640, -1/240]
9 [1/512, 3/128, 21/256, 7/120, -133/1536, -5/384, 101/1920, -3/160, 0]
10 [1/1024, 15/1024, 35/512, 133/1536, -245/3072, -745/9216, 67/576, -47/2304, -13/576, 1/132]
11 [1/2048, 55/6144, 55/1024, 319/3072, -847/18432, -3179/18432, 121/768, 275/4608, -143/1152, 1/24, 0]
12 [1/4096, 11/2048, 165/4096, 671/6144, 77/12288, -1573/6144, 12661/110592, 5291/18432, -8723/27648, 311/7680, 7999/120960, -691/32760]
13 [1/8192, 13/4096, 715/24576, 429/4096, 1573/24576, -77363/258048, -55627/1105920, 118547/184320, -24167/55296, -4277/15360, 103987/241920, -691/5040, 0]
14 [1/16384, 91/49152, 1001/49152, 23023/245760, 17017/147456, -42185/147456, -713713/2211840, 6565559/6635520, -11011/73728, -2197741/1658880, 112957/92160, -22271/207360, -2357/8640, 1/12]
15 [1/32768, 35/32768, 455/32768, 23387/294912, 5005/32768, -63635/294912, -566137/884736, 986843/884736, 389389/442368, -700609/221184, 184717/110592, 44065/27648, -2357/1152, 5/8, 0]
16 [1/65536, 5/8192, 455/49152, 1183/18432, 17017/98304, -429/4096, -405691/442368, 46475/55296, 14343329/5308416, -3321955/663552, -372983/663552, 654715/82944, -10662539/1658880, 68653/207360, 52037/34560, -3617/8160]
17 [1/131072, 17/49152, 595/98304, 3689/73728, 314041/1769472, 221/9216, -318461/294912, 70499/663552, 52234897/10616832, -34002839/6635520, -56642963/6635520, 16664879/829440, -27398203/3317760, -4708099/414720, 884629/69120, -3617/960, 0]
18 [1/262144, 51/262144, 255/65536, 7429/196608, 66521/393216, 58123/393216, -3206489/2949120, -2919631/2949120, 5321459/786432, -500676163/318504960, -52102739/2211840, 425693651/13271040, 9025997/737280, -394116457/6635520, 805205/18432, -7132679/8709120, -1295681/120960, 43867/14364]
19 [1/524288, 57/524288, 323/131072, 54587/1966080, 119833/786432, 589475/2359296, -5538481/5898240, -13147069/5898240, 104525707/14155776, 4279960919/637009920, -27339689/645120, 4942532111/185794560, 386239847/4423680, -424557983/2654208, 3087557/61440, 1734844267/17418240, -24617939/241920, 43867/1512, 0]
20 [1/1048576, 95/1572864, 1615/1048576, 31331/1572864, 618545/4718592, 5298815/16515072, -3153449/4718592, -23678161/7077888, 174548231/28311552, 2424422819/127401984, -301489295939/5350883328, -674054165/33030144, 7540699537/31850496, -447280387/1769472, -2750847911/15925248, 769892281657/1393459200, -9752905181/26127360, -24989087/5806080, 152388293/1596672, -174611/6600]
21 [1/2097152, 35/1048576, 1995/2097152, 44023/3145728, 341411/3145728, 564281/1572864, -9267839/28311552, -19388075/4718592, 169509431/56623104, 91656750367/2802843648, -27364870403/509607936, -10718291495/84934656, 45222571403/106168320, -6794209069/53084160, -54108083701/53084160, 622543004491/398131200, -890447141/2488320, -586486687/552960, 152388293/152064, -1222277/4400, 0]
22 [1/4194304, 77/4194304, 7315/12582912, 121429/12582912, 273581/3145728, 6924797/18874368, 1602403/56623104, -82688969/18874368, -193670477/113246208, 223439442863/5096079360, -124651224269/5096079360, -4345353851377/15288238080, 4092425047601/7644119040, 355161713687/637009920, -443872562903/159252480, 422704183913/176947200, 663328656089/265420800, -372407150753/59719680, 116927697319/29859840, 162146033/1036800, -269839961/259200, 77683/276]
23 [1/8388608, 253/25165824, 8855/25165824, 54901/8388608, 639331/9437184, 13272127/37748736, 199149203/566231040, -7024646959/1698693120, -1613705093/226492416, 495348492149/10192158720, 1053110085989/30576476160, -13891955119571/30576476160, 5748660424639/15288238080, 2669531161957/1274019840, -6636972023/1327104, -26600683373/3185049600, 65898711762103/4777574400, -2200819693963/119439360, 165786906257/59719680, 28018447303/2073600, -6206319103/518400, 77683/24, 0]
24 [1/16777216, 23/4194304, 1771/8388608, 412643/94371840, 2590973/50331648, 12089605/37748736, 172999123/283115520, -243767777/70778880, -5559261851/452984832, 226249325807/5096079360, 1185022292441/10192158720, -1447104589987/2548039680, -8660399429605/36691771392, 13467035337811/3057647616, -260894809405021/45864714240, -71688697835953/6370099200, 733100733872287/19110297600, -42122797520749/1592524800, -2866903027138663/71663616000, 100370658423731/1194393600, -62044033166177/1254113280, -576654122683/174182400, 19311547193251/1415232000, -236364091/65520]
25 [1/33554432, 25/8388608, 6325/50331648, 54395/18874368, 1283975/33554432, 21131825/75497472, 89578445/113246208, -138417565/56623104, -44230817345/2717908992, 62670783985/2038431744, 836591613545/4076863488, -10906821160525/19874709504, -100563289259245/73383542784, 41249729434795/6115295232, -24485030450705/18345885696, -655026305766811/17836277760, 728249426436169/10701766656, 56490173367727/2675441664, -1240072050375463/5733089280, 123118719182719/477757440, -9933622351333/501645312, -2831822685883/13934592, 19311547193251/113218560, -1181820455/26208, 0]
26 [1/67108864, 325/201326592, 7475/100663296, 566605/301989888, 50535485/1811939328, 142693265/603979776, 403379405/452984832, -882685375/679477248, -100747677745/5435817984, 152351666155/16307453952, 48025240272815/171228266496, -58489942810825/171228266496, -424279898878381/146767085568, 3389241749938343/440301256704, 2012948906111/169869312, -288593877773518603/3852635996160, 230972950292513/3567255552, 14750727198963613/64210599936, -1757413939635601/2866544640, 2304902118987013/6879707136, 4833393355274159/6688604160, -4013813879660689/3009871872, 44244310430927/59719680, 3592733471221/52254720, -76796879507/362880, 657931/12]
27 [1/134217728, 117/134217728, 2925/67108864, 81055/67108864, 2680535/134217728, 181832365/939524096, 92470235/100663296, -8074495/50331648, -2526823585/134217728, -178866358853/10871635968, 4086478922513/12683575296, 804109514543/12683575296, -144630772253653/32614907904, 180440059226303/32614907904, 144419257955609/4076863488, -31293934702233619/285380444160, -137197562768123/2972712960, 3371821955331973/4756340736, -9469496046633389/8918138880, -1758907062727087/2548039680, 17436223298287183/4459069440, -941060290643161/222953472, 725417924473/30965760, 1971951743203/552960, -76796879507/26880, 5921379/8, 0]
28 [1/268435456, 63/134217728, 6825/268435456, 103285/134217728, 3777865/268435456, 62190505/402653184, 238955717/268435456, 114263149/134217728, -41733676985/2415919104, -462312093607/10871635968, 2296096638329/7247757312, 6739291483991/10871635968, -357777750735607/65229815808, -35364814055461/32614907904, 12913917329531855/195689447424, -52401192718983797/489223618560, -86002769126448031/244611809280, 34707909079624495/24461180928, -14572411472400847/20384317440, -51611966743151633/10192158720, 172545666694991447/15288238080, -180346029752628311/38220595200, -141287522805736481/9555148800, 11764464599450449/477757440, -516632265043043/39813120, -12683204101333/8294400, 662401834631/172800, -3392780147/3480]
29 [1/536870912, 203/805306368, 7917/536870912, 651833/1342177280, 15741635/1610612736, 96992675/805306368, 1323792899/1610612736, 4008768049/2415919104, -68926602745/4831838208, -1412383803649/21743271936, 33986618341429/130459631616, 26813970757903/21743271936, -720195712497967/130459631616, -2412529854559565/195689447424, 36732801247661491/391378894848, -2505613410067393/108716359680, -433972411555241507/489223618560, 477236143511008999/244611809280, 452126801598847297/203843174400, -186620280195688339/12230590464, 114847822549815407/6115295232, 501825629683067287/25480396800, -1546990939363832797/19110297600, 76480429249629677/955514880, 411445217170889/79626240, -1198662923393057/16588800, 19209653204299/345600, -3392780147/240, 0]
30 [1/1073741824, 145/1073741824, 9135/1073741824, 326221/1073741824, 7191275/1073741824, 98783425/1073741824, 7051300555/9663676416, 2394019745/1073741824, -99806201495/9663676416, -7026553304225/86973087744, 13897873900885/86973087744, 17230507031375/9663676416, -1092273013558325/260919263232, -6975594047253295/260919263232, 27224761515905635/260919263232, 2089848657020357789/11741366845440, -607385688350967331/391378894848, 816944739757449511/587068342272, 1622185743126704119/163074539520, -22008110267463988759/733835427840, 121368169189892755/24461180928, 22567007988209738053/183458856960, -7259242053644156419/30576476160, 1624405456139594651/22932357120, 217933807194557969/637009920, -5253421198046781847/10032906240, 54933826476137761/209018880, 1023113310480149/27371520, -320100719013851/3991680, 1723168255201/85932]
式での表現
くるくるストン多項式
上記のリストで、ネールント多項式
それを順々に推測していくと、
という推測ができる。最高次数を 0 番目として、
と式を立てることができる(
と置いてやると、
求め方
def getP(i):
if i == 0:
return 1
startM = i + 2
term = i // 2 + (i % 2)
A = Matrix(
[[mp(k)(m=m) for k in range(i * 2, i * 2 - term * 2, -2)] for m in range(i + 2, i + 2 + 2 * term, 2)]
)
v = vector([getB(m)[i] * 2^m for m in range(i + 2, i + 2 + 2 * term, 2)])
a = list(A.solve_right(v))
return a
結果
式変形
くるくるストン多項式を使うことでネールント多項式は、
というふうに置くことができる。
検算
ネールント多項式は、
という関係式が成り立つ(第2種スターリング数などの関係式を使って証明できる)。その関係式を使って検算してみる。
※前述したように同じ計算を複数回計算してしまうので、 import functools をインポートして関数の前に @functools.cache を入れてキャッシュさせておくと実行時間が早くなる。
def getBByKurukuruSuton(vm):
if vm == 0:
return 1
f = 0
for i in range(vm):
f += getP(i) * n ^ (vm - i)
return (f / 2^m)(m=vm)
for vm in range(1, 31):
diff = (n + vm) * getB(vm) - n * getB(vm)(n=n-1) - n * vm * getB(vm - 1)
print(vm, diff)
実行結果
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
まとめ
以上の結果をまとめると、
とすることができる。なので食玩問題の本質は、くるくるストン多項式
おわりに
記事中に少し触れたが、ネールント多項式は第2種スターリング数との関係式があり、
という関係式がある。
という式に変形できる。ここでベル数
という関係式があるので、
というふうに、ベル数は第2種スターリング数を使って表すことができる。つまり、くるくるストン多項式でも表すことができる。
いま、くるくるストン多項式の各係数に着目して研究中である。例えば最初の項の係数を各
となっており、初項から
Discussion