P.S
这个排版非常难堪
等闲暇之余修改之
继续读书笔记
组合数学 第五版
TBC
转载请注明出处
排列与组合的生成
Stirling’s approximation
公式证明可以百度之,通常可以使用这个公式来估算
排列
Even著作中给出一种排列的生成方式,值得关注的从逆序列构造原排列的两种算法。
已知原排列的逆序列为
算法一
- 写出
n
- 依次考虑,将
bn−k,k=1,2,…,n−1 n−k写在前一步的bn−k个数后,特别地,若bn−k=0,则将放在0个数后,即放在序列的开头
- 写出
算法二
依次考虑
,将1,2,…,n n写在从左向右第个空位置上bn−k+1
算法一强调整数间的相对位置,算法二强调直接找到整数在原排列中应有的位置。算法二可以用树状数组来实现(或者更优的数据结构)。
组合
S
是
- S的-组合
n 二进制数顺序生成
基2算法
二进制
n阶反射Gray码Gray码可以推广至任意基的系统
- S的-组合
r 按字典序的生成算法
二项式系数
Pascal公式(换言之,杨辉三角形),二项式定理和排列组合的恒等式这些内容比较基础。需要注意在证明一些结论时,常常使用了组合学的方法(应用加法原理、乘法原理等等),这要求一种不同的思维方式;同时也可以使用代数的方法,根据一些代数式的运算,用系数来证明结论,这与求解线性递推数列使用生成函数的方法遥相呼应,可以看做是理解生成函数法的一个启蒙吧。
牛顿二项式定理?泰勒展开?好像这里又给生成函数埋了个伏笔。
也可以写成等价形式:
容斥原理
简单的就不说了,大家都会。留意多重集的处理。重数为有限数的不妨变换条件,计算重数为无穷大的情况,利用具有
线性递推数列
齐次递推关系的通解和非齐次递推关系的特解
这种方法和求解线性微分方程神似。先求出对应的齐次递推关系特征方程,给出通解,在待定系数求非齐次递推关系的一组特解,解线性方程组,最后给出非齐次递推关系的通解。线性递推数列的线性性保证了这种方法的正确性,对
生成函数
令
泰勒级数勒级数中每一项的系数看成对应组合数的计数,因而计数问题可以由生成函数直接求解。
例:确定可以由苹果、香蕉、橘子和梨装水果的袋数
给出一个生成函数,有
则有
同样地,线性齐次递推数列也可以用生成函数求解。
例:求解满足初始值
令
\begin{aligned} g(x) &=h_0+h_1x+h_2x^2+\cdots+h_nx^n+\cdots \\ -5xg(x) &=-5xh_0x-5h_1x^2-\cdots-5h_{n-1}x^n-\cdots \\6x^2g(x) &=6h_0x^2+\cdots+6h_{n-2}x^n+\cdots \end{aligned} \\
(1-5x+6x^2)g(x) =h_0+(h_1-5h_0)x+(h_2-5h_1+6h_0)x^2+\cdots+(h_n-5h_{n-1}+6h_{n-2})x^n+\cdots \\
当然,还有更一般化的结论。
用单项式的集合
对多重集
证明及实例见书。
转移矩阵
在我看来,上述两种方法适合手算,其实写程序不必这么辛酸。初始条件行向量,根据递推关系给出转移矩阵,用矩阵乘法并施以一定的优化就可以了。Fibonacci数列就是一个极好的例子。
几类特殊序列
排列序列(阶乘序列)
错位排列序列
Dn=n!(1−11!+12!−13!+⋯+(−1)n1n!) 可以使用容斥原理来推导,或者使用递推式从而求解特征方程;一些问题可转化为错位排列求解。联系一下
ex的泰勒展式:1e=Dnn!+(−1)n+11(n+1)!+(−1)n+21(n+2)!+⋯limn→∞Dnn!=1e事实上,
Dn是最接近于n!e的整数。对此,我还没有考证这个“事实上”,这里暂时留待解决好了。
Fibonacci序列
fn=15√(1+5√2)n−15√(1−5√2)n 公式推导可以使用特征方程法,关注转移矩阵。
Catalan数
Cn=1n+1(2nn)n个和+1 n个构成的−1 2n项a1,a2,⋯,a2n其部分和满足
a1+a2+⋯+ak≥0,(k=1,2,⋯,2n)的数列的个数等于第
n个Catalan数C2n 定义一个新的数列
C∗1,C∗2,…,C∗n,…称为拟—Catalan数C∗n=n!Cn−1=(n−1)!(2n−2n−1),(n≥1)令
a1,a2,⋯,an为n个数。我们说这些数的“乘法格式”是指进行的乘法的方案,一个乘法格式需要两数间的a1,a2,⋯,an n−1次乘法,这种乘法不满足交换律,这两书中的每一个或者是a1,a2,⋯,an之一,或者是它们的部分乘积。令hn表示n个数的乘法格式的数目,则hn=C∗n 如果要求
a1,a2,⋯,an顺序,令gn表示有这种附加限制的乘法格式的数目,则gn=hnn!=1n(2n−2n−1),(n≥1)将具有
n+1条边的凸多边形区域通过插入在区域内部不相交的对角线而分成三角形区域的方法数也为gn。Stirling数
- 第一类Stirling数
s(p,0)=0,(p≥1)s(p,p)=1,(p≥0)s(p,k)=(p−1)s(p−1,k)+s(p−1,k−1),(1≤k≤p−1)第一类Stirling数
s(p,k)是将p个物体排成个非空的循环排列的方法数。k 令
[n]p={n(n−1)⋯(n−p+1),1,p≥1p=0则
[n]p=∑k=0p(−1)p−ks(p,k)nk 这才是书中对第一类Stirling数给出的定义。第一类Stirling数提供了用
n0,n1,⋯,np写出[n]p的方法。- 第二类Stirling数
S(p,0)=0,(p≥1)S(p,p)=1,(p≥0)S(p,k)=kS(p−1,k)+S(p−1,k−1),(1≤k≤p−1)第二类Stirling数
S(p,k)是将p个元素的集合划分成个不可辨别的非空盒的划分的个数。k “不可辨别”意思盒子本身没有属性,例如颜色、大小、形状等等盒子的属性造成的划分不予考虑。
令
S#(p,k)表示将p个元素分成个非空、可辨别的盒子的划分数。用容斥原理可以证明k S#(p,k)=k!S(p,k)=∑t=0p(−1)t(kt)(k−t)p则
S(p,k)=1k!∑t=0p(−1)t(kt)(k−t)pBell数
Bp是将p个元素划分成非空、不可辨别盒子的划分数。Bp=S(p,0)+S(p,1)+⋯+S(p,p)=∑t=0p−1(p−1t)Bp−1−t 令
[n]k={n(n−1)⋯(n−k+1),1,k≥1k=0则
np=∑k=0pS(p,k)[n]k 这是书中对第二类Stirling数给出的定义。第二类Stirling数提供了用
[n]0,[n]1,⋯,[n]p写出np的方法。可以看成两组基的互换。分拆数
pn∑n=0∞pnxn=∏k=1∞11−xk- n的前个二项式系数的和
k+1 h(k)n=∑i=0k(ni),(0≤k≤n)Δh(k)n=h(k−1)nh(k)n是用n个一般位置上的-维超平面分割k−1 k-维空间所成的区域数。 题外话:关于数列
的计算1k+2k+⋯+nk 不妨记
f(n,k)=1k+2k+⋯+nk,并且很容易计算f(n,0)f(n,1)f(n,2)=10+20+⋯+n0=n=11+21+⋯+n1=n(n+1)2=12+22+⋯+n2=n(n+1)(2n+1)6求解这个数列的方法是很多的,例如:
- 累加与递推
当我们已经求出了
f(n,0),f(n,1),…,f(n,k−1)的显式表达式后,我们来求解f(n,k)。(n+1)k+1−nk+1[(n−1)+1]k+1−(n−1)k+1(1+1)k+1−1k+1=(k+1)nk+∑i=0k−1(k+1i)ni=(k+1)(n−1)k+∑i=0k−1(k+1i)(n−1)i⋯=(k+1)1k+∑i=0k−1(k+1i)1i累加有
(n+1)k+1−1=(k+1)f(n,k)+∑i=0k−1(k+1i)f(n,i) 代入
f(n,0),f(n,1),…,f(n,k−1)即可解出f(n,k)。- 线性方程组
上一种方法的计算太过于复杂。可以归纳地得出,
f(n,k)是n的次多项式,那么,设k+1 g(n,k)=a0+a1n+⋯+ak+1nk+1并且要求
g(n,k)−g(n−1,k)=nk并且g(0,k)=0则
f(n,k)=g(n,k)那么,
a0=0。展开g(n,k)−g(n−1,k)有∑i=1k+1ai[ni−(n−1)i]=nk 比对系数,可以得到一个关于
a1,a2,…,ak+1的线性方程组,解这个线性方程组就可得到f(n,k)。通过计算会发现,这个方程的系数矩阵规律性极其明显,举两例:
当
k=3时⎛⎝⎜⎜⎜1000−12001−330−14−640001⎞⎠⎟⎟⎟和
k=4时⎛⎝⎜⎜⎜⎜⎜⎜10000−120001−3300−14−6401−510−10500001⎞⎠⎟⎟⎟⎟⎟⎟
f(n,k)得到一个(k+1)×(k+2)的系数矩阵。该系数矩阵的列向量αj→,j=1,2,⋯,k+2满足αj→=⎧⎩⎨((−1)j+1(j0),(−1)j+2(j1),⋯,(−1)j+j(jj−1),0,0,⋯,0)T(0,0,⋯,0,1)T,1≤j≤k+1,j=k+2- 差分法
计算
nk的差分表,得到第0条对角线序列c0,c1,⋯,ck,0,0,⋯ 则
nk可以写成nk=∑j=0kcj(nj)又有
∑i=0n(ij)=(n+1j+1)则
f(n,k)=∑i=0nik=∑i=0n∑j=0kcj(ij)=∑j=0kcj(n+1j+1)