伯努利数 Bn 是一个与数论有密切关联的有理数序列。前几项被发现的伯努利数分别为:
B0=1,B1=−21,B2=61,B3=0,B4=−301,…
等幂求和
伯努利数是由雅各布·伯努利的名字命名的,他在研究 m 次幂和的公式时发现了奇妙的关系。我们记
Sm(n)=k=0∑n−1km=0m+1m+⋯+(n−1)m
伯努利观察了如下一列公式,勾画出一种模式:
S0(n)S1(n)S2(n)S3(n)S4(n)=n=21n2−21n=31n3−21n2+61n=41n4−21n3+41n2=51n5−21n4+31n3−301n
可以发现,在 Sm(n) 中 nm+1 的系数总是 m+11,nm 的系数总是 −21,nm−1 的系数总是 12m,nm−3 的系数是 −720m(m−1)(m−2),nm−4 的系数总是零等。
而 nm−k 的系数总是某个常数乘以 mk,mk 表示下降阶乘幂,即 (m−k)!m!。
递推公式
Sm(n)=m+11(B0nm+1+(1m+1)B1nm+⋯+(mm+1)Bmn)=m+11k=0∑m(km+1)Bknm+1−k
伯努利数由隐含的递推关系定义:
j=0∑m(jm+1)BjB0=0,(m>0)=1
例如,(02)B0+(12)B1=0,前几个值显然是
| n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … |
|---|
| Bn | 1 | −21 | 61 | 0 | −301 | 0 | 421 | 0 | −301 | … |
证明
利用归纳法证明
这个证明方法来自 Concrete Mathematics 6.5 BERNOULLI NUMBER。
运用二项式系数的恒等变换和归纳法进行证明:
Sm+1(n)+nm+1=k=0∑n−1(k+1)m+1=k=0∑n−1j=0∑m+1(jm+1)kj=j=0∑m+1(jm+1)Sj(n)
令 S^m(n)=m+11∑k=0m(km+1)Bknm+1−k,我们希望证明 Sm(n)=S^m(n),假设对 j∈[0,m),有 Sj(n)=S^j(n)。
将原式中两边都减去 Sm+1(n) 后可以得到:
Sm+1(n)+nm+1nm+1=j=0∑m+1(jm+1)Sj(n)=j=0∑m(jm+1)Sj(n)=j=0∑m−1(jm+1)S^j(n)+(mm+1)Sm(n)
尝试在式子的右边加上 (mm+1)S^m(n)−(mm+1)S^m(n) 再进行化简,可以得到:
nm+1=j=0∑m(jm+1)S^j(n)+(m+1)(Sm(n)−S^m(n))
不妨设 Δ=Sm(n)−S^m(n),并且将 S^j(n) 展开,那么有
nm+1=j=0∑m(jm+1)S^j(n)+(m+1)Δ=j=0∑m(jm+1)j+11k=0∑j(kj+1)Bknj+1−k+(m+1)Δ
将第二个 ∑ 中的求和顺序改为逆向,再将组合数的写法恒等变换可以得到:
nm+1=j=0∑m(jm+1)j+11k=0∑j(j−kj+1)Bj−knk+1+(m+1)Δ=j=0∑m(jm+1)j+11k=0∑j(k+1j+1)Bj−knk+1+(m+1)Δ=j=0∑m(jm+1)j+11k=0∑jk+1j+1(kj)Bj−knk+1+(m+1)Δ=j=0∑m(jm+1)k=0∑j(kj)k+1Bj−knk+1+(m+1)Δ
对两个求和符号进行交换,可以得到:
nm+1=k=0∑mk+1nk+1j=k∑m(jm+1)(kj)Bj−k+(m+1)Δ
对 (jm+1)(kj) 进行恒等变换:
(jm+1)(kj)=(km+1)(j−km−k+1)
那么式子就变成了:
nm+1=k=0∑mk+1nk+1j=k∑m(km+1)(j−km−k+1)Bj−k+(m+1)Δ=k=0∑mk+1nk+1(km+1)j=k∑m(j−km−k+1)Bj−k+(m+1)Δ
将所有的 j−k 用 j 代替,那么就可以得到:
nm+1=k=0∑mk+1nk+1(km+1)j=0∑m−k(jm−k+1)Bj+(m+1)Δ
考虑我们前面提到过的递归关系
j=0∑m(jm+1)BjB0j=0∑m(jm+1)Bj=0,(m>0)=1=[m=0]
代入后可以得到:
nm+1=k=0∑mk+1nk+1(km+1)[m−k=0]+(m+1)Δ=k=0∑mk+1nk+1(km+1)+(m+1)Δ=m+1nm+1(mm+1)+(m+1)Δ=nm+1+(m+1)Δ
于是 Δ=0,且有 Sm(n)=S^m(n)。
利用指数生成函数证明
对递推式 ∑j=0m(jm+1)Bj=[m=0]
两边都加上 Bm+1,即得到:
j=0∑m+1(jm+1)Bjj=0∑m(jm)Bjj=0∑mj!Bj⋅(m−j)!1=[m=0]+Bm+1=[m=1]+Bm=[m=1]+m!Bm
设 B(z)=i≥0∑i!Bizi,注意到左边为卷积形式,故:
B(z)ezB(z)=z+B(z)=ez−1z
设 Fn(z)=∑m≥0m!Sm(n)zm,则:
Fn(z)=m≥0∑m!Sm(n)zm=m≥0∑i=0∑n−1m!imzm
调换求和顺序:
Fn(z)=i=0∑n−1m≥0∑m!imzm=i=0∑n−1eiz=ez−1enz−1=ez−1z⋅zenz−1
代入 B(z)=ez−1z:
Fn(z)=B(z)⋅zenz−1=(i≥0∑i!Bi)(i≥1∑i!nizi−1)=(i≥0∑i!Bi)(i≥0∑(i+1)!ni+1zi)
由于 Fn(z)=∑m≥0m!Sm(n)zm,即 Sm(n)=m![zm]Fn(z):
S×m(n)=m![zm]Fn(z)=m!i=0∑mi!B×i⋅(m−i+1)!nm−i+1=m+11i=0∑m(im+1)Binm−i+1
故得证。
using ll = long long;
constexpr int MAXN = 10000;
constexpr int mod = 1e9 + 7;
ll B[MAXN]; // 伯努利数
ll C[MAXN][MAXN]; // 组合数
ll inv[MAXN]; // 逆元(计算伯努利数)
void init() {
// 预处理组合数
for (int i = 0; i < MAXN; i++) {
C[i][0] = C[i][i] = 1;
for (int k = 1; k < i; k++) {
C[i][k] = (C[i - 1][k] % mod + C[i - 1][k - 1] % mod) % mod;
}
}
// 预处理逆元
inv[1] = 1;
for (int i = 2; i < MAXN; i++) {
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
// 预处理伯努利数
B[0] = 1;
for (int i = 1; i < MAXN; i++) {
ll ans = 0;
if (i == MAXN - 1) break;
for (int k = 0; k < i; k++) {
ans += C[i + 1][k] * B[k];
ans %= mod;
}
ans = (ans * (-inv[i + 1]) % mod + mod) % mod;
B[i] = ans;
}
}