具体数学
本文是阅读《具体数学》产生的理解性文本,并且涵盖了部分其他相关的内容。
不怎么重要或者太难的东西因为时间问题,我略过了。
本文来之不易,请勿机械搬运:原文地址 - https://www.cnblogs.com/jeefy/p/17848037.html
第二章 - 和式
和式的处理
和式是一切的基础,其三个法则十分重要:
∑k∈Kcak=c∑k∈Kak(1.1)
∑k∈K(ak+bk)=∑k∈Kak+∑k∈Kbk(1.2)
∑k∈Kak=∑p(k)∈Kap(k)(1.3)
其中 (1.1) 代表着分配律,(1.2) 代表的结合律,而 (1.3) 代表的交换律。
我们可以通过这三种法则证明高斯给出的等差数列求和的公式:
∑0≤k≤n(a+bk)=∑0≤n−k≤n(a+b(n−k))=∑0≤k≤n(a+bn−bk)=12(∑0≤k≤n(a+bn−bk)+∑0≤k≤n(a+bk))=12(∑0≤k≤n(2a+bn))=12(2a+bn)∑0≤k≤n1=12(2a+bn)(n+1)
其中 0→1→2 我们用了两次交换律,在 4 用了结合律,在 5 用了分配律。
常常我们化简式子可能就是这些法则的排列组合。
对于多重和式,我们有着一个新的技巧:交换求和次序
∑j∑kaj,k[P(j,k)]=∑P(j,k)aj,k=∑k∑jaj,k[P(j,k)]
其中 [P(j,k)] 是用于验证 j,k 的组合是否合法的符号,如果合法则为 1,反之为 0。
也就是说我们并不在意我们到底先枚举的是哪一个变量,但是有些时候枚举另一个变量确实可能简单很多。
我们可以通过这个法则阐释矩阵乘法的结合律:
M=(AB)C=A(BC)
Mi,j=∑k(AB)i,k×Ck,j=∑k(∑zAi,z×Bz,k)×Ck,j=∑k∑zAi,z×Bz,k×Ck,j=∑zAi,z(∑kBz,k×Ck,j)=∑zAi,z×(BC)z,j
于是我们可以从和式的角度了解到矩阵乘法确实满足结合律。
有限微积分
较好的参考文章:有限微积分与数列求和 - LUNATIC time!
在离散数学中,最小的单位就是 1,那么如果要把无限微积分那一套搞过来,那么 Df(x) 中的 D 的含义就必须发生变化。
定义差分算子 Δf(x)=f(x+1)−f(x),可以看到这与 Df(x)=limh→0f(x+h)−f(x)h 十分的相似。
对于无限微积分来说,D(xn)=nxn−1 是个非常优美的性质。
然而 Δ(xn) 却是十分的丑陋,于是需要找到新的代替品:
Δ(xn––)=nxn−1–––––
其中 xn––=x(x−1)(x−2)⋯(x−n+1)。
有了类似的微分,我们需要考虑积分。在无限微积分中,我们有 ∫bag(x)dx=f(x)|ba=f(b)−f(a),其中 g(x)=Df(x)。
而在有限微积分中,我们有另外一个东西:
∑bag(x)δx=f(x)|ba=f(b)−f(a)(2.1)
其中 g(x)=Δf(x)。
这是一个左闭右开区间,所以我们可以简单的合并几个和式:∑ba+∑cb=∑ca。
我们可以通过这个法则简单的得到 xn–– 的求和公式。
考虑 Δ(xn––)=nxn−1––––– 的事实,我们可以推知 1m+1((x+1)n+1–––––−(x)n+1–––––)=xn––。
也就是若 g(x)=xn––,那么存在 f(x)=1n+1xn+1––––– 满足 Δf(x)=g(x)。
那么此时我们可以得到:
∑0≤k<nkm––=∑n0km––δx=km+1––––––m+1∣∣∣n0=nm+1––––––m+1
在这个过程中,对于下标 0≤k<n 告诉我们,左闭右开区间一般比闭区间更好处理!
但是这个过程并不完美,因为我们没有考虑到 m=−1 的情况。
考虑 x−1–––=1x+1,于是我们可以得知 ∑0≤k<nk−1–––=Hk|n0=Hn !
其中 Hn=∑1≤k≤n1k,这是一个类似于 lnn 的东西,两者的差值并不会太大。
分部求和
无限微积分中,乘法求导有一个公式:D(uv)=uDv+vDu,那么有限微积分中是否也有类似的产物?
将差分算子运用在两个函数上:
Δ(f(x)g(x))=f(x+1)g(x+1)−f(x)g(x)=(f(x+1)g(x+1)−f(x)g(x+1))+(f(x)g(x+1)−f(x)g(x))=f(x)(g(x+1)−g(x))+(f(x+1)−f(x))g(x+1)=f(x)Δg(x)+g(x+1)Δf(x)
如果我们定义位移算子 E=Δ−1,也就是 Ef(x)=f(x+1),那么我们有:
Δ(uv)=uΔv+EvΔu=vΔu+EuΔv
我们重新排布一下两边,并且对于各自求一个和,那么我们就可以得到部分求和法则:
∑bauΔv=uv|ba−∑baEvΔu(2.2)
它的作用在于一个和式两部分不太好求,但是一部分是某一个简单式子的差分形式,另一部分有着一个简单的差分形式,那么我们可以通过这种方式进行尝试。
n−1∑k=0k2k=∑n0x2xδx
我们可以知道,f(x)=x 有着 Δf(x)=1 的优秀形式,而 Δ(2k)=2k,于是利用部分求和法则:
∑n0x2xδx=x2x|n0−∑n02x+1δx
对于第二部分是一个简单的等比数列形式,那么我们可以得知:
n−1∑k=0k2k=n2n−(2n+1−2)=(n−2)2n+2
现在我们尝试看另外一个例子:
∑n0xk––axδx(a≠1)(2.3)
其中 xk–– 有简单的差分形式,而 ax 是 axa−1 的差分形式,那么我们可以化为:
=xk––axa−1∣∣∣n0−∑n0ax+1a−1kxk−1–––––=nk––ana−1−aka−1∑n0axxk−1–––––δx
这个式子我们需要保证 k≠0 才是正确的,否则,nk––an 应当写为 nk––an−0k––a0 以避免分讨。
此时我们发现后半部分的式子是一摸一样的,所以考虑设 Sk=∑n0xk––axδx,那么根据上式,我们有:
Sk=nk––an−0k––a0a−1−aka−1Sk−1
其中,若 k=0 时,有 S0=∑n0axδx=an−1a−1,于是我们可以 O(k) 的递推求出这个式子。
我们可以尝试进行展开:
Sk=k∏j=1(−aja−1)S0+k∑i=1ni–an−0i–a0a−1k∏j=i+1(−aja−1)=(−aa−1)kkk––n0–an−1a−1+k∑i=1ni–an−0i–a0a−1(−aa−1)k−ikk−i––––=k∑i=0ni–an−0i–a0a−1(−aa−1)k−ikk−i––––=1a−1k∑i=0(−aa−1)k−ikk−i––––(nk––an−0k––a0)
得到了其较为简单的非递归式,然而其是否存在封闭形式?目前看来并没有。
小练习:
∑xHxδx
第四章 - 数论
阶乘的因子
常见的问题为 n! 中有多少个因子 p。
我们常见的想法是考虑有 k 个因子 p 的数有多少个,但是这是不好算的,考虑至少有 k 个因子的有多少个。
简单的,显然的,这就是 ⌊npk⌋,于是乎恰好有 k 个因子的数有 ⌊npk⌋−⌊npk+1⌋,于是我们得到式子:
∑kk(⌊npk⌋−⌊npk+1⌋)
这太丑陋了,小小展开,我们其是就发现更简单的形式:
∑k≥1⌊npk⌋
有了这个,或许我们就可以证明 Kummer 定理了:
(n+mm) 中素因子 p 的次数 = n,m 在 p 进制下做加法的进位次数 。
注意到 n! 中 p 的次数为 ∑i=0⌊npi⌋
于是对于 (n+mm)=(n+m)!n!m!
因子的个数为 ∑i=0⌊n+mpi⌋−⌊npi⌋−⌊mpi⌋
也就是说只有 n+m 在这里进位了才能逃离被删除的宿命……并且由此还可以证明其因数 p 的个数不超过 logp(n+m)。
互素
在书上的典型结构是 Stern-Brocot 树。它大概长这样:

