卢卡斯定理

Published: by Creative Commons Licence

  • Tags:

卢卡斯定理

卢卡斯定理:对于非负整数mn和素数p,下面同余式成立:

(mn)=ki=0(mini)(modp)

其中:

m=ki=0mipin=ki=0nipi

满足0mi<p0ni<p

证明:

由于 (pn)=p(p1)(pn+1)n(n1)1) 因此,只有当n1p时,上面二项式中有因子p。因此可以推出 (1+X)p=1+Xp(modp) 利用数学归纳法可以容易得到下面的扩展: (1+X)pi=1+Xpi(modp) 之后我们利用这个扩展证明卢卡斯定理。

mn=0(mn)Xn=(1+X)m=(1+X)ki=0mipi=ki=0((1+X)pi)mi=ki=0(1+Xpi)mi=ki=0mini=0(mini)Xnipi=ki=0p1ni=0(mini)Xnipi=mn=0(ki=0(mini))Xn(modp)

扩展卢卡斯

卢卡斯定理,必须要求p为素数,这是一个非常严苛的要求。即使p不是素数,我们实际还是可以用卢卡斯定理进行加速。

首先由算术基本定理可知p=pc11pc22pckk,其中pi为互不相同的素数,ci1。之后我们需要计算出所有的(mn)(modp)cii后,利用中国余数定理将结果合并,恢复为(mn)(modp)

但是我们还需要解决一个问题,怎么计算(mn)(modpcii)呢。如果ci1,那么实际上直接就可以使用卢卡斯定理,但是如果ci不是1,我们必须采用其它方法。

(mn)=m!n!(mn)!=m!pain!pbi(mn)!pcipabci

我们需要做的是从m!中提取所有的因子pi并算出其余的阶乘值。而n!(mn)!则类似。

m!=12m=(12(pi1)1(pi+1)m)(pi2pimpipi)=pmpii(12(pi1)1(pi+1)m)(12mpi)=pmpii(12(pi1)1(pi+1)m)(mpi!)(modpcii)

其中(12(pi1)1(pi+1)m)是周期为pcii的序列。我们可以记这样的序列为G(m),而记F(m)=m!(modpcii),那么可以推出

F(m)=pmpiiG(m)F(mpi)=pmpiiG(pcii)mpciiG(m(modpcii))F(mpi)

如果我们能预先计算出所有的G(1),G(2),,G(pcii),那么计算F(m)的时间复杂度将为O(pcii+(log2m)2)。而计算(mn)(modp)的时间复杂度为O(p)