双射证明与格路模型
要证两个计数相等,一条路是各算一遍再比数值,另一条路是在两类对象之间造一个一一对应。后者给出的是构造,比代数验算多说明一件事:对象之间到底是怎么对上的。本页以格点上的路线为例,把它先对应到 R/U 串、再对应到位置子集,读出计数 。
1 · 一一对应作为证明手段
定义 1.1(双射) 集合 到集合 的映射 若既是单射又是满射,则称 为双射(bijection)。有限集之间存在双射时两者元素个数相等,记 。
双射证明把「两个数相等」换成「两批对象能配对」。代数验算只能确认等号成立,双射还交出配对规则本身,而这条规则通常可以直接拿去做编码、枚举与等概率抽样:知道第 条格路对应哪个子集,就等于知道怎么给全部格路编号。
判断一个映射是不是双射,最省事的办法是把逆映射写出来。写得出逆映射,单射与满射都不必单独验。本页后面的每处双射都按这个办法给出:正向一句,反向一句,两句合起来即证。
2 · 格路模型与位置子集
从 出发,每步向右或向上一格,走到 的路线称为单调格路(monotone lattice path)。任一条这样的路线恰含 步向右与 步向上,按先后写成一个长为 的 R/U 串;反过来,任一含 个 R 的 R/U 串按字符逐步走,走回一条路线。两个方向互逆,第一重双射成立。
第二重在 R/U 串与位置子集之间:一个串由「哪些位置放 R」完全决定,取 R 的下标集得到 的一个 元子集;取一个 元子集反填 R、其余填 U,得到原串。两重合起来给出
把每个格点标上到达它的路径数,得到的是转了 45° 的 Pascal 三角(见 Pascal 三角与二项式定理 §1)。格点 的上一步只能来自左邻 或下邻 ,两类互斥且穷尽,该点计数等于两邻之和,这条就是 Pascal 递推 换了坐标系的写法。
警示 · 递推网格与闭式在大参数下会分家。本系列的 comb 走浮点连乘连除再 Math.round,而 pathGrid 只做整数加法。从
起逐层比对全部格点,第一处分歧落在
:
的精确值是
,comb 给出
,差
。该值只有
的约三分之一,仍在安全整数范围内,分歧来自中途除法的舍入而非溢出;整数递推自身要到
才越过 Number.MAX_SAFE_INTEGER。core/paths.test.ts 把这两个数字连同「
全部相等」一并锁成断言。
3 · 对称性与隔板法的双射读法
的双射是取补:把每个 元子集换成它在 里的补集。取补映射与自身复合是恒等映射,即它是对合,逆映射就是它本身,双射性不必另证。放回格路上读,取补即把每条路线的 R 与 U 全部对调, 的路线一一对应到 的路线。
隔板法(stars and bars)本身也是一个双射,可重复选取 §1 已经用过:从 种类型里无序可放回地取 个,取法由每种类型各取几个完全决定,写成 颗星被 根竖线隔成 段的一排记号;反向读这排记号,段内星数即各类型的取数。两端互逆,取法数等于在 个位置里挑竖线位置的数目 。
Catalan 数的反射法是同一手法的加强版:在格路之间再造一个双射,把越过对角线的路线双射到一族容易数的格路,用总数减掉它。组合数本身的定义与它同排列的关系见 组合 C(n, k)。
4 · 参考文献
- Bijective proof. Wikipedia. 双射证明的思想、判据与若干经典例子。https://en.wikipedia.org/wiki/Bijective_proof
- Lattice path. Wikipedia. 格路的定义、单调格路计数与反射法。https://en.wikipedia.org/wiki/Lattice_path
- Stars and bars. Wikipedia. 隔板法把无序可放回的取样化归成排星与竖线。https://en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)