瞎写的理性愉悦:正整数幂和与伯努利数

小粉兔原本对数学方面的知识(数论,计数)比较感兴趣,直到他考了 CTS2019 和 APIO2019,
发现他的数学居然连没怎么学的数据结构都不如,于是他自闭了。

考虑到从现在开始 CNOI 可能会变得计数和推式子化,小粉兔很可能要凉掉了。
现在补救可能还是来得及的(?),所以他推了一些式子尝试救起濒死的数学水平。

注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!

注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!

注意:以下内容极其低端,仅能体现 OIer 中数学的最低水平,请谨慎阅读!


考虑计算这样一个东西:\(\displaystyle\sum_{i=1}^{n}i^k\)

即前 \(n\) 个正整数幂和,其中 \(0\le k\le 10^6\)\(1\le n\le 10^{18}\) 且均为整数。

\(\displaystyle S_k(n)=\sum_{i=1}^{n}i^k\),则显然对于 \(k\in\mathbb{N}\)\(S_k(x)\) 是关于 \(x\) 的一个 \(k+1\) 次多项式。

举几个例子:

  • \(\displaystyle S_0(n)=\overset{n}{\overbrace{1+1+\cdots+1}}=n=\mathbf{OGF}\left\{\left[0,1\right]\right\}\)
  • \(\displaystyle S_1(n)=1+2+\cdots+n=\frac{n(n+1)}{2}=\frac{1}{2}n+\frac{1}{2}n^2=\mathbf{OGF}\left\{\left[0,\frac{1}{2},\frac{1}{2}\right]\right\}\)
  • \(\displaystyle S_2(n)=1^2+2^2+\cdots+n^2=\frac{n(n+1)(2n+1)}{6}=\frac{1}{6}n+\frac{1}{2}n^2+\frac{1}{3}n^3=\mathbf{OGF}\left\{\left[0,\frac{1}{6},\frac{1}{2},\frac{1}{3}\right]\right\}\)
  • \(\displaystyle S_3(n)=1^3+2^3+\cdots+n^3=\frac{n^2(n+1)^2}{4}=\frac{1}{4}n^2+\frac{1}{2}n^3+\frac{1}{4}n^4=\mathbf{OGF}\left\{\left[0,0,\frac{1}{4},\frac{1}{2},\frac{1}{4}\right]\right\}\)

要如何求出 \(S_k(n)\) 呢?

观察到 \(S_k(n)\) 中包含许多 \(i^k\),可以联想到其出现在某些有相似特征的生成函数中,
比如 \(\displaystyle\mathbf{OGF}\left\{\left[1,a,a^2,a^3,\ldots\right]\right\}=\frac{1}{1-ax}\)\(\displaystyle\mathbf{EGF}\left\{\left[1,a,a^2,a^3,\ldots\right]\right\}=e^{ax}\)

我们不妨选用 \(\mathbf{EGF}:e^{ax}\)

考虑 \(\displaystyle\hat{G}(n,x)=\sum_{k=0}^{\infty}\frac{S_{k}(n)}{k!}x^k\),即 \(\mathbf{EGF}\left\{\left[S_0(n),S_1(n),S_2(n),\ldots\right]\right\}\),则有如下式子:

\[\begin{aligned}\hat{G}(n,x)&=\sum_{k=0}^{\infty}\frac{S_{k}(n)}{k!}x^k\\&=\sum_{k=0}^{\infty}\frac{\sum_{i=1}^{n}i^k}{k!}x^k\\&=\sum_{i=1}^{n}\sum_{k=0}^{\infty}\frac{i^k}{k!}x^k\\&=\sum_{i=1}^{n}e^{ix}\end{aligned}\]

最后的 \(\displaystyle\sum_{i=1}^{n}e^{ix}\) 可以这样化简:

\[\begin{aligned}(1-e^{-x})\hat{G}(n,x)&=\sum_{i=1}^{n}e^{ix}-\sum_{i=1}^{n}e^{(i-1)x}\\&=\sum_{i=1}^{n} e^{ix}-\sum_{i=0}^{n-1}e^{ix}\\&=e^{nx}-1\\\therefore\hat{G}(n,x)&=\frac{e^{nx}-1}{1-e^{-x}}\end{aligned}\]

那么 \(S_k(n)\) 等于 \(k![x^k]\hat{G}(n,x)\),也就等于 \(\displaystyle k![x^k]\frac{\displaystyle\sum_{i=0}^{\infty}\frac{n^{i+1}}{(i+1)!}x^i}{\displaystyle\sum_{i=0}^{\infty}\frac{(-1)^{i+1}}{(i+1)!}x^i}\)

据此可以在 \(\mathcal{O}(m\log m)\) 的时间内,使用多项式求逆和卷积,求出 \(n\) 固定时 \(0\le k<m\) 的所有 \(S_k(n)\)


我们之前提到了 \(S_k(x)\) 是关于 \(x\)\(k+1\) 次多项式,假设固定了 \(k\) 能否求出此多项式呢?

