算法学习笔记(40): 具体数学

具体数学

本文是阅读《具体数学》产生的理解性文本,并且涵盖了部分其他相关的内容。

不怎么重要或者太难的东西因为时间问题,我略过了。

本文来之不易,请勿机械搬运:原文地址 - https://www.cnblogs.com/jeefy/p/17848037.html

第二章 - 和式

和式的处理

和式是一切的基础,其三个法则十分重要:

(1.1)kKcak=ckKak

(1.2)kK(ak+bk)=kKak+kKbk

(1.3)kKak=p(k)Kap(k)

其中 (1.1) 代表着分配律,(1.2) 代表的结合律,而 (1.3) 代表的交换律。

我们可以通过这三种法则证明高斯给出的等差数列求和的公式:

0kn(a+bk)=0nkn(a+b(nk))=0kn(a+bnbk)=12(0kn(a+bnbk)+0kn(a+bk))=12(0kn(2a+bn))=12(2a+bn)0kn1=12(2a+bn)(n+1)

其中 012 我们用了两次交换律,在 4 用了结合律,在 5 用了分配律。

常常我们化简式子可能就是这些法则的排列组合。


对于多重和式,我们有着一个新的技巧:交换求和次序

jkaj,k[P(j,k)]=P(j,k)aj,k=kjaj,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=kzAi,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)=limh0f(x+h)f(x)h 十分的相似。

对于无限微积分来说,D(xn)=nxn1 是个非常优美的性质。

然而 Δ(xn) 却是十分的丑陋,于是需要找到新的代替品:

Δ(xn_)=nxn1_

其中 xn_=x(x1)(x2)(xn+1)

有了类似的微分,我们需要考虑积分。在无限微积分中,我们有 abg(x)dx=f(x)|ab=f(b)f(a),其中 g(x)=Df(x)

而在有限微积分中,我们有另外一个东西:

(2.1)abg(x)δx=f(x)|ab=f(b)f(a)

其中 g(x)=Δf(x)

这是一个左闭右开区间,所以我们可以简单的合并几个和式:ab+bc=ac

我们可以通过这个法则简单的得到 xn_ 的求和公式。

考虑 Δ(xn_)=nxn1_ 的事实,我们可以推知 1m+1((x+1)n+1_(x)n+1_)=xn_

也就是若 g(x)=xn_,那么存在 f(x)=1n+1xn+1_ 满足 Δf(x)=g(x)

那么此时我们可以得到:

0k<nkm_=0nkm_δx=km+1_m+1|0n=nm+1_m+1

在这个过程中,对于下标 0k<n 告诉我们,左闭右开区间一般比闭区间更好处理!

但是这个过程并不完美,因为我们没有考虑到 m=1 的情况。

考虑 x1_=1x+1,于是我们可以得知 0k<nk1_=Hk|0n=Hn

其中 Hn=1kn1k,这是一个类似于 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

我们重新排布一下两边,并且对于各自求一个和,那么我们就可以得到部分求和法则:

(2.2)abuΔv=uv|ababEvΔu

它的作用在于一个和式两部分不太好求,但是一部分是某一个简单式子的差分形式,另一部分有着一个简单的差分形式,那么我们可以通过这种方式进行尝试。

k=0n1k2k=0nx2xδx

我们可以知道,f(x)=x 有着 Δf(x)=1 的优秀形式,而 Δ(2k)=2k,于是利用部分求和法则:

0nx2xδx=x2x|0n0n2x+1δx

对于第二部分是一个简单的等比数列形式,那么我们可以得知:

k=0n1k2k=n2n(2n+12)=(n2)2n+2

现在我们尝试看另外一个例子:

(2.3)0nxk_axδx(a1)

其中 xk_ 有简单的差分形式,而 axaxa1 的差分形式,那么我们可以化为:

=xk_axa1|0n0nax+1a1kxk1_=nk_ana1aka10naxxk1_δx

这个式子我们需要保证 k0 才是正确的,否则,nk_an 应当写为 nk_an0k_a0 以避免分讨。

此时我们发现后半部分的式子是一摸一样的,所以考虑设 Sk=0nxk_axδx,那么根据上式,我们有:

