• 卢卡斯定理证明


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

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

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

    [{nchoose m}equiv {lfloorfrac{n}{p} floorchoose lfloorfrac{m}{p} floor}cdot {n\% pchoose m \%p}(mod p) ]

    其实也可以写为:

    [{nchoose m}equiv prod_{i=0}^k{n_ichoose m_i}(mod p) ]

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


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

    [displaystyle (1+x)^pequiv (1+x^p) ]

    证明的话也不难:
    注意到(displaystyle {pchoose n}=frac{p!}{n!(p-n)!}),在模(p)意义下,显然只有(n=0)(n=p)时这个式子值大于(0),那么(displaystyle (1+x)^p=sum_{n=0}^p{pchoose n}x^n=1+x^p)
    同理,在模(p)意义下,可推广为((a+b)^pequiv 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)进制下拆分。那么:

    [egin{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}^ksum_{n_i=0}^{m_i}{m_ichoose n_i}x^{p^in_i}\ =&prod_{i=0}^k(sum_{n_i=0}^{p-1}{m_ichoose n_i}x^{p^in_i}) end{aligned} ]

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

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

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

  • 相关阅读:
    C学习笔记——字符串操作
    抓取网站特定内容后直接入mysql库
    C语言笔记——时间运算
    SCP链接方式
    C学习笔记——数组
    免费HTTP数据抓包Fiddler2[4.6.1.2]以及显示中文包内容的方法
    近期要研究的jquery插件
    Always 英文技术网站一
    silverlight工具下载网址
    英文网站参照1
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/12919993.html
Copyright © 2020-2023  润新知