Lucas 定理学习笔记

前言

最近在写数学题,补一些定理证明。

本文参考了 OI-wikiiorit 的博客,如有错误或不足,敬请指出。

前置知识

二项式定理

二项式定理:(a+b)n=i=0n(ni)aibni

证明:从组合意义考虑每一项的系数易证。

Lucas 定理

内容

Lucas 定理:对于质数 p,有

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

证明

Lemma:(pi)modp=[i=0i=p]

证明:(pi)=p!i!(pi)!,显然 p 无法被比它小的数约分,仅当 i=pi=0 时,(pi)=1i 取其它取值时都 (pi) 含有 p 这个因子,即 (pi)modp=0

Lemma:(a+b)pap+bp(modp)

证明:由二项式定理及上述引理得

(a+b)p=i=0n(pi)aibpii=0n[i=0i=p]aibpi(modp)ap+bp(modp)

可以看出,当 a,b 为多项式时,该引理仍然适用。

由二项式定理得 (nm) 即为 (x+1)nm 次系数。

由上述引理得

(x+1)n=(x+1)pnp(x+1)nmodp(xp+1)np(x+1)nmodp(modp)

m 次项

(nm)xm(npmp)xpmp(nmodpmmodp)xmmodp(modp)

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

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

可以 O(p+logn) 求出。

扩展 Lucas 定理

过程

还是求 (nm)modp,但 p 不一定为质数,设 p=i=1wpiαi,piPrime

于是可以求出所有 (nm)modpiαi,再 CRT 合并即可。

考虑如何求 (nm)modpk,其中 pPrime

(nm)modpk=n!m!(nm)!modpk,当 max(n,m)p 时,不存在逆元,考虑把分子分母的 p 约掉,令 f(x)=max{k|x!pkN},即 x! 包含多少个因子 p,设 n=apf(n),m=bpf(m),nm=cpf(nm),则 (nm)=abcpf(n)f(m)f(nm)

容易证明,f(x)={0x<pxp+f(xp)xp

可以看出,f(x) 可以在 O(logx) 的时间内求出。

于是求 abc 即可,考虑如何处理阶乘。

举个例子,求 22!3f(22)mod32

22!=1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19×20×21×22=1×2×4×5×7×8×10×11×13×14×16×17×19×20×22×3×6×9×12×15×18×21=1×2×4×5×7×8×10×11×13×14×16×17×19×20×22×7!×37

发现 181017 在模 32 意义下下是一样的,合并起来。

22!(1×2×4×5×7×8)2×19×20×22×7!×37(mod32)

后面几个零散的数可以直接取模,即

22!(1×2×4×5×7×8)2×1×2×4×7!×37(mod32)

阶乘前的两部分都是 O(pk) 级别的,前半部分的循环节乘起来后快速幂,后半部分的零散块暴力乘,然后递归处理就好。

若不计 CRT 的复杂度,这个算法是 O(plogn) 的,实际上还可以优化,发现循环节和零散块都可 O(p) 轻松预处理,复杂度可优化到单次到 O(logn)

posted @   Terac  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示