【学习笔记】自然数幂和
溫馨提示: 本文文檔大小約\(11KB\).
引入
自然數冪和是一個我們從小就耳熟能詳的經典問題。定義\(S(n,k)=\sum^{n}_{i=0} i^k\), 顯然\(S(n,k)\)為關于\(n\)的不超過\((k+1)\)次多項式,那么給定\(k\), 如何快速求出這個多項式的系數?或者給定\(n\)和\(k\), 如何快速求出\(S(n,k)\)? 這就是本文的討論內容。
本文介紹三種不同的方法——拉格朗日插值法、第二類斯特林數法和伯努利數法,這三種方法在解決不同的問題上各有優劣。
符號約定
\(x^{\underline n}\)表示\(x\)的\(n\)次下降冪,即\(x^{\underline n}=\prod^{n}_{i=1}(x-i+1)\).
本文中提到的所有\(i\), 與虛數均無關系。
本文中所有運用數學歸納法進行證明的定理,歸納奠基均省略,請讀者自行處理。
拉格朗日(Lagrange)插值法
概述
Lagrange插值法的應用范圍很廣,給定任意\((n+1)\)個互不相同的點值\((x_i,y_i)\) (\(i=0,1,...,n\)),其可以在\(O(n^2)\)時間內求出一個不超過\(n\)次的多項式\(f(x)\),滿足對于任意\(i\), \(f(x_i)=y_i\). (“互不相同”指對于任意\(0\le i<j\le n\)有\(x_i\ne x_j\))
暴力做法
設\(f(x_i)=\sum^{n}_{i=0} a_ix^i\). 根據\((n+1)\)個點值,我們可以列出\((n+1)\)個方程,第\(j\)個形如\(\sum^{n}_{i=0}x_j^ia_i=y_j\).
直接高斯消元求解,時間復雜度\(O(n^3)\).
插值多項式的唯一性
定理1 給定任意\((n+1)\)對互不相同的點值\((x_i,y_i)\),恰好存在一個不超過\(n\)次的多項式\(f(x)\),滿足對于任意\(i\), \(f(x_i)=y_i\).
證明 根據暴力做法,我們就是要證明方程左邊的\((n+1)\times (n+1)\)的系數矩陣可逆。
實際上系數矩陣就是著名的范德蒙德(Vandermonde)矩陣: \(\begin{bmatrix} 1&1&1&...&1\\ a_0&a_1&a_2&...&a_n\\ a_0^2&a_1^2&a_2^2&...&a_n^2\\ & & & ... & \\ a_0^n&a_1^n&a_2^n&...&a_n^n\end{bmatrix}\)
可以證明,該矩陣行列式為\(\prod_{0\le i<j\le n} (a_j-a_i)\).
考慮數學歸納法,自下而上每一行減去上一行的\(a_0\)倍,該矩陣變為\[\begin{bmatrix}1&1&1&...&1\\ 0&a_1-a_0&a_2-a_0&...&a_n-a_0\\ 0&a_1(a_1-a_0)&a_2(a_2-a_0)&...&a_n(a_n-a_0)\\&&&...&\\0&a_1^{n-1}(a_1-a_0)&a_2^{n-1}(a_2-a_0)&...&a_n^{n-1}(a_n-a_0)\end{bmatrix}\]
然后對第一列展開,每一行提取公因式之后可得\(|V|=|V'|\prod^{n}_{i=1}(a_i-a_0)\), 其中\[V'=\begin{bmatrix}1&1&...&1\\a_1&a_2&...&a_n\\a_1^2&a_2^2&...&a_n^2\\&&...&\\a_1^{n-1}&a_2^{n-1}&...&a_n^{n-1}\end{bmatrix}\]
是一個\(n\times n\)的Vandermonde矩陣,由歸納知其行列式為\(\prod_{1\le i<j\le n}(a_j-a_i)\), 故\(|V|=\prod_{0\le i<j\le n}(a_j-a_i)\), 證畢。
由上可知,由于任意\(1\le i<j\le n\)滿足\(a_i\ne a_j\), 故該矩陣行列式不為\(0\).
任意多項式的插值
直接給出公式。
定理2 符合\((n+1)\)個點值\((x_i,y_i)\)的多項式為\(f(x)=\sum^{n}_{i=0} y_i\prod_{0\le j\le n,j\ne i}\frac{x-x_j}{x_i-x_j}\).
證明 代入\(x_k\), 當\(i\ne k\)時后面的乘法有一項因數是\(x-x_k=0\), 故該積恒為\(0\). 當\(i=k\)時顯然值為\(y_i\). 因此該多項式符合\((n+1)\)個給定點值。
至于這個公式具體是怎么推出來的,大概是考慮求Vandermonde矩陣的逆矩陣,使用矩陣分塊法解決,此處不再贅述。
有了這個公式,我們可以先預處理出\(\prod^n_{i=0}(x-x_i)\)的每一項系數(這是一個\((n+1)\)次多項式),然后對于每個\(i\)暴力用這個多項式除以\((x-x_i)\). 由于多項式除以一次式可在\(O(n)\)時間內完成,該算法時間復雜度為\(O(n^2)\).
使用FFT最好可以做到\(O(n\log ^2n)\), 但是我不會。
那么對于自然數冪和問題,我們可以求出\(S(m,n)\)在\(0,1,2,...,n\)處的點值,然后利用Lagrange插值求出這個\((n+1)\)次多項式的每一項系數,時間復雜度\(O(n^2)\). 如果給定一個\(m\)要求\(S(m,n)\)的值,那么可以直接把\(n\)代入多項式求值,時間復雜度\(O(n^2)\), 與\(m\)無關。
對于自然數冪和問題的優化
如果給定\(m,n\)要求\(S(m,n)\), 不需要求出多項式每一項的系數,是否可以做到更優的復雜度?(假設\(n>k\))
\(f(n)=\sum^{m}_{i=0}y_i\prod_{0\le j\le n, j\ne i}\frac{n-j}{i-j}=\sum^{m}_{i=0}y_i\frac{\prod_{0\le j\le n}(m-j)}{\prod_{0\le j\le n,j\ne i}(i-j)\times (m-i)}\), 可以用階乘和逆元之類的方法優化,時間復雜度\(O(n\log n)\).
第二類斯特林(Stirling)數法
概述
第二類斯特林數是一類重要的計數序列,又稱“斯特林子集數”,其定義為\(\begin{Bmatrix}n\\k\end{Bmatrix}\)表示將\(n\)個有編號的物品放入\(k\)個無編號的集合中,每個集合都非空的方案數。
由定義可以得出其遞推式: \(\begin{Bmatrix}n\\k\end{Bmatrix}=k\begin{Bmatrix}n-1\\k\end{Bmatrix}+\begin{Bmatrix}n-1\\k-1\end{Bmatrix}\). 考慮最后一個物品,如果將其單獨放入一個集合中,則方案數為\(\begin{Bmatrix}n-1\\k-1\end{Bmatrix}\), 否則所有集合都已經有元素了,所以要加以區分,放入不同的集合算不同的方案,方案數為\(k\begin{Bmatrix} n-1\\k\end{Bmatrix}\).
下面兩個重要公式給出了第二類Stirling數與冪運算之間的關系。
定理3 \(m^n=\sum^{n}_{i=0} \begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\).
證明 我們可以從代數和組合等不同角度來證明。
證法一 代數做法: 考慮使用數學歸納法。對\(n\)施歸納,\[m^{n+1}=\sum^{n}_{i=0}m\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\\ =\sum^{n}_{i=0}(m-i)\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}+\sum^{n}_{i=0}i\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\\ =\sum^{n}_{i=0}\begin{Bmatrix}n\\i\end{Bmatrix}m^{i+1}+\sum^{n}_{i=0}i\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\\ =\sum^{n+1}_{i=1}\begin{Bmatrix}n\\i-1\end{Bmatrix}m^{\underline i}+\sum^{n}_{i=0}i\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\\ =\sum^{n+1}_{i=0}\begin{Bmatrix}n+1\\i\end{Bmatrix}m^{\underline i}\]
證法二 組合做法: \(m^n\)相當于把\(n\)個有標號數放入\(m\)個有標號集合的方案數。這些集合有的是空集,有的是非空集合,考慮枚舉有多少個非空集合,先從有標號集合里有順序地選出這\(i\)個非空集合(方案數\(m^{\underline i}\)), 再計算\(n\)個數放進去的方案數。
定理4 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\frac{1}{m!}\sum^{m}_{i=0}(-1)^i\begin{pmatrix}m\\i\end{pmatrix}(m-i)^n\)
證明 組合意義上相當于上式套容斥,代數意義上相當于上式套二項式反演。
根據定理4,我們發現固定\(n\)之后可以用FFT在\(O(n\log n)\)時間內對每個\(m\)求出第二類斯特林數。
分別構造多項式\(F(x)=\sum_{i\ge 0}\frac{(-1)^i}{i!}x^i\)與\(G(x)=\sum_{i\ge 0}\frac{i^n}{i!}x^i\), 卷積相乘即可。
利用第二類斯特林數求自然數冪和
定理4指出一種快速求第二類斯特林數的方法,而定理3指出第二類斯特林數與自然數的冪的聯系。
既然定理3的式子是把通常冪轉化為下降冪,那么求自然數下降冪的和是否容易一些呢?
這是一個小學數學問題。\[\sum^{m}_{i=0}i^{\underline n}=\frac{1}{n+1}\sum^{m}_{i=0}(i+1)^{\underline {n+1}}-i^\underline {n+1}=\frac{(m+1)^{\underline {n+1}}-0^{\underline {n+1}}}{n+1}=\frac{1}{n+1}(m+1)^{\underline {n+1}}\]
那么考慮將自然數冪和轉化為自然數下降冪和: \[S(m,n)=\sum^{m}_{i=0}i^n=\sum^{m}_{i=0}\sum^{n}_{j=0}\begin{Bmatrix}n\\j\end{Bmatrix}i^{\underline j}=\sum^{n}_{j=0}\begin{Bmatrix}n\\j\end{Bmatrix}\sum^{m}_{i=0}i^{\underline j}=\sum^{n}_{j=0}\frac{1}{j+1}\begin{Bmatrix}n\\j\end{Bmatrix}(m+1)^{\underline {j+1}}\].
于是我們得到了一種通過第二類斯特林數求自然數冪和的方法。如果\(n\)不固定,那么可以\(O(n^2)\)預處理第二類斯特林數;如果\(n\)固定,那么可以\(O(n\log n)\)求第二類斯特林數一整行。求出第二類斯特林數之后,可以在不超過\(O(n\log P)\)的時間復雜度內求出\(S(m,n)\), 其中\(P\)為模數,\(O(\log P)\)為求乘法逆元的復雜度。
特別地,如果模數性質不好,沒法求逆元怎么辦?此時Lagrange插值法失去了用武之地,而該方法依然可用,但時間復雜度退化為\(O(n^2)\). 我們只需要求\((j+1)\)的逆元,而\((m+1)^{\underline {j+1}}\)是把\((j+1)\)個連續整數相乘,肯定有一個是\((j+1)\)的倍數,每次找到那個倍數即可。
伯努利(Bernoulli)數法
注意在這一部分中,我們需要改變\(S(m,n)\)的定義。現在\(S(m,n)\)定義為\(\sum^{m-1}_{i=0}i^n\), 即比原來少了\(m^n\).
概述
伯努利數法與上面兩種方法的適用對象有所不同。伯努利數法適用于對于某個固定的\(m\), 以及\(1\)到\(N\)內的所有的\(n\), 求出\(S(m,n)\)的值, 時間復雜度可以做到\(O(n\log n)\).
伯努利數本身就是由伯努利觀察自然數冪和的過程中發現的。他對于較小的\(n\)求出了\(S(m,n)\)多項式的每一次項的系數,然后發現\((n+1)\)次系數總是\(1\), 對于\(0\le k\le n\), \((n-k)\)次項系數總是等于一個常數乘以\(n\)的一個下降冪。于是他定義了伯努利數。
伯努利數\(B_n\)由以下遞歸關系定義: \(\sum^{n}_{i=0}{n+1\choose i}B_i=[n=0]\). 伯努利數的前\(5\)項是: \(B_0=0, B_1=-\frac{1}{2},B_2=\frac{1}{6},B_3=0,B_4=-\frac{1}{30},B_5=0\).
定理5 伯努利數的指數生成函數(EGF)為\(B(x)=\sum_{n\ge 0}\frac{B_n}{n!}=\frac{x}{e^x-1}\).
證明 \[\sum^{n}_{i=0}{n+1\choose i}B_i=[n=0]\\\sum^{n+1}_{i=0}{n+1\choose i}B_i=B_{n+1}+{n=0}\\\sum^{n}_{i=0}{n\choose i}B_i=B_n+[n=1]\\\frac{B_n}{n!}+[n=1]=\sum^{n}_{i=0}\frac{1}{(n-i)!}\frac{B_i}{i!}\\B(x)+x=B(x)e^x\\B(x)=\frac{x}{e^x-1}\]
由此,用FFT多項式求逆就可以在\(O(n\log n)\)時間內預處理伯努利數前\(n\)項。
利用伯努利數求自然數冪和
定理6 伯努利數滿足關系式\(S(m,n)=\frac{1}{n+1}\sum^{n}_{i=0}{n+1\choose i}B_im^{n+1-i}\).
證明 考慮固定\(m\), 寫出\(S(m,n)\)的指數生成函數\(S_m(x)\).
\[S_m(x)=\sum_{n\ge 0}S(m,n)\frac{x^n}{n!}\\ =\sum_{n\ge 0}\sum^{m-1}_{i=0}i^n\frac{x^n}{n!}\\=\sum^{m-1}_{i=0}\sum_{n\ge 0}\frac{i^n}{n!}x^n\\=\sum^{m-1}_{i=0}e^{ix}\\=\frac{e^{mx}-1}{e^x-1}\\=B(x)\frac{e^{mx}-1}{x}\\=B(x)\sum_{n\ge 0}\frac{m^{n+1}}{(n+1)!}x^n\\ [x^n]S_m(x)=\sum^{n}_{i=0}\frac{B_i}{i!}\frac{m^{n+1-i}}{(n+1-i)!}\]
然后由于是指數生成函數所以\(S(m,n)=n![x^n]S_m(x)\), 證畢。
那么,我們用與上面幾例類似的方法,可以用FFT在\(O(N\log N)\)時間內對固定的\(m\)和每個\(n=1,2,...,N\)求出\(S(m,n)\).
三種方法的比較
三種方法適用的問題形式不同,各自的效率也有優劣。
當數據范圍可以接受\(O(n^2)\)的時間復雜度時,三種做法都可以不用FFT實現,代碼難度都較小。
求出多項式的每一次項系數,這是Lagrange插值法的專長。
當固定\(n\)不固定\(m\)時,Lagrange插值法和第二類Stirling數法較為適用。
當固定\(m\)不固定\(n\)時,Bernoulli數法較為適用。
當模數性質不好無法求逆元時,Stirling數法是較好的選擇。
解決有關具體問題時,一定要注意具體的限制(比如詢問形式、詢問次數、\(n,m\)的大小、是否固定),選擇較好的方法。
總結
以上是生活随笔為你收集整理的【学习笔记】自然数幂和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Luogu P4709 信息传递 (群论
- 下一篇: BZOJ 2669 Luogu P316