【组合数学】 04 - 基本计数问题

1. 基本计数

1.1 统一模型

  本篇来讨论几个基本的计数问题,这些问题虽然都有各自的模型,但本质上却有着内在的联系,因此我们先建立一个统一的模型。现在有元素集E,F,它们的元素都有内在的结构,建立映射EF,问题是这样的映射有多少个?满射和单射有多少个?

  所谓有内在的结构,就是元素间的拓扑结构,我们所说的映射个数,严格讲是在拓扑同构意义下的等价类的个数。拓扑结构种类繁多,无法一一研究,本篇只探讨两个基本的拓扑结构,下一篇会做更一般性的讨论。这个模型虽然对本章作用有限,但可以从更高的视角思考看待问题的本质,而且各个问题间联系也一目了然。

  两个基本拓扑结构分别是:无序结构和有向链表。无序结构中的元素是离散的、无差别的,在拓扑同构下可以互相替换。有向链表中的元素是完全区分的,它的拓扑同构只有自身,当然只有自身的拓扑结构不止这一个,这里只要强调完全区分性,所谓有向链表可以当做是给每个元素编了号。以下设E,F都是有限集,且记|E|=m,|F|=n

1.2 模型1:可区分可区分

  可完全区分的结构比较简单,先来看E,F都是有向链表的情况,E,F分别纵向排列,EF就是一般的函数定义。对E的每个元素都有n个值可以映射,由乘法原理便知映射一共有nm种。这个结构有一个更常用、更直观的模型,考察由n个字母组成的集合S,用这些字母组成长度为m的单词x1x2xm。这个单词也被称S上的m可重复排列,或m元字。不难证明它和模型1的等价性,故S上的m元字有nm个。

  现在对映射添加一些限制,比如假设E的第k个元只能取某nk个值,由乘法定理知可以有n1n2nmm元字。再限制每个元素的映射不能相同,或者说字中没有重复字母,第k个元素只能取nk+1个值。这其实就是我们熟悉的n个元素中选m个元素的排列数P(n,m)(式(1)),其中表达式x(x1)(xk+1)简记为(x)k,也叫做x的降k阶乘x不要求是自然数)。类似地记表达式x(x+1)(x+k1)简记为(x)k,也叫做x的升k阶乘

(1)P(n,m)=(n)m=n(n1)(nm+1)=n!(nm)!

  排列数要求每个函数值最多被映射一次,继续推广,我们假定F中第k个数被映射mk次。这样的字称为是a1m1a2m2anmn型字,其中m1+m2++mn=m。先将mk个字母ak看成互异的字母ak1,,akmk,这样的字有m!个,而原来的每个字对应到m1!m2!mn!个这样的字,故有式(2)成立。

(2)N(a1m1a2m2anmn)=m!m1!m2!mn!

  S上的相邻字母不相同的m元字的个数。

1.3 模型2:不可区分可区分

  现在假定E是无序的,而F是有向链表,由于原像不可区分,要关注的便是像的组合情况。它的一个等价模型我们也很熟悉:从n种颜色的球里选出m个球。如果要求每种颜色只能选一个,相当于映射为单射,选取个数称为nm元不重复组合数,记作(nm),一般也简称为组合数。它其实就是排列在E无序下的等价类的个数,具体说就是m!个排列属于同一个等价类,故有公式(3)。

(3)(nm)=(n)mm!=n!m!(nm)!

  如果颜色可以重复选,选取个数称为nm元可重复组合数,记作((nm))。设每个像被映射的次数为xk,可重复组合数等价于方程(4)的非负整数解的个数。对这个问题,有两个比较巧妙的方法,它们都把可重复组合问题转化为了不重复组合问题,其中的对应思想是非常重要的。一种方法是直接理解方程(4),它相当于把m个相同的元素分割为可区分的n份。将m个元素一字排开,在其中插入n1个隔板即可,隔板和元素共m+n1个位子,我们就是要选择其中的n1个位置,这就有式(5)成立。

(4)x1+x2++xn=m

