卢卡斯定理
卢卡斯定理
卢卡斯定理:对于非负整数m和n和素数p,下面同余式成立:
(mn)=k∏i=0(mini)(modp)其中:
m=k∑i=0mipin=k∑i=0nipi满足0≤mi<p且0≤ni<p。
证明:
由于 (pn)=p(p−1)…(p−n+1)n(n−1)…1) 因此,只有当n为1或p时,上面二项式中有因子p。因此可以推出 (1+X)p=1+Xp(modp) 利用数学归纳法可以容易得到下面的扩展: (1+X)pi=1+Xpi(modp) 之后我们利用这个扩展证明卢卡斯定理。
m∑n=0(mn)Xn=(1+X)m=(1+X)∑ki=0mipi=k∏i=0((1+X)pi)mi=k∏i=0(1+Xpi)mi=k∏i=0mi∑ni=0(mini)Xnipi=k∏i=0p−1∑ni=0(mini)Xnipi=m∑n=0(k∏i=0(mini))Xn(modp)扩展卢卡斯
卢卡斯定理,必须要求p为素数,这是一个非常严苛的要求。即使p不是素数,我们实际还是可以用卢卡斯定理进行加速。
首先由算术基本定理可知p=pc11pc22…pckk,其中pi为互不相同的素数,ci≥1。之后我们需要计算出所有的(mn)(modp)cii后,利用中国余数定理将结果合并,恢复为(mn)(modp)。
但是我们还需要解决一个问题,怎么计算(mn)(modpcii)呢。如果ci为1,那么实际上直接就可以使用卢卡斯定理,但是如果ci不是1,我们必须采用其它方法。
(mn)=m!n!(m−n)!=m!pain!pbi⋅(m−n)!pci⋅pa−b−ci我们需要做的是从m!中提取所有的因子pi并算出其余的阶乘值。而n!和(m−n)!则类似。
m!=1⋅2⋯m=(1⋅2⋯(pi−1)⋅1⋅(pi+1)⋯m)(pi⋅2pi⋯⌊mpi⌋pi)=p⌊mpi⌋i(1⋅2⋯(pi−1)⋅1⋅(pi+1)⋯m)(1⋅2⋯⌊mpi⌋)=p⌊mpi⌋i(1⋅2⋯(pi−1)⋅1⋅(pi+1)⋯m)(⌊mpi⌋!)(modpcii)其中(1⋅2⋯(pi−1)⋅1⋅(pi+1)⋯m)是周期为pcii的序列。我们可以记这样的序列为G(m),而记F(m)=m!(modpcii),那么可以推出
F(m)=p⌊mpi⌋iG(m)F(⌊mpi⌋)=p⌊mpi⌋iG(pcii)⌊mpcii⌋G(m(modpcii))F(⌊mpi⌋)如果我们能预先计算出所有的G(1),G(2),…,G(pcii),那么计算F(m)的时间复杂度将为O(pcii+(log2m)2)。而计算(mn)(modp)的时间复杂度为O(p)