组合恒等式与双计数
一条组合恒等式至少有两种读法。代数读法把两边各自展开、对齐同类项;组合读法给两边各配一个计数问题,再论证它们数的是同一批对象。后者称作双计数(double counting):同一个集合被数了两遍,两个结果只能相等。本页取三条恒等式,每条都按这两种读法各解一次,其中第一条还能在 Pascal 三角上直接看出形状。
1 · 曲棍球棒恒等式
组合读法:从 这 个数里选 个,共 种。按选中的最大那个数是 分类,剩下的 个必须取自比 小的那 个数,有 种; 的取值范围是 到 ,因为 时凑不出 个更小的数。各类互斥且穷尽,相加就是左边。
几何读法要用到 Pascal 三角与二项式定理里的坐标: 是第 行第 列,固定 让 递增,就是沿一条斜边往下走。这段斜边上所有格子的和落在 那一格,即斜边末端再往下一行、往右一列。杆是求和的那串格子,刃是答案所在的单格,合起来像一支曲棍球棒。
代数读法反复用 Pascal 递推 把右端逐层剥开:剥出 ,余下的 继续剥,直到 换成 收尾。
2 · 委员会与主席
从 人里选出一个委员会,再从委员会里指定一名主席。这件事的结果有多少种,取决于按什么次序去数。
先定委员会规模:取 人有 种,再从这 人里挑主席有 种; 从 遍历到 相加,得到 。先定主席: 种选法,剩下的 人各自独立地决定参不参加,得到 。两种数法数的是同一批「委员会加主席」的搭配:
作为热身, 是同一套路的退化情形:左边按子集大小分类,右边让每个元素独立地二选一。代数上它是二项式定理在 处的取值,加权和则是 求导后再取 。
3 · 平方和与对称性
组合读法:把 个元素分成前 个与后 个,从中选 个共 种;按取自前一组的个数 分类,前一组取 个、后一组取 个,该类有 种。这一步是范德蒙德卷积在 、 处的特例,再用对称性 把乘积写成平方。
平方的来路值得单记一笔:左边两个因子本来数的是两件不同的事(前一组取几个、后一组取几个),把它们并成同一个数的平方靠的是对称性,而不是某种「自乘」的直觉。
注 · 双计数与双射是同一立场的两副面孔。 双计数把同一批对象数两遍,两个计数式只能相等;双射则在两批对象之间造一一对应,两个集合只能一样大。前者不必写出对应关系,后者把它写了出来。§1 的分类求和是双计数;若把「最大元素为 的那些子集」逐个映到「从 以下取 个」的选法,同一条恒等式就成了一族双射(bijection)的并。
4 · 浮点组合数的失守点
combinatorics/core/combinatorics.ts 的 comb 按
逐步浮点乘除,末尾用 Math.round 收回整数。用它逐个
验算上面三条恒等式,两边首次不等的位置分别是:平方和在
,差
;加权和在
,差
;曲棍球棒在
且
,差
。热身的
撑到
,差
。这四个数字与差值都写进了 identities.test.ts,实现一改就会报出来。
警示 · 两侧失守的机理不同,且都不是「超出 Number.MAX_SAFE_INTEGER」一句能概括的。 comb 首次返回错值是在
:它给出 3167295784216201,精确值是 3167295784216200,而这个数还不到安全整数上限 9007199254740991 的一半,错的是中途几步浮点除法,Math.round 兜不住。平方和在
处的表现更反直觉——出错的是右边那一次
,29 项平方累加起来的左边反而给出精确值 7648690600760440;曲棍球棒在
撞上的还是同一个
。加权和与子集和的失守则在左边:
时左边累加到
,早已越过安全整数上限,是加法本身开始丢低位,而右边的
恰好是双精度能精确表示的形式。
5 · 参考文献
- Hockey-stick identity. Wikipedia. 曲棍球棒恒等式的组合证明与它在 Pascal 三角上的形状。https://en.wikipedia.org/wiki/Hockey-stick_identity
- Double counting (proof technique). Wikipedia. 双计数作为证明手法的定义与经典例子。https://en.wikipedia.org/wiki/Double_counting_(proof_technique)
- Binomial coefficient. Wikipedia. 二项式系数的恒等式汇总,含平方和与加权和两条。https://en.wikipedia.org/wiki/Binomial_coefficient
- Vandermonde's identity. Wikipedia. 范德蒙德卷积及其 特例。https://en.wikipedia.org/wiki/Vandermonde%27s_identity