(5)((nm))=(m+n1m)=(n)mm!

  另一种解释式(4)的方法也非常经典,考察sk=x1++xk组成的单调递增序列(式(6)左),sk[n]中取值,但可能存在重复值。为了消除等号,再令tk=sk+k1,这时有式(6)成立,其中tk[m+n1]中取互异值,同样得到公式(5)。利用这个思想,更容易得到不等式(7)的非负整数解为(m+nm),它也相当于左式分别取0m时的解数和,故有式(8)成立。

(6)0s1sn=m0t1<<tn=m+n1,tk=sk+k1

(7)x1+x2++xnm

(8)k=0m(n+k1k)=(n+mm)

   [n]中取m个互不相邻的数,求取法个数。

1.4 模型3:可区分不可区分

  像不可区分,就好比n个相同的篮子,把可区分的原像看做是m个不同的球,问题等价于:m个不同的球放进n个篮子的方法。根据有球的篮子数k,问题被分为n种情况,每一种情况都是相同的问题:m个球分成k堆的分法。我们就集中研究这个问题,而m个元素分成k部分的个数被称为第二类Stirling数,记作S(m,k)

  Stirling数并没有简单的表达式,我们先从它的递推关系入手,这也是组数计算问题的常用方法。考察某个元素a1,分割后有两种情况:它单独分为一堆,或和其它元素在一堆。所以很容易有递推关系(9)。使用递推关系归纳,可以得到比较漂亮的公式(10),如果你觉得正向证明不明显,可以试试反向证明。

(9)S(m,k)=S(m1,k1)+kS(m1,k)

(10)S(k+r,k)=1k1k2krkk1k2kr

  考虑模型3和模型1的关系,模型3中的1个分割是模型1中的一个等价类:被映射的像的个数为k。这个等价类中有(nk)k!=(n)k个元素(先选k个像再排列),从而我们有重要的关系式(11)(S(m,0)=0)。m个元素的总分割数被称为Bell数,记作Bm,它显然是式(12)左。以某个元素所在堆的大小分类讨论,容易有递推关系式(12)右。

(11)nm=k=0nS(m,k)(n)k

(12)Bm=k=0mS(m,k)Bm+1=k=0m(mk)Bmk

1.5 模型4:不可区分不可区分

  当原像和像都不可区分时,只需关心分割的堆数和每堆的个数,等价的模型就是整数m分拆数p(n)。对应地分拆为k部分的个数记作p(m,k),它表示不定方程(13)正整数解的个数,注意它和方程(4)的区别在于不考虑分拆的顺序。既然不考虑各部分的顺序,每个分拆其实还对应方程(14)的一组非负整数解。

(13)x1+x2++xk=m,(x1x2xk)

(14)x1+2x2+3x3++mxm=m

  分拆数同样没有简单的表达式,我们还是先来建立一些递推关系式。根据xk是否为1可得到递推关系(15),持续使用该式便得到式(16),它也有显然的组合意义。

(15)p(m,k)=p(m1,k1)+p(mk,k)

(16)p(k+r,k)=p(r,1)+p(r,2)++p(r,k)

  关于m的某个分拆结果x1,x2,,xk,有个直观的表示方法,以点表示不可区分的元素,在第i行排列xi个点。比如(5,5,3,2)画成下图,这样的图称为菲勒(Ferrers)示意图,利用其直观性可以得到很多意想不到的结论。菲勒图纵横翻转后仍然是菲勒图,它对应的分拆称为原分拆的共轭分拆,对于分拆π,其共轭分拆一般记作π。从菲勒图中容易得到:(1)p(m,k)等于m最大分部为k的分拆数;(2)m最多k个部分的分拆数,等于m最大分部不大于k的分拆数。

  满足π=π的分拆称为自共轭分拆,它的菲勒图沿对角线对称。将其菲勒图按如图所示分割,便知m的自共轭分拆数等于各部分是不同奇数的分拆数。再看各部分都不同的分拆,每个部分xk都可以唯一地表示为i2j,其中i为奇数。把该部分拆分为2ji,最终得到所有部分为奇数的分拆。反之对各部分为奇数的分拆,因为大小为i的部分的个数可以唯一表示为2的幂次之和,故这个对应关系是双向的。这就是说,各部分不相等的分拆数等于各部分为奇数的分拆数。

