首页 > 其他分享 >Lucas定理——定义、证明、实现、运用

Lucas定理——定义、证明、实现、运用

时间:2023-04-25 18:25:24浏览次数:37  
标签:Lucas pmod sum 定义 long 定理 equiv

目录

什么是Lucas定理

这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题。

有质数 \(p\),对于\(n,m\),如果\(n=k_1p+b_1,m=k_2p+b_2\),有

\[C_n^m\equiv C_{k_1}^{k_2}C_{b_1}^{b_2} \pmod p \]

由此可以分解成较小的问题求解。

证明Lucas定理

这个证明利用了二项式定理的思路,前所未闻,真的很有趣。

根据二项式定理可以得到 \((1+x)^n\)中\(x^m\)的系数为\(C_n^m\)。

我们用这一点作为突破口,对于\((1+x)^n\),我们有

\[(1+x)^n\equiv (1+x)^{k_1p+b_1}\equiv (1+x)^{k_1p}(1+x)^{b_1}\equiv ((1+x)^p)^{k_1}(1+x)^{b_1}\pmod p \]

然后有一个很有意思的东西

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

为什么呢?将式子拆开后,显然除了第一项与最后一项,其他项是\(p\)的倍数,自然就会抹掉了。

继续进行推导,我们有

\[(1+x)^n\equiv(1+x^p)^{k_1}(1+x)^{b_1}\pmod p \]

于是右边的式子拆开可以得到

\[(\sum_{i=0}^{k_1} C_{k_1}^i x^{pi})(\sum_{j=0}^{b_1} C_{b_1}^j x^{j})\pmod p \]

我们要求\(x^m\)的系数,也就是\(x^{k_2p+b_2}\)的系数。

由于\(b_1<p\),所以\(k_2p\)只能让\(\sum_{i=0}^{k_1} C_{k_1}^i x^{pi}\)负责了,当\(i=k_2\)时符合条件,此时系数为\(C_{k_1}^{k_2}\)。

剩下部分由\(\sum_{j=0}^{b_1} C_{b_1}^j x^{j}\)负责,当\(j=b_2\)时符合条件,此时系数为\(C_{b_1}^{b_2}\)。

因此 \(x^m\)的系数为\(C_{k_1}^{k_2}C_{b_1}^{b_2}\),前文已知根据二项式定理\(x^m\)的系数为\(C_n^m\),我们得到

\[C_n^m\equiv C_{k_1}^{k_2}C_{b_1}^{b_2} \pmod p \]

由此,完成了Lucas定理的证明。

Lucas定理求解组合数的C++实现

代码上没什么难点,首先基础的组合数求解还是要有的,也就是我们需要预处理阶乘逆元,然后使用Lucas将组合数拆开再用基础的组合数求解即可。

long long ksm(long long x,long long y)
{
    long long sum=1;
    while(y)
    {
        if(y&1)
        {
            sum*=x;
            sum%=mod;
        }
        x*=x;
        x%=mod;
        y>>=1;
    }
    return sum;
}
long long C(long long n,long long m)
{
    if(m>n)return 0;
    if(m==0||n==m)return 1;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long lucas(long long n,long long m)
{
    if(m>n)return 0;
    if(n<mod)return C(n,m);
    return lucas(n/mod,m/mod)*lucas(n%mod,m%mod)%mod;
}
void init()
{    
    fac[0]=1;
    for(int i=1;i<=mod-1;i++)
    {
        fac[i]=fac[i-1]*i%mod;
    }
    inv[mod-1]=ksm(fac[mod-1],mod-2);
    for(int i=mod-2;i>=0;i--)
    {
        inv[i]=inv[i+1]*(i+1)%mod;
    }
}

标签:Lucas,pmod,sum,定义,long,定理,equiv
From: https://www.cnblogs.com/I-am-joker/p/17353463.html

相关文章

  • Three.js教程:Face3对象定义Geometry的三角形面
    推荐:将NSDT场景编辑器加入你的3D工具链其他系列工具:NSDT简石数字孪生Face3对象定义Geometry的三角形面几何体Geometry的三角面属性geometry.faces和缓冲类型几何体BufferGeometry顶点索引属性BufferGeometry.index类似都是顶点位置数据的索引值,用来组织网格模型三角形的绘制。......
  • pytorch自定义或自组织数据集
     importosfrompathlibimportPathfromtypingimportAny,Callable,Optional,TupleimportnumpyasnpimporttorchimporttorchvisionfromPILimportImageclassDatasetSelfDefine(torchvision.datasets.vision.VisionDataset):def__init__(......
  • Servlet添加自定义的过滤器没有效果?
    在学习HttpServlet的时候有个自定义过滤器的定义类,我们想让特定url走过滤器。publicclassMyFilterimplementsFilter{privateFilterConfigconfig;publicvoidinit(FilterConfigconfig)throwsServletException{this.config=config;}publi......
  • 【HarmonyOS】自定义组件之JavaUI实现通用标题栏组件
    【关键字】标题栏、常用内置组件整合、JavaUI、自定义组件 【1、写在前面】平时我们在开发一个应用时,我们都知道一个完整的项目中会有很多个页面,而这些页面中会有许多通用的部分,比如通用标题栏、通用Dialog、通用下拉菜单等等,在Android开发中我们可以通过LayoutInflater.from......
  • 比较Python与Java在类的定义、继承、多态等方面的异同
    首先我来进行介绍Python与Java在类的定义、继承、多态等方面的异同1.python类和java类的使用一览java:publicclassCar{privateStringcolor;privateStringmodel;privateintyear;publicCar(Stringcolor,Stringmodel,intyear){......
  • 自定义Python版本ESL库访问FreeSWITCH
    环境:CentOS7.6_x64Python版本:3.9.12FreeSWITCH版本:1.10.9一、背景描述ESL库是FreeSWITCH对外提供的接口,使用起来很方便,但该库是基于C语言实现的,Python使用该库的话需要使用源码进行编译。如果使用系统自带的Python版本进行编译,过程会比较流畅,就不描述了。这里记录下使用自定义......
  • 类的定义与对象的创建使用
    定义类://定义一个手机类//属性:创建品牌、颜色、价格//行为:给xxx打电话群发短信publicclassphone{Stringbrand;Stringcolor;intprice;publicvoidcall(Stringname){System.out.println("给"+name+"打电话");}publicv......
  • 1 Go语言介绍、 2 Go开发环境搭建 、3 第一个helloworld 、4 变量命名规范 、5 变量的
    目录1Go语言介绍2Go开发环境搭建3第一个helloworld4变量命名规范5变量的定义和使用1Go语言介绍#Go语言介绍Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于解析型语言的编译型语言(静态:类型固定强类型:不同类型不允许直接......
  • shell 脚本中定义log日志
    #!/bin/bashworkspace=$(cd`dirname$0`/.;pwd)cd$workspacefunction_log_error(){echo-e"\033[31m[ERROR]\033[0m$@"}function_log_info(){echo-e"\033[32m[INFO]\033[0m$@"}function_log_warn(){echo-e"\0......
  • 【IT老齐010】CAP定理
    【IT老齐010】CAP定理分布式架构的基本理论。指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partitiontolerance)。C:更新操作成功后,所有节点在同一时间的数据完全一致。(复习:事务的一致性:事务前后的数据完整性保持一致)A:用户访问数据时,系统能......