每次得到的新的分数是由左右两个祖先 mn,m′n′ 拼凑而来:m+m′n+n′
如果继续观察,每一层相邻的两个数 mn,m′n′ 一定满足:
m′n−mn′=1
这意味着一定满足 mn<m′n′⟺m′n−mn′>0(因为这里保证 n>0)
这意味着如果我们有其相邻的分数的信息,我们就可以找到它。
我们可以通过矩阵的形式来表示:
(nn′mm′)→n+n′m+m′
我们考虑向左一步,那么左侧的不变,右侧的变成自己:
(nn′mm′)(1101)→(nn+n′mm+m′)
向右一步则是左侧变成自己,右侧不变:
(nn′mm′)(1011)→(n+n′n′m+m′m′)
于是我们可以简单的二叉搜索出某个分数在树上的位置。
第五章 - 二项式系数
二项式系数有很具体的用处,但是想要用好却不是那么容易。
比较细致的文章:# 二项式系数 - zhiyangfan 的小窝
主要是变化太多了,啥都能套一套。
我们对书中部分公式进行证明。
∑k(sk)(tm−k)=(s+tm)(5.1)
(5.1) 是范德蒙德卷积,典。
∑k(sk)(tm+k)=∑k(sk)(tt−m−k)=(s+tt−m)(5.2)
(5.2) 是利用了恒等变换的范德蒙德卷积,前提是 t≥0。
∑k(−1)k(sm+k)(t+kn)=(−1)s+m(t−mn−s),s≥0(5.3)
原文中 (5.3) 的证明利用了对于 s 的归纳法,这里尝试给出变换性的证明。
=∑k(−1)k(sm+k)(t+kt+k−n)=∑k(−1)k(sm+k)(−1)t+k−n(−n−1t+k−n)=(−1)t−n∑k(sm+k)(−n−1t+k−n)=(−1)t−n(s−n−1s−m+t−n)=(−1)t−n(−1)s−m+t−n(t−mn−s)=(−1)s+m(t−mn−s)
但是这个变化步骤中有很大的漏洞:
- 在第一步 (t+kn)→(t+kt+k−n) 的过程中,我们并没有关注 t+k≥0 的条件,同样,在最后我们也没有关注 t+m≥0 的条件。
但是我太菜了,只能想到如此推导了……
上文是我自己思考的结果……QwQ
感谢 @British_Union 的提示
并感谢 @myee 给出的另一种证明的方法:多项式推理法。
我们发现如果我们能够保证 t>m,那么上述的问题都将不复存在,我们可以合理的如此推导。
而多项式推理法指的是我们可以发现如果 n,m,s 确定,那么这是一个关于 t 的 n−s 次多项式:
(−1)s+m(t−m)n−s–––––(n−s)!
对于等式左侧, 我们可以确定是其也是关于 t 的一个 n 次多项式,两者在满足 t>m 时相减存在无穷的零点,意味着相减后我们得出的多项式为常数多项式 f(x)=0,意味着两边相等。
于是我们可以合理的推出这个式子在 t 作为变量的情况下对于全体实数成立。
剩下的两个式子推导和这个是一样的套路,不再展开。
我们顺便多学习一下多项式推理法。
在正整数下,我们了解到帕斯卡恒等式的成立:
(rk)=(r−1k)+(r−1k−1)
我们可以知道两侧都是关于 r 的 k 次多项式,相减也一定是一个 k 次多项式。
而一个 d 次多项式至多有 d 个零点,所以两个 d 次多项式相减有两种情况:
- 至多 d 个零点,这意味着两者不尽相等。
- 无穷多个零点,此时相减出来的多项式正是 f(x)=0。
我们在此可以了解到在 Z+ 下等式成立,意味着减出来有无穷多个零点,也就意味着两者相等!
于是我们可以了解到这个恒等式在 r∈R 下成立!
来到新的挑战:
∑k≥0(n+k2k)(2kk)(−1)kk+1,n≥0
显然的我们利用三项式变化一下:
∑k≥0(n+kk)(nk)(−1)kk+1
利用 (nm)=nm(n−1m−1) 我们可以干掉 k+1:
∑k≥0(n+kk)(n+1k+1)(−1)kn+1
对于内部来说,我们可以利用恒等变换,再利用 (5.3) 的结果:
1n+1∑k(n+kn)(n+1k+1)(−1)k=1n+1(−1)n(n−1−1)=0
但是事实上这里也有同上的漏洞,(n+kk) 中 n+k 可能 <0 使得恒等变化后原本没有值的地方有了值,但是我们需要保证 k≥0,所以上面的变换不尽正确!
所以换一个尝试:
∑k≥0(−1)k(−n−1k)(n+1k+1)(−1)kn+1=1n+1(0n)
也就是当 n=0 非 0,即原式等价于 [n=0]。
通过如上两个例子,我们发现对称恒等式确实是一个陷阱……能别用就别用,除非能保证上指标 ≥0。
我们进入作业题,对于整数 n,m≥0,求出:
m∑j=1(−1)j+1(rj)n∑k=1(−j+rk+sm−j)
看着好恐怖,j 出现了 4 次!还有两个和式!不过这都是小问题。
我们尝试一点一点消掉他们。
首先观察到 (−j+rk+sm−j) 上下都有 −j,尝试利用上指标反转干掉一个:
m∑j=1n∑k=1(−1)j+1(rj)(−1)m−j(m−rk−s−1m−j)=(−1)m+1m∑j=1n∑k=1(rj)(m−rk−s−1m−j)
我们发现在 k 已知的情况下,这就类似一个范德蒙德卷积!于是改变求和顺序:
=(−1)m+1n∑k=1(−(r0)(m−rk−s−1m−j)+∑j(rj)(m−rk−s−1m−j))=(−1)m+1n∑k=1((m+r(1−k)−s−1m)−(m−rk−s−1m))
考虑外面有一个 (−1)m,内部的下指标都是 m,那么都反转一下,顺便将剩下的 −1 乘进去:
=n∑k=1((kr+sm)−((k−1)r+sm))=n∑k=1(kr+sm)−n∑k=1((k−1)r+sm)
稍微平移一下下标:
=n∑k=1(kr+sm)−n−1∑k=0(kr+sm)=(kn+sm)−(sm)
于是我们就得到了这个简单的封闭形式。
高阶差分与牛顿级数
这在 math 1.4
中讲了,内容参见 share-math。
第六章 - 特殊的数
斯特林数
斯特林数分为第一类和第二类。比较常用的是第二类。
第二类斯特林数 {nk} 的组合意义为讲 n 个物品的集合划分为 k 个非空子集的方法数。
利用这个意义我们可以引出一个递推式:
{nk}={n−1k−1}+k{n−1k}
分别指的是新开一个子集,或者放入某一个子集的方案数。
对于第一类斯特林数,其还对于每一个子集排成了环,形成了 k 个轮换(cycle)
对于每一个大小为 m 的子集,存在 (m−1)! 种轮换,由此可以看出存在 [nk]≥{nk}。
我们同样可以通过组合意义找到一个递推式:
[nk]=[n−1k−1]+(n−1)[n−1k]
分别指新开一个轮换,或者插入到某一个元素前面。
有了加法公式,那么很多时候我们就可以通过归纳法证明与之相关的内容了。
在这之前,我们可以讨论一下 [nk] 与排列的关系。
轮换加排列在组合数学中有另外一个体现:置换。
置换可以将一个排列划分为若干个有向圈,每一个有向圈对应着某一个轮换。
这意味着每一个排列都对应着一个子集轮换的方案,换言之:
∑k[nk]=n!
我们回到加法公式和归纳法上,关于 {nk} 有一个非常经典的等式:
xn=∑k{nk}xk––
我们一定可以通过归纳法证明它,考虑 x×xn=xn+1,或许我们能够对 n 进行归纳证明之。
先考虑 n=0 的情况,LHS=1,而 RHS={00}x0–=1,故 n=0 的时候成立。
对于 xn+1,我们如此考虑归纳:
xn=x×xn−1=x∑k{n−1k}xk––
我们考虑 x×xk–– 是否有很好的表达方式,发现可以通过 xk+1–––––=xk––(x−k) 得出:
x×xk––=xk+1–––––+kxk––
于是我们可以简单的将上式拆开:
∑k{n−1k}xk+1–––––+∑k{n−1k}kxk––=∑k{n−1k−1}xk––+∑k{n−1k}kxk––=∑k({n−1k−1}+k{n−1k})xk––=∑k{nk}xk––
于是归纳得证。
斯特林数有许许多多不那么常用的恒等式,所以并不太需要注意。
不过我们回到加法公式:
{nk}={n−1k−1}+k{n−1k}[nk]=[n−1k−1]+(n−1)[n−1k]
我们是否能够像:
(nk)=(n−1k)+(n−1k−1)
一样将他们推广到更多的地方?
事实上,如果我们先约定 {0k}=[0k]=[k=0] 以及 {k0}=[k0]=[k=0],那么我们就可以利用加法公式求出负数下 {nk} 的值!
如果将整个表画出来,那么我们将得到一个惊人整齐的等式:
[nk]={−n−k}
这容易利用加法公式验证。
第一类斯特林数并没有通项公式,但是第二类斯特林数却存在。
可以通过二项式反演简单的证明:
{nk}=1k!k∑i=0(ki)(−1)k−iin
或者写成稍微好看的一个形式:
{nk}=k∑i=0in(−1)k−ii!(k−i)!
当这个形式一出来,那么我们就可以知道如何快速的求一行斯特林数了。
设 F(x)=xni!,G(x)=(−1)xx!,那么知道:
{nk}=k∑i=0F(i)∗G(k−i)
于是我们可以通过 NTT
O(nlogn) 的求出整行的第二类斯特林数。
我们现在考虑是否能够快速的求出整列的斯特林数?
我们考虑一列斯特林数的生成函数:
Fk(x)=∑i{ik}xk
根据加法公式,我们有:
Fk(x)=xFk−1(x)+kxFk(x)
于是存在:
Fk(x)=x1−kxFk−1(x)
于是我们得到:
Fk(x)=xk∏ki=1(1−kx)
于是可以分治 NTT
和多项式取逆做即可。
然而实际上有办法避免多项式求逆的,但是有点复杂。
但是不合理,代码太抽象了,我们换一个方法,考虑 EGF。
F(e)k(x)=∑i{ik}xii!
将斯特林数拆开:
F(x)=∑ixii!k∑j=0jij!(−1)k−j(k−j)!=k∑j=0(−1)k−j(k−j)!j!∑i(jx)ii!=k∑j=0(−1)k−j(k−j)!j!ejx=1k!k∑j=0(ki)(−1)k−jejx=(ex−1)kk!
于是多项式快速幂即可。这只需要写一个 NTT
即可做到 O(nlognlogk)。
其实通过类似的方式,我们可以推导出第一类斯特林数行列的求法。
这里不做过多展开。
调和数
调和数 Hn=∑ni=11i,认为是离散下对于 lnn 的模拟,其误差 γ≈0.577215。
这是欧拉所证明的:limn→∞(Hn−lnn)=γ。
对于调和数我们还有一个与斯特林数挂钩的等式:
[n+12]=n!Hn(6.1)
考虑通过:
[n+12]=n[n2]+[n1]=n[n2]+(n−1)!
可以知道:
1n![n+12]=1(n−1)![n2]+1n
于是只需要展开这个递归式即可得到 (6.1)。
第一个例题较好,复习了分部求和法则:
∑0≤k<n(km)Hk
如果掌握的分部求和法则,那么这就比较简单,这里不再展开。
我们总是会遇到它的生成函数的,虽然这是之后的内容(也是后面回来写的)
学完生成函数和卷积以后,我们会了解到一个小技巧:生成函数前缀和。
具体来说,对于 ⟨fn⟩ 与 ⟨1,1,⋯⟩ 的卷积会得到 ⟨∑ni=0fi⟩。
在生成函数上的体现便是 F(x)→11−xF(x)。
我们可以利用这个技巧快速的算出 Hk 的生成函数。
考虑 Hn=∑ni=11i,那么实际上它就是 ⟨0,1,12,13,⋯⟩ 的前缀和。
后者实际上为 ln11−x,于是我们可以知道 Hn 的生成函数为:
11−xln11−x
补充,关于
ln11−x 表示
⟨0,1,12,13,⋯⟩ 的证明:
考虑 ln(1+x) 利用泰勒展开:
ln(1+x)=∑n≥0(−1)nn+1xn+1
利用 −x 代替 x 得到:
ln(1−x)=∑n≥0−xnn
于是我们只需要:
−ln(1−x)=ln(11−x)=∑n≥0xnn
斐波那契数
斐波那契数由如下递归式定义:
F0=0F1=1Fn=Fn−1+Fn−2,n>1
我们容易通过归纳法证明:
Fn=FkFn−k+Fk−1Fn−k−1(6.2)
同样,也可以通过矩阵乘法证明,参见 # 算法学习笔记(37): 矩阵
由此我们可以推出:
Fn|Fkn
可以通过 (6.2) 和归纳法简单的证明。
于是我们可以知道:
gcd(Fn,Fm)=Fgcd(n,m)
我曾经推了几个简单的式子:
- ∑F2i
- ∑F2i+1
- ∑Fi
- ∑(−1)iFi
- ∑F2i
推导和证明都很简单,但是可能可以将 ∑F2i 多提几句。
一般的代数推导就是打表+归纳就完事,高级一点展开 Fi=Fi−1+Fi−2 慢慢化简证明。
但是这里是有几何推导的:

