zoukankan      html  css  js  c++  java
  • 【组合数学】 04

    1. 基本计数

    1.1 统一模型

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

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

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

    1.2 模型1:可区分( o)可区分

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

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

    [P(n,m)=(n)_m=n(n-1)cdots(n-m+1)=dfrac{n!}{(n-m)!} ag{1}]

      排列数要求每个函数值最多被映射一次,继续推广,我们假定(F)中第(k)个数被映射(m_k)次。这样的字称为是(a_1^{m_1}a_2^{m_2}cdots a_n^{m_n})型字,其中(m_1+m_2+cdots+m_n=m)。先将(m_k)个字母(a_k)看成互异的字母(a_{k1},cdots,a_{km_k}),这样的字有(m!)个,而原来的每个字对应到(m_1!m_2!cdots m_n!)个这样的字,故有式(2)成立。

    [N(a_1^{m_1}a_2^{m_2}cdots a_n^{m_n})=dfrac{m!}{m_1!m_2!cdots m_n!} ag{2}]

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

    1.3 模型2:不可区分( o)可区分

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

    [inom{n}{m}=dfrac{(n)_m}{m!}=dfrac{n!}{m!(n-m)!} ag{3}]

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

    [x_1+x_2+cdots+x_n=m ag{4}]

    [left(inom{n}{m} ight)=inom{m+n-1}{m}=dfrac{(n)^m}{m!} ag{5}]

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

    [0leqslant s_1leqslantcdotsleqslant s_n=m;Leftrightarrow;0leqslant t_1<cdots<t_n=m+n-1,;t_k=s_k+k-1 ag{6}]

    [x_1+x_2+cdots+x_nleqslant m ag{7}]

    [sum_{k=0}^minom{n+k-1}{k}=inom{n+m}{m} ag{8}]

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

    1.4 模型3:可区分( o)不可区分

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

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

    [S(m,k)=S(m-1,k-1)+kS(m-1,k) ag{9}]

    [S(k+r,k)=sum_{1leqslant k_1leqslant k_2leqslantcdotsleqslant k_rleqslant k}k_1k_2cdots k_r ag{10}]

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

    [n^m=sum_{k=0}^nS(m,k)(n)_k ag{11}]

    [B_m=sum_{k=0}^mS(m,k);Rightarrow;B_{m+1}=sum_{k=0}^minom{m}{k}B_{m-k} ag{12}]

    1.5 模型4:不可区分( o)不可区分

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

    [x_1+x_2+cdots+x_k=m,;;(x_1geqslant x_2geqslantcdotsgeqslant x_k) ag{13}]

    [x_1+2x_2+3x_3+cdots+mx_m=m ag{14}]

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

    [p(m,k)=p(m-1,k-1)+p(m-k,k) ag{15}]

    [p(k+r,k)=p(r,1)+p(r,2)+cdots+p(r,k) ag{16}]

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

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

    2. 基本计数的性质

    2.1 二项式系数

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

    [(x+y)^n=sum_{k=0}^ninom{n}{k}x^ky^{n-k} ag{17}]

    [(1+x)^{alpha}=1+sum_{k=1}^{infty}inom{alpha}{k}x^k ag{18}]

    [left(inom{n}{m} ight)=(-1)^minom{-n}{m} ag{19}]

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

    [inom{n}{m}=inom{n}{n-m};;;inom{n}{m}=inom{n-1}{m-1}+inom{n-1}{m} ag{20}]

    [inom{n}{0}<inom{n}{1}<cdots<inom{n}{lfloorfrac{n}{2} floor}=inom{n}{lceilfrac{n}{2} ceil}>cdots>inom{n}{n} ag{21}]

    [inom{n}{0}+inom{n}{1}+cdots+inom{n}{n}=2^n ag{22}]

    [inom{n}{0}+inom{n}{2}+inom{n}{4}+cdots=inom{n}{1}+inom{n}{3}+inom{n}{5}+cdots=2^{n-1} ag{23}]

    [sum_{k=0}^rinom{m}{k}inom{n}{r-k}=inom{m+n}{r} ag{24}]

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

    [sum_{k=0}^n(-1)^{k+m}inom{n}{k}inom{k}{m}=delta_{mn}=left{egin{matrix}1,& ext{if};m=n\0,& ext{if};m e nend{matrix} ight. ag{25}]

       证明:(sumlimits_{k=0}^ninom{n}{k}^2=inom{2n}{n});

       证明:(inom{n}{1}+2inom{n}{2}+cdots+ninom{n}{n}=ncdot 2^{n-1});

       写出((x_1+x_2+cdots+x_p)^n)的展开式。

    2.2 Stirling数

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

    [n^m=sum_{k=0}^ninom{n}{k}k!S(m,k);Leftrightarrow;n!S(m,n)=sum_{k=0}^n(-1)^{n-k}inom{n}{k}k^m ag{25}]

    [S(m,k)=dfrac{1}{k!}sum_{i=0}^k(-1)^{k-i}inom{k}{i}k^m ag{26}]

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

    [x^m=sum_{k=0}^mS(m,k)(x)_k;Leftrightarrow;(x)_m=sum_{k=0}^ms(m,k)x^k ag{27}]

    [sum_{k=0}^mS(m,k)s(k,n)=delta_{nm}=left{egin{matrix}1,& ext{if};m=n\0,& ext{if};m e nend{matrix} ight. ag{28}]

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

    [s(m,k)=s(m-1,k-1)-(m-1)s(m-1,k) ag{29}]

    [s(k+r,k)=(-1)^rsum_{1leqslant k_1leqslant k_2leqslantcdotsleqslant k_rleqslant k+r}k_1k_2cdots k_r ag{30}]

    [(x)^m=sumlimits_{k=0}^mc(m,k)x^k ag{31}]

    [c(m,k)=c(m-1,k-1)+(m-1)c(m-1,k) ag{32}]

      • 求(1^{lambda_1}2^{lambda_2}cdots m^{lambda_m})型置换的个数。

  • 相关阅读:
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    SQL查询表中的用那些索引
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    【转】迷你区块链(mini blockchain in python)
    理解 Web 3
    【转】数字货币钱包:生态及技术
    【转】用 Witnet 协议使加密网络可以跨链访问
  • 原文地址:https://www.cnblogs.com/edward-bian/p/5630864.html
Copyright © 2011-2022 走看看