开个小坑,介绍自然数幂和(等幂求和)问题以及相关算法。

等幂求和问题

等幂求和问题(Faulhaber’s formula)1 指计算多项式

的值。

对于较小的情况:

  • 时有
  • 时有

插值法

使用插值法计算的主要方式是,先利用多项式的个点值得出该多项式的表示,然后用此表示来计算点值。

拉格朗日插值法

如果只是单点求值,那么可以直接利用拉格朗日多项式

来计算。单次求值的时间复杂度是

如果取,那么在模意义下可以使用阶乘及其逆元来进一步优化,做到的时间计算点值。

如果要得到的系数表示,那么暴力模拟多项式展开的过程是的。

使用缺一背包的方式分治计算可以做到

差分法

)共个点,然后将其差分。

具体地,设表示差分的次数,。那么有

这实际上是求出了的下降幂表示。利用斯特林数的变换:

我们也可以在的时间内将其转化为常幂系数表示。

代码

二项式定理

利用二项式定理也可以计算等幂求和,其主要思想是通过差分、裂项等方法构造等式,推导递推式。首先

通过移项构造一个差分形式:

这样就能得到

然后我们再次移项得到的递推式:

所以整理一下得到

斯特林数

使用斯特林数计算等幂求和的要点在于构造递归式。由下降幂转通常幂的公式:

移项得到

所以我们把这个公式代入等幂求和公式得到

这样我们就可以递归求解了。

伯努利数

等幂求和也可以借助伯努利数2相关的知识计算。伯努利数序列并不具有直观含义,但其指数生成函数(EGF)为

为了推导等幂求和的系数表示,我们先介绍伯努利多项式的定义:

伯努利多项式实际上是一个序列,这个序列的每一个元素都是个多项式。

因此我们可以求出这个序列的指数生成函数(多项式序列的生成函数):

写成下标是因为这个生成函数中作为主要的占位符。接下来我们推导其封闭形式:

接下来我们将其差分:

这对应的是序列的 EGF。将其展开得到

因此我们得到,即

我们将表示为了差分的形式,因此我们可以裂项相消:

这样我们就直接得到了的系数表示。

1. https://en.wikipedia.org/wiki/Faulhaber%27s_formula

2. https://zh.wikipedia.org/zh-cn/%E4%BC%AF%E5%8A%AA%E5%88%A9%E6%95%B0