当然我们无法对 \(1\le k\le m\) 的所有 \(k\) 求出所有多项式的系数了,因为有 \(\mathcal{O}(m^2)\) 个系数。

仍然考察 \(\hat{G}(n,x)\),我们希望的是将其写作一个与 \(n\) 无关的生成函数与一个与 \(n^i\)有关的生成函数的乘积。

考虑 \(e^{nx}=\mathbf{EGF}\left\{\left[1,n,n^2,n^3,\ldots\right]\right\}\),注意到 \(\hat{G}(n,x)\) 的分子就包含此式,顺着思路化简:

\[\begin{aligned}\hat{G}(n,x)&=\frac{e^{nx}-1}{1-e^{-x}}\\&=\left(\frac{xe^x}{e^x-1}\right)\left(\frac{e^{nx}-1}{x}\right)\end{aligned}\]

则右边:\(\displaystyle\frac{e^{nx}-1}{x}=\mathbf{EGF}\left\{\left[n,\frac{n^2}{2},\frac{n^3}{3},\ldots\right]\right\}\)

设左边的生成函数对应的级数为 \(B\),即:

\[\frac{xe^x}{e^x-1}=\hat{B}(x)=\mathbf{EGF}\left\{\left[B_0,B_1,B_2,\ldots\right]\right\}=\sum_{i=0}^{\infty}\frac{B_i}{i!}x^i\]

我们知道指数型生成函数的乘积对应了其对应级数的二项卷积,我们把式子写成二项卷积的形式:

\[\begin{aligned}\hat{G}(n,x)&=\hat{B}(x)\cdot\mathbf{EGF}\left\{\left[n,\frac{n^2}{2},\frac{n^3}{3},\ldots\right]\right\}\\\therefore\forall k\ge 0,S_k(n)&=\sum_{j=0}^{k}\binom{k}{j}B_j\frac{n^{k-j+1}}{k-j+1}\\\therefore\sum_{i=1}^{n}i^k&=\frac{1}{k+1}\sum_{j=0}^{k}\binom{k+1}{j}B_jn^{k-j+1}\end{aligned}\]

则得到最终的式子:\(\displaystyle\sum_{i=1}^{n}i^k=\frac{1}{k+1}\sum_{j=0}^{k}\binom{k+1}{j}B_jn^{k-j+1}\)

其中 \(B\) 就是所称的“伯努利数”:\(\displaystyle\mathbf{EGF}\left\{B\right\}=\frac{xe^x}{e^x-1}\)

其前 \(15\) 项为:

\[\begin{aligned}B_0&=1&B_1&=\frac{1}{2}&B_2&=\frac{1}{6}&B_3&=0&B_4&=-\frac{1}{30}\\B_5&=0&B_6&=\frac{1}{42}&B_7&=0&B_8&=-\frac{1}{30}&B_9&=0\\B_{10}&=\frac{5}{66}&B_{11}&=0&B_{12}&=-\frac{691}{2730}&B_{13}&=0&B_{14}&=\frac{7}{6}\end{aligned}\]

容易看出除了 \(\displaystyle B_1=\frac{1}{2}\),其它奇数位置的项均为 \(0\)


考虑如何求出伯努利数。

从生成函数的角度考虑,有:\(\displaystyle B_n=n![x^n]\frac{\displaystyle\sum_{i=0}^{\infty}\frac{1}{i!}x^i}{\displaystyle\sum_{i=0}^{\infty}\frac{1}{(i+1)!}x^i}\)

这是适宜使用多项式求逆和卷积在 \(\mathcal{O}(n\log n)\) 的时间复杂度内求出前 \(n\) 个伯努利数的方法。


想求伯努利数,不想写多项式,怎么办?

没关系,我们可以通过生成函数反推出递推式,考虑如下式子:

\[\begin{aligned}\hat{B}(x)\cdot\frac{e^x-1}{x}&=e^x\\\mathbf{EGF}\left\{B\right\}\cdot\mathbf{EGF}\left\{\left[1,\frac{1}{2},\frac{1}{3},\ldots\right]\right\}&=\mathbf{EGF}\left\{\left[1,1,1,\ldots\right]\right\}\\\sum_{i=0}^{n}\binom{n}{i}B_i\frac{1}{n-i+1}&=1\\\sum_{i=0}^{n}\binom{n+1}{i}B_i&=n+1\end{aligned}\]

那么以 \(B_0=1\) 为边界,按照递推式 \(\displaystyle B_n=1-\frac{1}{n+1}\sum_{i=0}^{n-1}\binom{n+1}{i}B_i\)
即可依次计算出 \(B_i\) 的值,假设需要处理前 \(m\) 个伯努利数,则复杂度为 \(\mathcal{O}(m^2)\)


参考资料:
Bernoulli number, Wikipedia。
康复计划#3 简单常用的几种计算自然数幂和的方法, MoebiusMeow。
@_rqy 在 Universal OJ 用户群中的解答。

posted @ 2019-07-07 00:44 粉兔 阅读(...) 评论(...) 编辑 收藏