跳转至

Lucas 定理

Lucas 定理ψ(`∇´)ψ

内容ψ(`∇´)ψ

对于任意质数 p,存在如下定理:

(nm)(npmp)(nmodpmmodp)(modp)

证明ψ(`∇´)ψ

整个过程极度蜜蜂,不知道咋想出来的。

首先考虑证明一个引理:

I. 对于一个关于 xp 次二项式 fp(x)=(axn+bxm)p,有:fp(x)f(xp)(modp) 即是 (axn+bxm)p(apxpn+bpxpm)(modp)

我们考虑先证明弱化版本,然后再推广:

II. 对于二项式 (a+b)p,它在模 p 意义下和 ap+bp 同余。

考虑二项式系数 (pi) 的取值,拆开考虑:p!i!(pi)!,注意到分子只有一个 p,所以在模 p 意义下,只有当 i=0 或者 i=p 的时候,(pi)=1,否则等于 0

所以代入二项式定理:(a+b)pi=0p(pi)apibii=0p[i=0  i=p]apibiap+bp(modp)

这里没有使用任何其他有限制的定理,所以这个东西可以比较自然的推广到多项式形式。

然后我们回到原问题,求 (nm)modp 本质上是求 [xm](1+x)nmodp,此时有一个比较蜜蜂的想法,我们考虑把余数分离一下:

(1+x)n(1+x)pnp(1+x)nmodp(modp)(1p+xp)np(1+x)nmodp(modp) (use theorem I.)(1+x)np(1+x)nmodp(modp) (use theorem II.)

然后我们对两边分别看一下贡献:[xm](1+x)np=(npmp),[xm](1+x)nmodp=(nmodpmmodp)

由此,可以得到 Lucas 定理的表达式,Q.E.D.

实现ψ(`∇´)ψ

因为 n/p 的数量级期望显然大于 nmodp,所以我们预处理模 p 意义下的组合数,前者直接调用,后者递归 logp 次即可,所以一般来说 Lucas 要求 p<105

1
2
3
4
i64 lucas(i64 n, i64 m, i64 p) {
    if(m == 0) return 1ll;
    return (C(n % p, m % p, p) * lucas(n / p, m / p, p)) % p;
}

exLucasψ(`∇´)ψ

可以对于任意正整数 p 使用的 Lucas。

考虑类似 exCRT 的经典套路,我们分解质因数,用 CRT 构造一个方程然后合并,这样每个方程里面都是一个 Lucas。

也就是,令 p=i=1rarcr

然后因为任意 aici,ajcj 互质,所以我们把他们当作模数。

由 CRT,令 (nm) 为未知数,有:

{c1(nm)(moda1c1)c2(nm)(moda2c2)cr(nm)(modarcr)

可以由此解出未知数在模 p 意义下的唯一解 (nm)modp


最后更新: May 9, 2023