假设我们要求的组合数为 C ( n , m ) ,因为这个数比较大,所以通常求的是 C ( n , m ) mod p。卢卡斯定理本来的定义是:
将 m 和 n 分别在 p 进制下表示出来:
那么一定有:
不过这样做,总显得不够方便、优美吧。我们可以把这个算式稍微修改一下:
接下来就要证明上面这个等价的算式了。
为了表示方便,我们将 n 和 m 分别写为 n = sp + q,m = tp + r。q 和 r 为余数,即 q 和 r 均小于 p。接着我们可以得出(相当于构造):
( 1 + x ) ^ n ≡ ( 1 + x ) ^ ( sp + q ) ≡ ( ( 1 + x ) ^ p ) ^ s · ( 1 + x ) ^ q ( mod p )
想象一下用二项式定理将 ( 1 + x ) ^ p 展开的过程吧,除了第一项和最后一项,中间部分的系数均为 C ( p,i )。其中 p > i > 0,因此一定有 C ( p,i ) ≡ 0 ( mod p )。那么 ( 1 + x ) ^ p ≡ 1 + x ^ p ( mod p ),即原式 ≡ ( 1 + x ^ p ) ^ s · ( 1 + x ) ^ q ( mod p )。
再用二项式定理将 ( 1 + x ^ p ) ^ s 和 ( 1 + x ) ^ q 分别展开,得到:
接下来,也许你就能明白为什么我们要构造 ( 1 + x ) ^ n 了。比对等式左右两边 x ^ m = x ^ ( tp + r ) 的系数,必然是相等的(对应系数相等)。等式左边的系数为 C ( sp+q,tp + r ) = C ( m ,n )。在求等式右边的系数时,你会发现只有当 i = t,j = r 时才会产生 x ^ ( tp + r ) 的项。因此右边的系数为 C ( s,t)· C ( q,r ),与左边的 C ( m,n ) 相等,得证。
当然,如果不想设其他字母,可以写成 C ( m,n ) = C ( m mod p,n mod p ) · C ( m / p,n / p ),其中 / 表示除得的商。这样的表示方法是不是很优美呀?
我觉得卢卡斯定理看上去还是比较神奇的,但证明方法不是特别复杂吧。如果用卢卡斯定理编程递归求组合数,还是相当快速的。
最后 " 照例 " 讲一个小八卦啦。卢卡斯是 19 世纪的法国数学家,是汉诺塔的发明人!所以汉诺塔又称为 " 卢卡斯塔 ",点击下面的链接了解汉诺塔吧。同时,卢卡斯还保留了手工推最大质数的记录(当时没有计算机),证明了 2 ^ 127 - 1 是质数。