卢卡斯定理证明

lucas定理一般用来解决如下问题:

Lucas 定理用于求解大组合数取模的问题,其中 p 必须为素数。正常的组合数运算可以通过递推公式求解(详见 排列组合 ),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理。

以上摘自oi wiki
lucas定理内容如下:

\[{n\choose m}\equiv {\lfloor\frac{n}{p}\rfloor\choose \lfloor\frac{m}{p}\rfloor}\cdot {n\% p\choose m \%p}(mod\ p) \]

其实也可以写为:

\[{n\choose m}\equiv \prod_{i=0}^k{n_i\choose m_i}(mod\ p) \]

其中\(n_i,m_i\)分别为\(n,m\)拆分为\(p\)进制后,每一位对应的值。


接下来说一下定理内容的证明,给大家介绍一种生成函数的做法。
首先我们注意到有这样一个恒等式:

\[\displaystyle (1+x)^p\equiv (1+x^p) \]

证明的话也不难:
注意到\(\displaystyle {p\choose n}=\frac{p!}{n!(p-n)!}\),在模\(p\)意义下,显然只有\(n=0\)\(n=p\)时这个式子值大于\(0\),那么\(\displaystyle (1+x)^p=\sum_{n=0}^p{p\choose n}x^n=1+x^p\)
同理,在模\(p\)意义下,可推广为\((a+b)^p\equiv a^p+b^p(mod\ p)\)
上述式子通过数学归纳法还可以得出这样一个等式:

\[(1+x)^{p^i}\equiv 1+x^{p^i}(mod\ p) \]

接下来证明就开始啦QAQ
我们首先有\(\displaystyle m=\sum_{i=0}^km_ip^i\),即将\(m\)\(p\)进制下拆分。那么:

\[\begin{aligned} (1+x)^m=&(1+x)^{\sum_{i=0}^km_ip^i}\\ =&\prod_{i=0}^k(1+x)^{p^im_i}\\ =&\prod_{i=0}^k(1+x^{p^i})^{m_i}\\ =&\prod_{i=0}^k\sum_{n_i=0}^{m_i}{m_i\choose n_i}x^{p^in_i}\\ =&\prod_{i=0}^k(\sum_{n_i=0}^{p-1}{m_i\choose n_i}x^{p^in_i}) \end{aligned} \]

注意到后面括起来的部分可以看作一个多项式,那么上面整个式子都是若干个多项式的乘积。
现在我们从生成函数的角度思考,发现\(x\)的指数部分最后乘起来是一个这样的形式:\(\displaystyle \sum_{i=0}^k n_ip^i\),显然可以发现这为某个\(n\)\(p\)进制分解。
那么考虑枚举最后得到的\(n\),就有:

\[\begin{aligned} &\prod_{i=0}^k(\sum_{n_i=0}^{p-1}{m_i\choose n_i}x^{p^in_i})\\ =&\sum_{n=0}^m(\prod_{i=0}^k{m_i\choose n_i})x^n \end{aligned} \]

上面的\(n_i\)\(n\)\(p\)进制分解中对应的数。
那么lucas定理的内容就证明完啦。

猜你喜欢

转载自www.cnblogs.com/heyuhhh/p/12919993.html
今日推荐