Sk=nk_an0k_a0a1aka1Sk1

其中,若 k=0 时,有 S0=0naxδx=an1a1,于是我们可以 O(k) 的递推求出这个式子。

我们可以尝试进行展开:

Sk=j=1k(aja1)S0+i=1kni_an0i_a0a1j=i+1k(aja1)=(aa1)kkk_n0_an1a1+i=1kni_an0i_a0a1(aa1)kikki_=i=0kni_an0i_a0a1(aa1)kikki_=1a1i=0k(aa1)kikki_(nk_an0k_a0)

得到了其较为简单的非递归式,然而其是否存在封闭形式?目前看来并没有。

小练习:

xHxδx


第四章 - 数论

阶乘的因子

常见的问题为 n! 中有多少个因子 p

我们常见的想法是考虑有 k 个因子 p 的数有多少个,但是这是不好算的,考虑至少有 k 个因子的有多少个。

简单的,显然的,这就是 npk,于是乎恰好有 k 个因子的数有 npknpk+1,于是我们得到式子:

kk(npknpk+1)

这太丑陋了,小小展开,我们其是就发现更简单的形式:

k1npk

有了这个,或许我们就可以证明 Kummer 定理了:

(n+mm) 中素因子 p 的次数 = n,mp 进制下做加法的进位次数

注意到 n!p 的次数为 i=0npi

于是对于 (n+mm)=(n+m)!n!m!

因子的个数为 i=0n+mpinpimpi

也就是说只有 n+m 在这里进位了才能逃离被删除的宿命……并且由此还可以证明其因数 p 的个数不超过 logp(n+m)

互素

在书上的典型结构是 Stern-Brocot 树。它大概长这样:

每次得到的新的分数是由左右两个祖先 mn,mn 拼凑而来:m+mn+n

如果继续观察,每一层相邻的两个数 mn,mn 一定满足:

mnmn=1