这东西可以看作二维平面的矩形,那么对此就可以直接化简了!
n∑i=1F2i=FnFn+1
然而考虑是否可以继续推广?例如立方体。

如果单纯的相加,我们总是会发现缺了一块,但是该如何补齐这缺失的部分?
考虑将红色的这一块 FnFn−1Fn−2 补齐,那么就变成了一子问题,递归下去。

于是得到:∑(F3i+FiFi−1Fi−2)=F2nFn+1。
但是好像仍然不是我们想要的……恕我太菜也想不出来了。
线性递推
斐波那契数列衍生而出的另一个知识叫做递推,而递推就可以讲到线性齐次递推和非齐次递推。
或许我们需要先学会生成函数?
对于形如:
hn=k∑i=1aihn−i,n≥k
定义其特征方程为:
xk−k∑i=1aixk−i=0
根据代数基本定理,上式有 k 个根 q1,q2,⋯,qk,我们称之为特征根,那么:
hn=n∑i=1ciqni(6.3)
在下述意义下是原递推关系的通解:
无论给定如何的初值 h0,h1,⋯hk−1,都存在一组 c1,c2,⋯,ck 使之满足递推关系和初始条件。
换句话来说,是通解意味着对于任意给定的初值,都可以解出如下方程组:
⎧⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪⎩(n=0)c1q01+c2q02+⋯+ckq0k=h0(n=1)c1q11+c2q12+⋯+ckq1k=h1⋮⋮(n=k−1)c1qk−11+c2qk−12+⋯+ckqk−1k=h0
而此方程组的系数矩阵为:
⎡⎢
⎢
⎢
⎢
⎢⎣11⋯1q1q2⋯qk⋮⋮⋱⋮qk−11qk−12⋯qk−1k⎤⎥
⎥
⎥
⎥
⎥⎦
这显然是一个范德蒙德矩阵,其行列式为:
∏i<jqj−qi
也就是说,我们需要保证根互不相同,使得矩阵满秩(行列式不为 0)才可以求出唯一解。
然而实际上有另外一种利用生成函数的方法,更加简明。
继续沿用斐波那契数列的例子 fn=fn−1+fn−2。
设 F(x)=∑i≥0fixi 是其生成函数。
根据递推关系,我们可以得出 F(x)=xF(x)+x2F(x)。
具体来说,三个生成函数对应的序列如下:
F(x):<fn−1,fn,fn+1>xF(x):<fn−2,fn−1,fn>x2F(x):<fn−3,fn−2,fn−1>
于是 F(x)=11−x−x2 得出也就很自然了(当然这是错误的。
真的自然吗?我们是不是忘了什么东西?
确实,我们忘了一些东西,我们重新将三者写下来:
F(x):f0+f1x+f2xxF(x):f0x+f1xx2F(x):f0x2
也就是说 F(x)−xF(x)−x2F(x) 实际上 =f0+(f1−f0)x!
将初始值 f0=0,f1=1 带入,我们才真正地正确地得到其生成函数:
F(x)−xF(x)−x2F(x)=x→F(x)=x1−x−x2
如果我们得到了生成函数,我们是否能够确定其通项公式?答案是可以的。
我们将 x1−x−x2 稍微分解 =c1x−−1+√52+c2x−−1−√52。
可以列出方程简单的求解出 c1,c2 是什么。
我们通过 11−x=∑i≥0xi 各项展开,于是就可以得到其通项公式!
我们现在看看 1+√52 以及 1−√52 这两个数。
我们赋予了其一个符号,足以可见其重要程度:ϕ=1+√52,^ϕ=−1ϕ=1−√52。
这两个数是 1−x−x2=0 的根,故我们有:
ϕ2=ϕ+1,^ϕ2=^ϕ+1
我们通过这两个符号将 F(x) 写出来:
F(x)=x(x+ϕ)(x+^ϕ)=1√5(11−ϕx−11−^ϕx)
这形式很优美,我们之后将会用到。
通过幂级数展开,我们就得到了 fn 的通项公式:
fn=1√5(ϕn−^ϕn)
奇妙的是一堆 √5 乘起来就变成了一个整数!
来到更大的挑战:
hn=4hn−1−4hn−2,n≥2
我们是否能够找到其通项公式?
从特征根考虑:x2−4x+4=0→(x−2)2=0。
此时 2 作为根出现了两次,我们称之为二重特征根,在此情况下 (6.3) 退化成了:
hn=(c1+c2)2n=c2n
然而这并不是我们想要的,因为对于给定的 h0=a,h1=b,我们不一定能够满足:
{n=0,c=an=1,2c=b
所以我们需要另辟蹊径。
我们很容易知道 hn=2n 是其一个解,我们也可以证明 hn=n2n 是一个解。
为了寻找通解,我们可以断言:
hn=c12n+c2n2n
是这个递推式的通解!
我们进行验证,对其施加 h0=a,h1=b 的初始条件,那么:
{n=0,c1=an=1,2c1+2c2=b⟹{c1=ac2=b−2a2
我们总是有解!于是这可以作为其通解。
我们可以合理外推,从而找到一个更一般的结论。
对于特征方程的 k 个根,一共有 t 种不同的根。若 qi 是此方程的 ki 重根,那么此递推关系中 qi 对应的部分为:
H(i)n=ki∑j=1ci,j nki−j qni
而此递推关系的通解为:
hn=t∑i=1H(i)n
对于非齐次线性递推,一般来说,利用生成函数会更为方便。这里举例说明。
{h0=2hn=3hn−1−4n,n≥1
设其生成函数 F(x),根据递推关系,我们有:
F(x)=h0+h1x+h2x+⋯3xF(x)=+3h0x+3h1x+⋯
于是
F(x)−3xF(x)=h0+(h1−3h0)+(h2−3h1)+⋯=2−4×1x−4×2x2−⋯
我们知道:
∑n≥0nxn=x(1−x)2
于是我们知道:
(1−3x)F(x)=2−4x(1−x2)⟺F(x)=21−3x−4x(1−x2)(1−3x)
于是,我们便可以通过拆分这一个函数求解出其通项:
hn=−3n+2n+3
生成函数立大功!
第七章 - 生成函数
无限微积分
生成函数与高等数学强相关,确实需要部分知识,这里写下以便参考。
关于求导:
ax→axlnaxa→axa−1logax→1xlnalnx→1x
关于泰勒展开(这是在 0 处的展开,我们用的最多):
f(x)=∑i≥0f(i)(0)xix!
解递归式
我们在线性递推那里已经看到了生成函数的重要性,我们是否能够找到一个基本方法以求解出任何递推式?
答案是可以的,并且这个方法相当的机械:
- 将递归式写成关于 hn 的单个方程,在假定 h−1=h−2=⋯=0 的情况下对于任何正整数成立!
- 将他改写为生成函数 F(x) 之间的关系。
- 解得到的生成函数 F(x),将之表示为封闭形式。
- 展开 [xn]F(x),得到 gn 的封闭形式。
前面的步骤在上文的铺垫中应该十分清晰了,然而对于第四步,我们可能还有技巧上的困难。
一般来说,我们需要通过强硬的分解,将生成函数表示为:
F(x)=∑ci(1−αix)bi+1
从而得出很好的系数:
[xn]F(x)=∑ci(bi+nbi)αni
然而难点并不是在这一步,而是强硬分解出 ci 的那一步 QwQ
我们可能更多的只能依靠人类智慧完成。
我们来一个很好的例子:
{h0=h1=1hn=hn−1+2hn−2+(−1)n,n≥2
我们将之写成一个式子:
hn=hn−1+2hn−2+(−1)n[n≥0]+[n=1]
于是可以将之改写为生成函数之间的关系:
F(x)=∑nhnxn=∑nhn−1xn+2∑nhn−2xn+∑n≥0(−1)nxn+x
我们可以稍微变化一下这个式子:
=xF(x)+2x2F(x)+∑n≥0(−1n)zn+x=xF(x)+2x2F(x)+(1+x)−1+x
于是得到:
F(x)=1+x+x2(1−2x)(1+x)2
于是暴力展开即可得到通项:
hn=792n+(13n+29)(−1)n
卷积
对于给定的两个数列 ⟨fn⟩ 以及 ⟨gn⟩ 的卷积 ⟨hn⟩,我们有:
⟨fn⟩∗⟨gn⟩=⟨∑kfkgn−k⟩=⟨hn⟩
注意到数列的卷积和生成函数的乘积对应,那么对于许多式子,我们就有很好的方法利用卷积处理了。
斐波那契数列卷积
是的,还是斐波那契数列,它具有十分重要的地位,它足够简单,也足够复杂。
我们尝试计算 ∑nk=0fkfn−k 的封闭形式,这是 ⟨fn⟩ 与自身的卷积。
正常来说,我们直接可以利用 F(x)=x1−x−x2 的平方 F(x)2=x2(1−x−x2)2 然后展开求解其通项,但是这比较复杂,并没有更好的用到斐波那契和卷积。
我们尝试利用另一个生成函数:
F(x)2=(1√5(11−ϕx−11−^ϕx))2=15(1(1−ϕx)2−2(1−ϕx)(1−^ϕx)+1(1−^ϕx)2)=15∑n≥0(n+1)(ϕx)n−25∑n≥0fn+1xn+15∑n≥0(n+1)(^ϕx)n
中间关于 1(1−ϕx)(1−^ϕx) 的化简我们再从一个生成函数入手:
考虑 ϕ^ϕ=−1,我们有:
F(x)=−x(x+ϕ)(x+^ϕ)=−x(x+−1^ϕ)(x+−1ϕ)=−xϕ^ϕ(^ϕx−1)(ϕx−1)=x(1−^ϕx)(1−ϕx)
于是 1(1−ϕx)(1−^ϕx)=F(x)x−∑n≥0fn+1xn。
接下来我们继续化简上述式子,现在难点就在于 ∑n≥0(ϕn+^ϕn)xn 怎么求。
考虑两者的生成函数:
11−ϕx+11−^ϕx=∑n≥0(ϕn+^ϕn)xn
于是我们尝试对左式化简:
=2−^ϕx−ϕx(1−ϕx)(1−^ϕx)=2−x1−x−x2=x2−xF(x)
于是:
ϕn+^ϕn=[xn]x2−xF(x)=2fn+1−fn
于是我们得到:
F(x)2=15∑n≥0(n+1)(2fn+1−fn)xn−25∑n≥0fn+1xn
于是得到通项公式:
n∑k=0fkfn−k=2nfn+1−(n+1)fn5
生成函数的胜利!
指数生成函数
我们看看一个好好的例子:
(ln11−z)m=m!∑n≥0[nm]znn!
好好好,这么玩是吧,但是为什么不用 z¯m=∑n≥0[mn]zn?
我们回到正常的 EGF,考虑对于 ⟨hn⟩ EGF 的操作有哪些影响。
F(x)=∑n≥0hnxnn!
考虑 xF(x):
xF(x)=∑n≥0hnxn+1n!=∑n≥1hn−1xn(n−1)!=∑n≥0nhn−1xnn!
这就是 ⟨ngn−1⟩ 的 EGF,相当于在 OGF 上求了一次导。
如果需要平移,那么我们只需要 F′(x) 或者 ∫z0F(x) 即可。
对于指数生成函数的卷积来说,生成的数列是 ⟨fn⟩ 和 ⟨gn⟩ 的二项卷积:
hn=∑k(nk)fkgn−k
也就是考虑到 (nk)=n!k!(n−k)!:
hnn!=n∑k=0fkk!gn−k(n−k)!
这可以和伯努利数牵扯起来。
考虑伯努利数的递归式:
Bn=∑k(nk)Bk
发现这就是 ⟨Bn⟩ 和 ⟨1,1,⋯⟩ 的二项卷积。
所以我们得到其指数生成函数为 zez−1。
指数生成函数在组合意义上十分有用,其一个重要的应用于 exp 相关。
可以参考:# 浅谈 Exp 的组合意义 - 飞雨烟雁 的博客
更多 O(n2) 对于多项式的操作见:# 各种多项式操作的 n^2 递推
第八章 - 离散概率
期望与方差
期望的线性性以及耳熟能详了:
E(XY)=E(X)E(Y)
值得一提的是这并不要求两个随机变量独立!
对于方差,其基本的定义为:
V(X)=E((X−E(X)2)
但是我们可以将之展开:
=E((X−E(X)2)=E(X2−2XE(X)+E(X)2)=E(X2)−2E(X)2+E(X)2=E(X2)−E(X)2
也就是说:
方差等于平方的期望减去期望的平方
我们也可以证明:
V(X+Y)=V(X)+V(Y)
概率生成函数
可见 math 1.5
作者有话说
本文共 ≥10000 个词,≥25000 个字符(包括公式),花了 3 天时间,梳理了具体数学一书中目前对我有用的部分。
有很多的启示,补全了很多我所未知或者不熟练的东西。
限于时间原因,很多内容我无法细细谈论,如果有时间后面再补充(其实也没啥特别重要的东西了,边边角角的
完结撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?