Loading [MathJax]/extensions/TeX/mathchoice.js

Lucas定理详解

这篇博客是从另一位园友那里存的,但是当时忘了写原文的地址,如果有找到原文地址的请评论联系!

Lucas定理解决的问题是组合数取模。数学上来说,就是求 \binom n m\mod p。(p为素数)

这里n,m可能很大,比如达到10^{15},而p10^9以内。显然运用常规的阶乘方法无法直接求解,所以引入Lucas定理。

Lucas定理

nm写成p进制数的样子(如果长度不一样把短的补成长的那个的长度):
n=(a0a1…ak)p
m=(b0b1…bk)p

那么:
\binom n m \equiv \prod _{i=0}^k \binom {a_i} {b_i} \mod p

证明
如果把Lucas定理从递归的角度理解,它其实是这样的:
n=ap+b,m=cp+d,(b,d<p,a=\lfloor\frac{n}{p}\rfloor,c=\lfloor \frac{m}{p}\rfloor) \\ \binom n m \equiv \binom a c * \binom b d

这个定理的一个很巧妙的证法是通过二项式定理来说明上面的式子是成立的。

首先,对于任意质数p,有:
(1+x)^p\equiv 1+x^p\mod p

其证明可以由费马小定理(x^p \equiv x \mod p) |p为素数)直接得出:
(1+x)^p\equiv 1+x
x^p\equiv x
所以(1+x)^p\equiv 1+x \equiv 1+x^p

(当然同样也有(a+b)^p\equiv a^p+b^p \mod p,具体为什么你可以拆开前面的式子,将其除 a^pb^p 项外的所有项的系数好好研究一下(其实就是杨辉三角的第p层),可以发现把对称项系数分别合并后都能整除p

利用这个性质,我们证明Lucas定理:
\begin{aligned} (1+x)^n&=(1+x)^{\lfloor \frac{n}{p}\rfloor *p}(1+x)^b \\ &=(1+x^p)^{\lfloor \frac{n}{p}\rfloor}(1+x)^b \\ &=\sum _{i=0}^k\binom {\lfloor \frac{n}{p}\rfloor} ix^{pi}\sum _{j=0}^k\binom b jx^j \end{aligned}

考察等式左右两边xmxm的系数,可以发现:
\begin{aligned} 左边&=\binom n m \\ 右边&=\binom {\lfloor \frac{n}{p}\rfloor} i\binom b j,(pi+j=m,j<p) \\ &=\binom {\lfloor \frac{n}{p}\rfloor} {\lfloor \frac{m}{p}\rfloor} \binom b d \end{aligned}

所以上面的式子成立,证明完毕。

如果不算预处理什么的,算法时间复杂度为O(log_pn)。如果能够支持预处理,那么就加一个O(p),要不就用快速幂,乘上O(logp)

posted @   大本营  阅读(2408)  评论(2编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
点击右上角即可分享
微信分享提示