2. 基本计数的性质

2.1 二项式系数

  前面我们已经讨论过,组合数(nm)(1+x)n展开式中xm项的系数,当然也二项式(17)中xmynm项的系数,故它也称为二项式系数。组合数的定义式(3)中,n!m!(nm)!要求m,n都是非负整数,但(n)mm!n可以为任何实数,以后形式(xm)也可以用来表示多项式(x)mm!。这个推广其实是合理的,而在微积分中我们知道(1+x)α的幂级数展开式如式(18)所示(牛顿二项式定理),它正是(1+x)n的推广。另外易知,可重复组合数还可以写成式(19)。

(17)(x+y)n=k=0n(nk)xkynk

(18)(1+x)α=1+k=1(αk)xk

(19)((nm))=(1)m(nm)

  在中学我们就知道一些二项式系数的性质,证明都不难,这里仅仅列举。式(20)中分别是对称性和递推性,其中递推性有显然的组合意义。式(21)是随m的变化体现出来的单峰性。(1+x)n中令x=±1可得式(22)和(23),另外利用(1+x)m(1+x)n=(1+x)m+n可得范德蒙恒等式(Vandermonde)(24)。

(20)(nm)=(nnm);(nm)=(n1m1)+(n1m)

(21)(n0)<(n1)<<(nn2)=(nn2)>>(nn)

(22)(n0)+(n1)++(nn)=2n

(23)(n0)+(n2)+(n4)+=(n1)+(n3)+(n5)+=2n1

(24)k=0r(mk)(nrk)=(m+nr)

  二项式系数很早就被研究,最著名的当然就是杨辉三角(帕斯卡三角),它正是利用了公式(20)右。在反演公式那一章我们已经知道,矩阵{aij=(ij)}的逆矩阵是{bij=(1)ij(ij)},故有式(25)成立,当然你也可以直接证明它。

(25)k=0n(1)k+m(nk)(km)=δmn={1,ifm=n0,ifmn

   证明:k=0n(nk)2=(2nn)

   证明:(n1)+2(n2)++n(nn)=n2n1

   写出(x1+x2++xp)n的展开式。

2.2 Stirling数

  现在继续讨论第二类Stirling数,从名字就知道它是个有故事的数。公式(10)并不能让人满意,它甚至只是另一个计数问题的描述而已,能使用的就只有公式(11)了。该式显然满足单链Lm的反演公式的形式,把它整理为式(25)左式(为了得到关联函数(nk)),由反演公式得到了式(25)右,从而有S(n,k)的另一个显式表达式(26)。

(25)nm=k=0n(nk)k!S(m,k)n!S(m,n)=k=0n(1)nk(nk)km

(26)S(m,k)=1k!i=0k(1)ki(ki)km

  由于公式(11)对任意nm成立,故有等式(27)左成立,从而S(m,k)给出了多项式组{xm}{(x)m}的线性表出关系。这样的线性表出必定有逆关系(式(27)右),其中的s(m,k)就被称为第一类Stirling数,它和第一类Stirling数有关系式(28)。

(27)xm=k=0mS(m,k)(x)k(x)m=k=0ms(m,k)xk

(28)k=0mS(m,k)s(k,n)=δnm={1,ifm=n0,ifmn

  另一方面,考察式(27)右,不难知道s(m,k)有递推式(29),类似地有表达式(30)。s(m,k)正负项交叉出现,为了寻找其组合意义,考察表达式(31)中的c(m,k)。它显然是s(m,k)的绝对值,并且满足式(32)。容易验证,含有k个轮换的m元置换数,也满足式(32)的递推关系,这便是它的组合意义。

(29)s(m,k)=s(m1,k1)(m1)s(m1,k)

(30)s(k+r,k)=(1)r1k1k2krk+rk1k2kr

(31)(x)m=k=0mc(m,k)xk

(32)c(m,k)=c(m1,k1)+(m1)c(m1,k)

  • 求1λ12λ2mλm型置换的个数。

posted on   卞爱华  阅读(1451)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

点击右上角即可分享
微信分享提示