这意味着一定满足 mn<mnmnmn>0(因为这里保证 n>0

这意味着如果我们有其相邻的分数的信息,我们就可以找到它。

我们可以通过矩阵的形式来表示:

(nnmm)n+nm+m

我们考虑向左一步,那么左侧的不变,右侧的变成自己:

(nnmm)(1101)(nn+nmm+m)

向右一步则是左侧变成自己,右侧不变:

(nnmm)(1011)(n+nnm+mm)

于是我们可以简单的二叉搜索出某个分数在树上的位置。


第五章 - 二项式系数

二项式系数有很具体的用处,但是想要用好却不是那么容易。

比较细致的文章:# 二项式系数 - zhiyangfan 的小窝

主要是变化太多了,啥都能套一套。

我们对书中部分公式进行证明。

(5.1)k(sk)(tmk)=(s+tm)

(5.1) 是范德蒙德卷积,典。

(5.2)k(sk)(tm+k)=k(sk)(ttmk)=(s+ttm)

(5.2) 是利用了恒等变换的范德蒙德卷积,前提是 t0

(5.3)k(1)k(sm+k)(t+kn)=(1)s+m(tmns),s0

原文中 (5.3) 的证明利用了对于 s 的归纳法,这里尝试给出变换性的证明。

=k(1)k(sm+k)(t+kt+kn)=k(1)k(sm+k)(1)t+kn(n1t+kn)=(1)tnk(sm+k)(n1t+kn)=(1)tn(sn1sm+tn)=(1)tn(1)sm+tn(tmns)=(1)s+m(tmns)

但是这个变化步骤中有很大的漏洞:

  • 在第一步 (t+kn)(t+kt+kn) 的过程中,我们并没有关注 t+k0 的条件,同样,在最后我们也没有关注 t+m0 的条件。

但是我太菜了,只能想到如此推导了……

上文是我自己思考的结果……QwQ
感谢 @British_Union 的提示
并感谢 @myee 给出的另一种证明的方法:多项式推理法。

我们发现如果我们能够保证 t>m,那么上述的问题都将不复存在,我们可以合理的如此推导。

而多项式推理法指的是我们可以发现如果 n,m,s 确定,那么这是一个关于 tns 次多项式:

(1)s+m(tm)ns_(ns)!

对于等式左侧, 我们可以确定是其也是关于 t 的一个 n 次多项式,两者在满足 t>m 时相减存在无穷的零点,意味着相减后我们得出的多项式为常数多项式 f(x)=0,意味着两边相等。

于是我们可以合理的推出这个式子在 t 作为变量的情况下对于全体实数成立。

剩下的两个式子推导和这个是一样的套路,不再展开。


我们顺便多学习一下多项式推理法。

在正整数下,我们了解到帕斯卡恒等式的成立:

(rk)=(r1k)+(r1k1)

我们可以知道两侧都是关于 rk 次多项式,相减也一定是一个 k 次多项式。

而一个 d 次多项式至多有 d 个零点,所以两个 d 次多项式相减有两种情况:

  • 至多 d 个零点,这意味着两者不尽相等。
  • 无穷多个零点,此时相减出来的多项式正是 f(x)=0

我们在此可以了解到在 Z+ 下等式成立,意味着减出来有无穷多个零点,也就意味着两者相等!

于是我们可以了解到这个恒等式在 rR 下成立!


来到新的挑战:

k0(n+k2k)(2kk)(1)kk+1,n0

显然的我们利用三项式变化一下:

k0(n+kk)(nk)(1)kk+1

利用 (nm)=nm(n1m1) 我们可以干掉 k+1

k0(n+kk)(n+1k+1)(1)kn+1

对于内部来说,我们可以利用恒等变换,再利用 (5.3) 的结果:

1n+1k(n+kn)(n+1k+1)(1)k=1n+1(1)n(n11)=0

但是事实上这里也有同上的漏洞,(n+kk)n+k 可能 <0 使得恒等变化后原本没有值的地方有了值,但是我们需要保证 k0,所以上面的变换不尽正确!

所以换一个尝试:

k0(1)k(n1k)(n+1k+1)(1)kn+1=1n+1(0n)

也就是当 n=00,即原式等价于 [n=0]

通过如上两个例子,我们发现对称恒等式确实是一个陷阱……能别用就别用,除非能保证上指标 0


我们进入作业题,对于整数 n,m0,求出:

j=1m(1)j+1(rj)k=1n(j+rk+smj)

看着好恐怖,j 出现了 4 次!还有两个和式!不过这都是小问题。

我们尝试一点一点消掉他们。

首先观察到 (j+rk+smj) 上下都有 j,尝试利用上指标反转干掉一个:

j=1mk=1n(1)j+1(rj)(1)mj(mrks1mj)=(1)m+1j=1mk=1n(rj)(mrks1mj)

我们发现在 k 已知的情况下,这就类似一个范德蒙德卷积!于是改变求和顺序:

=(1)m+1k=1n((r0)(mrks1mj)+j(rj)(mrks1mj))=(1)m+1k=1n((m+r(1k)s1m)(mrks1m))

考虑外面有一个 (1)m,内部的下指标都是 m,那么都反转一下,顺便将剩下的 1 乘进去:

=k=1n((kr+sm)((k1)r+sm))=k=1n(kr+sm)k=1n((k1)r+sm)

稍微平移一下下标:

=k=1n(kr+sm)k=0n1(kr+sm)=(kn+sm)(sm)

于是我们就得到了这个简单的封闭形式。


高阶差分与牛顿级数

这在 math 1.4 中讲了,内容参见 share-math


第六章 - 特殊的数

斯特林数

斯特林数分为第一类和第二类。比较常用的是第二类。

第二类斯特林数 {nk} 的组合意义为讲 n 个物品的集合划分为 k 个非空子集的方法数。

利用这个意义我们可以引出一个递推式:

{nk}={n1k1}+k{n1k}

分别指的是新开一个子集,或者放入某一个子集的方案数。

对于第一类斯特林数,其还对于每一个子集排成了环,形成了 k轮换(cycle)

对于每一个大小为 m 的子集,存在 (m1)! 种轮换,由此可以看出存在 [nk]{nk}

我们同样可以通过组合意义找到一个递推式:

[nk]=[n1k1]+(n1)[n1k]

分别指新开一个轮换,或者插入到某一个元素前面。

有了加法公式,那么很多时候我们就可以通过归纳法证明与之相关的内容了。


在这之前,我们可以讨论一下 [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×xn1=xk{n1k}xk_

我们考虑 x×xk_ 是否有很好的表达方式,发现可以通过 xk+1_=xk_(xk) 得出:

x×xk_=xk+1_+kxk_

于是我们可以简单的将上式拆开:

k{n1k}xk+1_+k{n1k}kxk_=k{n1k1}xk_+k{n1k}kxk_=k({n1k1}+k{n1k})xk_=k{nk}xk_

于是归纳得证。

斯特林数有许许多多不那么常用的恒等式,所以并不太需要注意。

不过我们回到加法公式:

{nk}={n1k1}+k{n1k}[nk]=[n1k1]+(n1)[n1k]

我们是否能够像:

(nk)=(n1k)+(n1k1)

一样将他们推广到更多的地方?

事实上,如果我们先约定 {0k}=[0k]=[k=0] 以及 {k0}=[k0]=[k=0],那么我们就可以利用加法公式求出负数下 {nk} 的值!

如果将整个表画出来,那么我们将得到一个惊人整齐的等式:

[nk]={nk}

这容易利用加法公式验证。


第一类斯特林数并没有通项公式,但是第二类斯特林数却存在。

可以通过二项式反演简单的证明:

{nk}=1k!i=0k(ki)(1)kiin

或者写成稍微好看的一个形式:

{nk}=i=0kin(1)kii!(ki)!

当这个形式一出来,那么我们就可以知道如何快速的求一行斯特林数了。

F(x)=xni!G(x)=(1)xx!,那么知道:

{nk}=i=0kF(i)G(ki)

于是我们可以通过 NTT O(nlogn) 的求出整行的第二类斯特林数。

我们现在考虑是否能够快速的求出整列的斯特林数?

我们考虑一列斯特林数的生成函数:

Fk(x)=i{ik}xk

根据加法公式,我们有:

Fk(x)=xFk1(x)+kxFk(x)

于是存在:

Fk(x)=x1kxFk1(x)

于是我们得到:

Fk(x)=xki=1k(1kx)

于是可以分治 NTT 和多项式取逆做即可。

然而实际上有办法避免多项式求逆的,但是有点复杂。

但是不合理,代码太抽象了,我们换一个方法,考虑 EGF。

Fk(e)(x)=i{ik}xii!

将斯特林数拆开:

F(x)=ixii!j=0kjij!(1)kj(kj)!=j=0k(1)kj(kj)!j!i(jx)ii!=j=0k(1)kj(kj)!j!ejx=1k!j=0k(ki)(1)kjejx=(ex1)kk!

于是多项式快速幂即可。这只需要写一个 NTT 即可做到 O(nlognlogk)

其实通过类似的方式,我们可以推导出第一类斯特林数行列的求法。

这里不做过多展开。


调和数

调和数 Hn=i=1n1i,认为是离散下对于 lnn 的模拟,其误差 γ0.577215

这是欧拉所证明的:limn(Hnlnn)=γ

对于调和数我们还有一个与斯特林数挂钩的等式:

(6.1)[n+12]=n!Hn

考虑通过:

[n+12]=n[n2]+[n1]=n[n2]+(n1)!

可以知道:

1n![n+12]=1(n1)![n2]+1n

于是只需要展开这个递归式即可得到 (6.1)

第一个例题较好,复习了分部求和法则:

0k<n(km)Hk

如果掌握的分部求和法则,那么这就比较简单,这里不再展开。


我们总是会遇到它的生成函数的,虽然这是之后的内容(也是后面回来写的)

学完生成函数和卷积以后,我们会了解到一个小技巧:生成函数前缀和。

具体来说,对于 fn1,1, 的卷积会得到 i=0nfi

在生成函数上的体现便是 F(x)11xF(x)

我们可以利用这个技巧快速的算出 Hk 的生成函数。

考虑 Hn=i=1n1i,那么实际上它就是 0,1,12,13, 的前缀和。

后者实际上为 ln11x,于是我们可以知道 Hn 的生成函数为:

11xln11x

补充,关于 ln11x 表示 0,1,12,13, 的证明:

考虑 ln(1+x) 利用泰勒展开:

ln(1+x)=n0(1)nn+1xn+1

利用 x 代替 x 得到:

ln(1x)=n0xnn

于是我们只需要:

ln(1x)=ln(11x)=n0xnn


斐波那契数

斐波那契数由如下递归式定义:

F0=0F1=1Fn=Fn1+Fn2,n>1

我们容易通过归纳法证明:

(6.2)Fn=FkFnk+Fk1Fnk1

同样,也可以通过矩阵乘法证明,参见 # 算法学习笔记(37): 矩阵

由此我们可以推出:

Fn|Fkn

可以通过 (6.2) 和归纳法简单的证明。

于是我们可以知道:

gcd(Fn,Fm)=Fgcd(n,m)

我曾经推了几个简单的式子:

  • F2i
  • F2i+1
  • Fi
  • (1)iFi
  • Fi2

推导和证明都很简单,但是可能可以将 Fi2 多提几句。

一般的代数推导就是打表+归纳就完事,高级一点展开 Fi=Fi1+Fi2 慢慢化简证明。

但是这里是有几何推导的:

这东西可以看作二维平面的矩形,那么对此就可以直接化简了!

i=1nFi2=FnFn+1

然而考虑是否可以继续推广?例如立方体。

如果单纯的相加,我们总是会发现缺了一块,但是该如何补齐这缺失的部分?

考虑将红色的这一块 FnFn1Fn2 补齐,那么就变成了一子问题,递归下去。

于是得到:(Fi3+FiFi1Fi2)=Fn2Fn+1

但是好像仍然不是我们想要的……恕我太菜也想不出来了。


线性递推

斐波那契数列衍生而出的另一个知识叫做递推,而递推就可以讲到线性齐次递推和非齐次递推。

或许我们需要先学会生成函数?

对于形如:

hn=i=1kaihni,nk

定义其特征方程为:

xki=1kaixki=0

根据代数基本定理,上式有 k 个根 q1,q2,,qk,我们称之为特征根,那么:

(6.3)hn=i=1nciqin

在下述意义下是原递推关系的通解:

无论给定如何的初值 h0,h1,hk1,都存在一组 c1,c2,,ck 使之满足递推关系和初始条件。

换句话来说,是通解意味着对于任意给定的初值,都可以解出如下方程组:

{(n=0)c1q10+c2q20++ckqk0=h0(n=1)c1q11+c2q21++ckqk1=h1(n=k1)c1q1k1+c2q2k1++ckqkk1=h0

而此方程组的系数矩阵为:

[111q1q2qkq1k1q2k1qkk1]

这显然是一个范德蒙德矩阵,其行列式为:

i<jqjqi

也就是说,我们需要保证根互不相同,使得矩阵满秩(行列式不为 0)才可以求出唯一解。


然而实际上有另外一种利用生成函数的方法,更加简明。

继续沿用斐波那契数列的例子 fn=fn1+fn2

F(x)=i0fixi 是其生成函数。

根据递推关系,我们可以得出 F(x)=xF(x)+x2F(x)

具体来说,三个生成函数对应的序列如下:

F(x):<fn1,fn,fn+1>xF(x):<fn2,fn1,fn>x2F(x):<fn3,fn2,fn1>

于是 F(x)=11xx2 得出也就很自然了(当然这是错误的。

真的自然吗?我们是不是忘了什么东西?

确实,我们忘了一些东西,我们重新将三者写下来:

F(x):f0+f1x+f2xxF(x):f0x+f1xx2F(x):f0x2

也就是说 F(x)xF(x)x2F(x) 实际上 =f0+(f1f0)x

将初始值 f0=0,f1=1 带入,我们才真正地正确地得到其生成函数:

F(x)xF(x)x2F(x)=xF(x)=x1xx2

如果我们得到了生成函数,我们是否能够确定其通项公式?答案是可以的。

我们将 x1xx2 稍微分解 =c1x1+52+c2x152

可以列出方程简单的求解出 c1,c2 是什么。

我们通过 11x=i0xi 各项展开,于是就可以得到其通项公式!

我们现在看看 1+52 以及 152 这两个数。

我们赋予了其一个符号,足以可见其重要程度:ϕ=1+52,ϕ^=1ϕ=152

这两个数是 1xx2=0 的根,故我们有:

ϕ2=ϕ+1,ϕ^2=ϕ^+1

我们通过这两个符号将 F(x) 写出来:

F(x)=x(x+ϕ)(x+ϕ^)=15(11ϕx11ϕ^x)

这形式很优美,我们之后将会用到。

通过幂级数展开,我们就得到了 fn 的通项公式:

fn=15(ϕnϕ^n)

奇妙的是一堆 5 乘起来就变成了一个整数!


来到更大的挑战:

hn=4hn14hn2,n2

我们是否能够找到其通项公式?

从特征根考虑:x24x+4=0(x2)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=b2a2

我们总是有解!于是这可以作为其通解。

我们可以合理外推,从而找到一个更一般的结论。

对于特征方程的 k 个根,一共有 t 种不同的根。若 qi 是此方程的 ki 重根,那么此递推关系中 qi 对应的部分为:

Hn(i)=j=1kici,j nkij qin

而此递推关系的通解为:

hn=i=1tHn(i)


对于非齐次线性递推,一般来说,利用生成函数会更为方便。这里举例说明。

{h0=2hn=3hn14n,n1

设其生成函数 F(x),根据递推关系,我们有:

F(x)=h0+h1x+h2x+3xF(x)=+3h0x+3h1x+

于是

F(x)3xF(x)=h0+(h13h0)+(h23h1)+=24×1x4×2x2

我们知道:

n0nxn=x(1x)2

于是我们知道:

(13x)F(x)=24x(1x2)F(x)=213x4x(1x2)(13x)

于是,我们便可以通过拆分这一个函数求解出其通项:

hn=3n+2n+3

生成函数立大功!


第七章 - 生成函数

无限微积分

生成函数与高等数学强相关,确实需要部分知识,这里写下以便参考。

关于求导:

axaxlnaxaaxa1logax1xlnalnx1x

关于泰勒展开(这是在 0 处的展开,我们用的最多):

f(x)=i0f(i)(0)xix!

解递归式

我们在线性递推那里已经看到了生成函数的重要性,我们是否能够找到一个基本方法以求解出任何递推式?

答案是可以的,并且这个方法相当的机械:

  1. 将递归式写成关于 hn 的单个方程,在假定 h1=h2==0 的情况下对于任何正整数成立!
  2. 将他改写为生成函数 F(x) 之间的关系。
  3. 解得到的生成函数 F(x),将之表示为封闭形式。
  4. 展开 [xn]F(x),得到 gn 的封闭形式。

前面的步骤在上文的铺垫中应该十分清晰了,然而对于第四步,我们可能还有技巧上的困难。

一般来说,我们需要通过强硬的分解,将生成函数表示为:

F(x)=ci(1αix)bi+1

从而得出很好的系数:

[xn]F(x)=ci(bi+nbi)αin

然而难点并不是在这一步,而是强硬分解出 ci 的那一步 QwQ

我们可能更多的只能依靠人类智慧完成。


我们来一个很好的例子:

{h0=h1=1hn=hn1+2hn2+(1)n,n2

我们将之写成一个式子:

hn=hn1+2hn2+(1)n[n0]+[n=1]

于是可以将之改写为生成函数之间的关系:

F(x)=nhnxn=nhn1xn+2nhn2xn+n0(1)nxn+x

我们可以稍微变化一下这个式子:

=xF(x)+2x2F(x)+n0(1n)zn+x=xF(x)+2x2F(x)+(1+x)1+x

于是得到:

F(x)=1+x+x2(12x)(1+x)2

于是暴力展开即可得到通项:

hn=792n+(13n+29)(1)n

卷积

对于给定的两个数列 fn 以及 gn 的卷积 hn,我们有:

fngn=kfkgnk=hn

注意到数列的卷积和生成函数的乘积对应,那么对于许多式子,我们就有很好的方法利用卷积处理了。

斐波那契数列卷积

是的,还是斐波那契数列,它具有十分重要的地位,它足够简单,也足够复杂。

我们尝试计算 k=0nfkfnk 的封闭形式,这是 fn 与自身的卷积。

正常来说,我们直接可以利用 F(x)=x1xx2 的平方 F(x)2=x2(1xx2)2 然后展开求解其通项,但是这比较复杂,并没有更好的用到斐波那契和卷积。

我们尝试利用另一个生成函数:

F(x)2=(15(11ϕx11ϕ^x))2=15(1(1ϕx)22(1ϕx)(1ϕ^x)+1(1ϕ^x)2)=15n0(n+1)(ϕx)n25n0fn+1xn+15n0(n+1)(ϕ^x)n

中间关于 1(1ϕx)(1ϕ^x) 的化简我们再从一个生成函数入手:

考虑 ϕϕ^=1,我们有:

F(x)=x(x+ϕ)(x+ϕ^)=x(x+1ϕ^)(x+1ϕ)=xϕϕ^(ϕ^x1)(ϕx1)=x(1ϕ^x)(1ϕx)

于是 1(1ϕx)(1ϕ^x)=F(x)xn0fn+1xn

接下来我们继续化简上述式子,现在难点就在于 n0(ϕn+ϕ^n)xn 怎么求。

考虑两者的生成函数:

11ϕx+11ϕ^x=n0(ϕn+ϕ^n)xn

于是我们尝试对左式化简:

=2ϕ^xϕx(1ϕx)(1ϕ^x)=2x1xx2=x2xF(x)

于是:

ϕn+ϕ^n=[xn]x2xF(x)=2fn+1fn

于是我们得到:

F(x)2=15n0(n+1)(2fn+1fn)xn25n0fn+1xn

于是得到通项公式:

k=0nfkfnk=2nfn+1(n+1)fn5

生成函数的胜利!


指数生成函数

我们看看一个好好的例子:

(ln11z)m=m!n0[nm]znn!

好好好,这么玩是吧,但是为什么不用 zm¯=n0[mn]zn

我们回到正常的 EGF,考虑对于 hn EGF 的操作有哪些影响。

F(x)=n0hnxnn!

考虑 xF(x)

xF(x)=n0hnxn+1n!=n1hn1xn(n1)!=n0nhn1xnn!

这就是 ngn1 的 EGF,相当于在 OGF 上求了一次导。

如果需要平移,那么我们只需要 F(x) 或者 0zF(x) 即可。

对于指数生成函数的卷积来说,生成的数列是 fngn二项卷积

hn=k(nk)fkgnk

也就是考虑到 (nk)=n!k!(nk)!

hnn!=k=0nfkk!gnk(nk)!

这可以和伯努利数牵扯起来。

考虑伯努利数的递归式:

Bn=k(nk)Bk

发现这就是 Bn1,1, 的二项卷积。

所以我们得到其指数生成函数为 zez1

指数生成函数在组合意义上十分有用,其一个重要的应用于 exp 相关。

可以参考:# 浅谈 Exp 的组合意义 - 飞雨烟雁 博客

更多 O(n2) 对于多项式的操作见:# 各种多项式操作的 n^2 递推


第八章 - 离散概率

期望与方差

期望的线性性以及耳熟能详了:

E(XY)=E(X)E(Y)

值得一提的是这并不要求两个随机变量独立!

对于方差,其基本的定义为:

V(X)=E((XE(X)2)

但是我们可以将之展开:

=E((XE(X)2)=E(X22XE(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 天时间,梳理了具体数学一书中目前对我有用的部分。

有很多的启示,补全了很多我所未知或者不熟练的东西。

限于时间原因,很多内容我无法细细谈论,如果有时间后面再补充(其实也没啥特别重要的东西了,边边角角的

完结撒花★,°:.☆( ̄▽ ̄)/$:.°★

posted @   jeefy  阅读(402)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示