伯努利数
伯努利数 𝐵𝑛
是一个与数论有密切关联的有理数序列。前几项被发现的伯努利数分别为:
𝐵0 =1,𝐵1 = −12,𝐵2 =16,𝐵3 =0,𝐵4 = −130,…
等幂求和
伯努利数是由雅各布·伯努利的名字命名的,他在研究 𝑚
次幂和的公式时发现了奇妙的关系。我们记
𝑆𝑚(𝑛)=𝑛−1∑𝑘=0𝑘𝑚=0𝑚+1𝑚+⋯+(𝑛−1)𝑚
伯努利观察了如下一列公式,勾画出一种模式:
𝑆0(𝑛)=𝑛𝑆1(𝑛)=12𝑛2−12𝑛𝑆2(𝑛)=13𝑛3−12𝑛2+16𝑛𝑆3(𝑛)=14𝑛4−12𝑛3+14𝑛2𝑆4(𝑛)=15𝑛5−12𝑛4+13𝑛3−130𝑛
可以发现,在 𝑆𝑚(𝑛)
中 𝑛𝑚+1
的系数总是 1𝑚+1
,𝑛𝑚
的系数总是 −12
,𝑛𝑚−1
的系数总是 𝑚12
,𝑛𝑚−3
的系数是 −𝑚(𝑚−1)(𝑚−2)720
,𝑛𝑚−4
的系数总是零等。
而 𝑛𝑚−𝑘
的系数总是某个常数乘以 𝑚𝑘――
,𝑚𝑘――
表示下降阶乘幂,即 𝑚!(𝑚−𝑘)!
。
递推公式
𝑆𝑚(𝑛)=1𝑚+1(𝐵0𝑛𝑚+1+(𝑚+11)𝐵1𝑛𝑚+⋯+(𝑚+1𝑚)𝐵𝑚𝑛)=1𝑚+1𝑚∑𝑘=0(𝑚+1𝑘)𝐵𝑘𝑛𝑚+1−𝑘
伯努利数由隐含的递推关系定义:
𝑚∑𝑗=0(𝑚+1𝑗)𝐵𝑗=0,(𝑚>0)𝐵0=1
例如,(20)𝐵0 +(21)𝐵1 =0
,前几个值显然是
𝑛 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … |
---|
𝐵𝑛 | 1 | −12 | 16 | 0 | −130 | 0 | 142 | 0 | −130 | … |
证明
利用归纳法证明
这个证明方法来自 Concrete Mathematics 6.5 BERNOULLI NUMBER。
运用二项式系数的恒等变换和归纳法进行证明:
𝑆𝑚+1(𝑛)+𝑛𝑚+1=𝑛−1∑𝑘=0(𝑘+1)𝑚+1=𝑛−1∑𝑘=0𝑚+1∑𝑗=0(𝑚+1𝑗)𝑘𝑗=𝑚+1∑𝑗=0(𝑚+1𝑗)𝑆𝑗(𝑛)
令 ˆ𝑆𝑚(𝑛) =1𝑚+1∑𝑚𝑘=0(𝑚+1𝑘)𝐵𝑘𝑛𝑚+1−𝑘
,我们希望证明 𝑆𝑚(𝑛) =ˆ𝑆𝑚(𝑛)
,假设对 𝑗 ∈[0,𝑚)
,有 𝑆𝑗(𝑛) =ˆ𝑆𝑗(𝑛)
。
将原式中两边都减去 𝑆𝑚+1(𝑛)
后可以得到:
𝑆𝑚+1(𝑛)+𝑛𝑚+1=𝑚+1∑𝑗=0(𝑚+1𝑗)𝑆𝑗(𝑛)𝑛𝑚+1=𝑚∑𝑗=0(𝑚+1𝑗)𝑆𝑗(𝑛)=𝑚−1∑𝑗=0(𝑚+1𝑗)ˆ𝑆𝑗(𝑛)+(𝑚+1𝑚)𝑆𝑚(𝑛)
尝试在式子的右边加上 (𝑚+1𝑚)ˆ𝑆𝑚(𝑛) −(𝑚+1𝑚)ˆ𝑆𝑚(𝑛)
再进行化简,可以得到:
𝑛𝑚+1=𝑚∑𝑗=0(𝑚+1𝑗)ˆ𝑆𝑗(𝑛)+(𝑚+1)(𝑆𝑚(𝑛)−ˆ𝑆𝑚(𝑛))
不妨设 Δ =𝑆𝑚(𝑛) −ˆ𝑆𝑚(𝑛)
,并且将 ˆ𝑆𝑗(𝑛)
展开,那么有
𝑛𝑚+1=𝑚∑𝑗=0(𝑚+1𝑗)ˆ𝑆𝑗(𝑛)+(𝑚+1)Δ=𝑚∑𝑗=0(𝑚+1𝑗)1𝑗+1𝑗∑𝑘=0(𝑗+1𝑘)𝐵𝑘𝑛𝑗+1−𝑘+(𝑚+1)Δ
将第二个 ∑
中的求和顺序改为逆向,再将组合数的写法恒等变换可以得到:
𝑛𝑚+1=𝑚∑𝑗=0(𝑚+1𝑗)1𝑗+1𝑗∑𝑘=0(𝑗+1𝑗−𝑘)𝐵𝑗−𝑘𝑛𝑘+1+(𝑚+1)Δ=𝑚∑𝑗=0(𝑚+1𝑗)1𝑗+1𝑗∑𝑘=0(𝑗+1𝑘+1)𝐵𝑗−𝑘𝑛𝑘+1+(𝑚+1)Δ=𝑚∑𝑗=0(𝑚+1𝑗)1𝑗+1𝑗∑𝑘=0𝑗+1𝑘+1(𝑗𝑘)𝐵𝑗−𝑘𝑛𝑘+1+(𝑚+1)Δ=𝑚∑𝑗=0(𝑚+1𝑗)𝑗∑𝑘=0(𝑗𝑘)𝐵𝑗−𝑘𝑘+1𝑛𝑘+1+(𝑚+1)Δ
对两个求和符号进行交换,可以得到:
𝑛𝑚+1=𝑚∑𝑘=0𝑛𝑘+1𝑘+1𝑚∑𝑗=𝑘(𝑚+1𝑗)(𝑗𝑘)𝐵𝑗−𝑘+(𝑚+1)Δ
对 (𝑚+1𝑗)(𝑗𝑘)
进行恒等变换:
(𝑚+1𝑗)(𝑗𝑘)=(𝑚+1𝑘)(𝑚−𝑘+1𝑗−𝑘)
那么式子就变成了:
𝑛𝑚+1=𝑚∑𝑘=0𝑛𝑘+1𝑘+1𝑚∑𝑗=𝑘(𝑚+1𝑘)(𝑚−𝑘+1𝑗−𝑘)𝐵𝑗−𝑘+(𝑚+1)Δ=𝑚∑𝑘=0𝑛𝑘+1𝑘+1(𝑚+1𝑘)𝑚∑𝑗=𝑘(𝑚−𝑘+1𝑗−𝑘)𝐵𝑗−𝑘+(𝑚+1)Δ
将所有的 𝑗 −𝑘
用 𝑗
代替,那么就可以得到:
𝑛𝑚+1=𝑚∑𝑘=0𝑛𝑘+1𝑘+1(𝑚+1𝑘)𝑚−𝑘∑𝑗=0(𝑚−𝑘+1𝑗)𝐵𝑗+(𝑚+1)Δ
考虑我们前面提到过的递归关系
𝑚∑𝑗=0(𝑚+1𝑗)𝐵𝑗=0,(𝑚>0)𝐵0=1𝑚∑𝑗=0(𝑚+1𝑗)𝐵𝑗=[𝑚=0]![\begin{aligned}
\sum_{j=0}^{m}\binom{m+1}{j}B_j&=0,(m>0)\\
B_0&=1\\
\sum_{j=0}^{m}\binom{m+1}{j}B_j&=[m = 0]
\end{aligned}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
代入后可以得到:
𝑛𝑚+1=𝑚∑𝑘=0𝑛𝑘+1𝑘+1(𝑚+1𝑘)[𝑚−𝑘=0]+(𝑚+1)Δ=𝑚∑𝑘=0𝑛𝑘+1𝑘+1(𝑚+1𝑘)+(𝑚+1)Δ=𝑛𝑚+1𝑚+1(𝑚+1𝑚)+(𝑚+1)Δ=𝑛𝑚+1+(𝑚+1)Δ![\begin{aligned}
n^{m+1}&=\sum_{k=0}^{m}\frac{n^{k+1}}{k+1}\binom{m+1}{k}[m - k = 0]+(m+1)\Delta\\
&=\sum_{k=0}^{m}\frac{n^{k+1}}{k+1}\binom{m+1}{k}+(m+1)\Delta\\
&=\frac{n^{m+1}}{m+1}\binom{m+1}{m}+(m+1)\Delta\\
&=n^{m+1}+(m+1)\Delta
\end{aligned}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
于是 Δ =0
,且有 𝑆𝑚(𝑛) =ˆ𝑆𝑚(𝑛)
。
利用指数生成函数证明
对递推式 ∑𝑚𝑗=0(𝑚+1𝑗)𝐵𝑗 =[𝑚 =0]![\sum_{j=0}^{m}\binom{m+1}{j}B_j=[m=0]](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
两边都加上 𝐵𝑚+1
,即得到:
𝑚+1∑𝑗=0(𝑚+1𝑗)𝐵𝑗=[𝑚=0]+𝐵𝑚+1𝑚∑𝑗=0(𝑚𝑗)𝐵𝑗=[𝑚=1]+𝐵𝑚𝑚∑𝑗=0𝐵𝑗𝑗!⋅1(𝑚−𝑗)!=[𝑚=1]+𝐵𝑚𝑚!![\begin{aligned}
\sum_{j=0}^{m+1}\binom{m+1}{j}B_j&=[m=0]+B_{m+1}\\
\sum_{j=0}^{m}\binom{m}{j}B_j&=[m=1]+B_{m}\\
\sum_{j=0}^{m}\dfrac{B_j}{j!}\cdot\dfrac{1}{(m-j)!}&=[m=1]+\dfrac{B_{m}}{m!}
\end{aligned}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
设 𝐵(𝑧) =∑𝑖≥0𝐵𝑖𝑖!𝑧𝑖
,注意到左边为卷积形式,故:
𝐵(𝑧)e𝑧=𝑧+𝐵(𝑧)𝐵(𝑧)=𝑧e𝑧−1
设 𝐹𝑛(𝑧) =∑𝑚≥0𝑆𝑚(𝑛)𝑚!𝑧𝑚
,则:
𝐹𝑛(𝑧)=∑𝑚≥0𝑆𝑚(𝑛)𝑚!𝑧𝑚=∑𝑚≥0𝑛−1∑𝑖=0𝑖𝑚𝑧𝑚𝑚!
调换求和顺序:
𝐹𝑛(𝑧)=𝑛−1∑𝑖=0∑𝑚≥0𝑖𝑚𝑧𝑚𝑚!=𝑛−1∑𝑖=0e𝑖𝑧=e𝑛𝑧−1e𝑧−1=𝑧e𝑧−1⋅e𝑛𝑧−1𝑧
代入 𝐵(𝑧) =𝑧e𝑧−1
:
𝐹𝑛(𝑧)=𝐵(𝑧)⋅e𝑛𝑧−1𝑧=(∑𝑖≥0𝐵𝑖𝑖!)(∑𝑖≥1𝑛𝑖𝑧𝑖−1𝑖!)=(∑𝑖≥0𝐵𝑖𝑖!)(∑𝑖≥0𝑛𝑖+1𝑧𝑖(𝑖+1)!)
由于 𝐹𝑛(𝑧) =∑𝑚≥0𝑆𝑚(𝑛)𝑚!𝑧𝑚
,即 𝑆𝑚(𝑛) =𝑚![𝑧𝑚]𝐹𝑛(𝑧)
:
𝑆×𝑚(𝑛)=𝑚![𝑧𝑚]𝐹𝑛(𝑧)=𝑚!𝑚∑𝑖=0𝐵×𝑖𝑖!⋅𝑛𝑚−𝑖+1(𝑚−𝑖+1)!=1𝑚+1𝑚∑𝑖=0(𝑚+1𝑖)𝐵𝑖𝑛𝑚−𝑖+1![\begin{aligned}
S \times m(n)&=m![z^m]F_n(z)\\
&= m!\sum_{i=0}^{m}\dfrac{B \times i}{i!}\cdot\dfrac{n^{m-i+1}}{(m-i+1)!}\\
&=\dfrac{1}{m+1}\sum_{i=0}^{m}\binom{m+1}{i}B_in^{m-i+1}
\end{aligned}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
故得证。
参考实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | 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;
}
}
|
本页面最近更新:2025/5/3 19:43:25,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:StudyingFather, Enter-tainer, ShaoChenHeng, Tiphereth-A, Aquistcev, c-forrest, Great-designer, Ir1d, kenlig, ksyx, OkazakiYumemi, Xeonacid
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用