Stirling 数を p で割った余りの計算

スポンサーリンク

概要

下降冪 (x)n、符号つき第 1 種 Stirling 数 s(n,k)、第 2 種 Stirling 数 S(n,k) を次で定義します:

  • (x)n=0i<n(xi)=k=0ns(n,k)xk.
  • xn=k=0nS(n,k)(x)k.

これらの組合せ論的な意味などは、例えば

を参照してください。

また、定数 N に対して、s(N,k) の列挙や S(N,k) の列挙を O(NlogN) 時間で行うことができます。

解法について、私の記事 [多項式・形式的べき級数] 高速に計算できるものたち 内でも言及しています。


この記事では、以下の計算量で s(n,k),S(n,k)(modp) を求める方法について解説します。

  • O(logpn+plogp) 時間で計算する
  • O(p2) 時間の前計算のもと、O(logn) 時間で計算する

競技プロでの出題も何度かあるようです。

以下、素数 p を固定し、整数や多項式の等式はすべて Fp でのもの(modp でのもの)とします。

下降冪の性質

非負整数 i,j に対して次が成り立ちます。

(x)p=xpx,(x)ip+j=(xpx)i(x)j

(x)p=xpx は、Fermat の小定理と因数定理(体 Fp における)から証明できます。(x)ip+j については p 項ごとにまとめたあと (x)p=xpx を用いればよいです。

第 1 種 Stirling 数の計算

1 種 Stirling 数 s(n,k) は、下降冪の係数 [xk](x)n でした。n=ip+j (0jp1) とすれば、上で述べた下降冪の性質から

s(n,k)=[xk](xpx)i(x)j=[xki](xp11)i(x)j=[xki]a=0ib=0j(ia)x(p1)a(1)ias(j,b)xb

となります。したがって

X={(a,b)ki=(p1)a+b,0ai,0bj}

とすれば、s(n,k)=(a,b)X(1)ia(ia)s(j,b) が成り立ちます。

n,k を固定すると、X は高々 2 元集合です。b=0,p1 に対応する 2 元というパターンはありえますが、この場合も s(0,p1)=0s(j,0)=0 (j>0) より s(j,b)0 となる (a,b) は唯一です。したがってその場合も、s(n,k)=(1)ia(ia)s(j,b) が成り立つような (a,b) がちょうどひとつ存在します。

第 2 種 Stirling 数の計算

xn=k=0nS(n,k)(x)k となる S(n,k) が求めるものです。下降冪の性質より

xn=i=0j=0p1S(n,ip+j)(xpx)i(x)j

と変形できます。したがって、S(n,ip+j) は次の手順で計算できます。

  • xnxpx 進展開したときの (xpx)i の係数 gi(x) を求める。つまり xn=i=0gi(x)(xpx)i となる p1 次以下の多項式 gi を求める。
  • gi(x)=j=0p1S(n,ip+j)(x)j となる S(n,ip+j) を求める。

n=(p1)a+(i+b) となる 整数 a,b を、1bp1 となるようにとります。

xnib=((xp11)+1)a=k=0a(ak)(xp11)k より

xn=k=0a(ak)(xp11)kxi+b

が成り立ちます。

  • ki+1 に対応する項は、(xp11)i+1xi+1=(xpx)i+1 で割り切れるため、(xpx) 進展開の (xpx)i の係数へは寄与しません。
  • ki2 に対応する項は、次数が高々 (p1)k+i+bpi2(p1)+b<pi なので、(xpx) 進展開の (xpx)i の係数へは寄与しません。

よって、gi(x) を求めるには、k=i,i1 の部分

(ai)(xpx)ixb+(ai1)(xpx)i1xb+1

(xpx) 進展開すればよいです。よって

  • 1b<p1 ならば、gi(x)=(ai)xb
  • b=p1 ならば、gi(x)=(ai)xp1+(ai1)

であることが分かります。第 2 種 Stirling 数については、

  • 1b<p1 ならば、S(n,ip+j)=(ai)S(b,j)
  • b=p1 ならば S(n,ip+j)=(ai)S(p1,j)+(ai1)S(0,j)

であることが分かります。後者の場合には一見 2 つの和ですが、j=0 であるか否かに応じて S(p1,j) および S(0,j) のうちちょうど一方のみが非 0 です。いずれにせよ、S(n,k)=(ai)S(b,j) となる (a,b) がちょうど一組見つかりました。

まとめ

次が示されました。

  • n,k が与えられたとき、s(n,k)=(1)ia(ia)s(j,b) が成り立つような i,j,a,b (0bjp1) が O(1) 時間で計算できる。
  • n,k が与えられたとき、S(n,k)=(ai)S(b,j) が成り立つような i,j,a,b (0jbp1) が O(1) 時間で計算できる。

これによって、s(n,k)S(n,k) は、

  • np1 の場合の計算
  • 二項係数の計算

により計算することができます。np1 の場合のすべての s(n,k), S(n,k) は全体で O(p2) 時間で前計算できます。前計算なしの場合でも O(plogp) 時間で計算できます。

二項係数を p で割った余りの計算

有名ですが、ついでにこれも解説しておきます。(nk)=[xk](1+x)n を計算します。

Fp で(あるいは modp で)(1+x)p=1+xp が成り立つことを利用します。

n,kp で割った商と余りによって n=n0+pn1,k=k0+pk1 (0k0,n0p1) と書けば

(nk)=[xk](1+x)n=[xk0+pk1](1+x)n0(1+xp)n1=(n0k0)[xpk1](1+xp)n1=(n0k0)(n1k1)

が得られます。この性質は Lucas の定理として知られています。

これを用いると、n<p の場合の二項係数のための前計算のもと、(nk)O(logpn) 時間で計算できます。

タイトルとURLをコピーしました