Lucas 定理
摘自算法竞赛
对于 m,n∈N,和素数 P,有:
Cmn≡i=0∏kCmini(modP)
其中,m=i=0∑kPi×mi,n=i=0∑kPi×ni,即 mi 和 ni 分别是 m 和 n 的 P 进制展开。即对于 m 和 n,计算它们 P 进制下每一位的组合数,最后相乘。
特别的,规定当有 mi<ni 时,Cmini=0,此时 CmnmodP=0。
上式在编程时的等价式子为:
Cmn≡CmmodPnmodP⋅C⌊m/P⌋⌊n/P⌋(modP)
其可通过递归求得。
证明该公式
证明 对于任一素数 P,n∈[1,P−1],有:
CPn=n!⋅(P−n)!P!=(n−1)!⋅(P−n)!(P−1)!×nP=CP−1n−1×nP
因为 P 为素数,所以 P 与 n 互质,
所以 P/n 中 P 除不掉,CP−1n−1 也不能把 P 除掉,必有 CPn=nCP−1n−1×P≡0(modP)。
将原式代入二项式定理展开式,得:
(1+x)P=n=0∑PCPn×1P−n×xn=1+n=1∑P−1CPn×xn+xP≡1+xP(modP)
下面推导 Cmn≡CmmodPnmodP⋅C⌊m/P⌋⌊n/P⌋(modP)。
令 n=sP+q,m=tP+r,q<P 且 r<P。
即 q,r 分别为 n,m 除以 P 的余数,s,t 分别为其商。
则待证明式为 Cmn≡Crq⋅Cts(modP)。
另有:
(1+x)m=(1+x)tP+r=(1+x)tP(1+x)r≡(1+xP)t(1+x)r≡(i=0∑tCti×xiP)×(j=0∑rCrj×xj)(modP)
注意第四项前为恒等号。
现在我们需要对 (1+x)m,表示其展开后 xn 项的系数。
假设 modP 不存在,因为可以使得 P 与 x 互质。
第一种表达 xn 项的系数方式为 Cmn,由 (1+x)m=∑i=0mCmi⋅xi 得到。
第二种表达方式:
n=sP+q,所以 xn=xsP⋅xq。因为 r<P,所以 (1+x)r 不可能提供 xsP 项。同理,因为 P>q,所以 (1+xP)t 不可能提供 xq 项。
故 xn 系数的提供是由 xtP 的系数和 xr 的系数共同相乘提供的。
即 (1+xP)t 提供 xsP 项,(1+x)r 提供 xq 项。
所以当 i=s,j=q 时,两个系数分别为 Cts 和 Crq。
得证 Cmn≡Crq⋅Cts(modP)。