Lucas定理——推导及证明

news/2024/11/8 6:00:33/

                                     Lucas定理(大组合数取模)


一、定义:

当n、m为大数,p为素数时, Lucas定理是用来求 c(n,m) mod p的 值。 适用领域范围 在数论中求大组合数取模。

  表达式: C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p

二、定理内容:

Lucas定理:我们令 n=sp+q , m=tp+r . (q ,r ≤p)
那么:
(在编程时你只要继续对
 
调用Lucas定理即可。
代码可以递归的去完成这个过程,其中递归终点为 t = 0 ;
时间 O(logp(n)*p))。

三、证明及推导:  (该过程边看边写效果更佳!)

要证:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p

即证C(n,m)=C(n/p,m/p)*C(n%p,m%p)

  证明:

已知p是素数,n、m、p为整数。

1.由二项式定理得:
                ,且 

2.由费马小定理得:

(1)式 :(1+x)^p ≡ (1+x)(mod p).
(2)式 :(1+x^p)≡ (1+x)(mod p).     (因为x^p与x取模p同余,同时加1也同余

  则由上式可知:
                              (1+x)^p ≡  (1+x^p)(mod p)  (记为(3)式)

3.n = n/p*p + n%p . 则:
               (1+x)^p(mod p) = (1+x)^(n/p*p)*(1+x)^(n%p)mod p

由式3得:             (1+x)^p(mod p)= (1+x^p)^(n/p)*(1+x)^(n%p)mod p

将上式由二项式公式可转化为:(这一排你用手写看一下吧,这编辑器里太难敲了……)

   ∑(n,z=0)C(n,z)* x^z (mod p)=∑(n/p,i=0)C(n/p,i)* x^(p*i)*∑(n%p,j=0)C(n%p,j)* x^j( mod p)

任意一个Z,必存在一个i,j满足:x^z = x^(p*i)*x^j(即满足:n = n/p*p + n%p),当且仅当: i=z/p,j=z%p 时成立             
此时:          
               C(n,m)=C(n/p,m/p)*C(n%p,m%p)  成立

得证!

代码求解过程中,不断将C(n/p,m/p)拆分化简,实质是一直在计算C(n%p,m%p),即:
C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p
等价于C(n,m)%p=C(n/p/p,m/p/p)*C(n/p%p,m/p%p)%p
等价于C(n,m)%p=C(n/p/p/p,m/p/p/p)*C(n/p/p%p,m/p/p%p)%p
等价于…
直到拆分至m=0,递归完成。


四、逻辑代码:

#include<iostream>
using namespace std;
typedef long long ll;ll fastmod(ll a,ll b,ll p) //费马小定理
{ll cnt=1;while(b){if(b&1)cnt=(cnt*a)%p;a=(a*a)%p;b>>=1;}return cnt;
}ll Comb(ll a,ll b,ll p) //组合数
{ll ca=1,cb=1,tmp=1;;if(a<b) return 0;if(a==b) return 1;if(b>a-b) b=a-b;for(ll i=0;i<b;i++){ca=(ca*(a-i))%p;cb=(cb*(b-i))%p;}tmp=(ca*fastmod(cb,p-2,p))%p;   //除法转换求逆元return tmp;
}ll Lucas(ll n,ll m,ll p)
{ll ans=1;while(n&&m&&ans){ans=(ans*Comb(n%p,m%p,p))%p;   //拆分+递归n/=p;m/=p;}return ans;
}int main()
{ll n,m,p;while(cin>>n>>m>>p){ll ans=Lucas(n,m,p);cout<<ans<<endl;}return 0;
}
















~step by step

 

http://www.ppmy.cn/news/644119.html

相关文章

Egret寻路算法Astar

A*算法是很经典的只能启发式搜索算法&#xff0c;那么下面我们具体看看A*算法&#xff01; 我们要想从绿色的点到红色的点&#xff0c;需要启发式得去找一条路径&#xff0c;到底怎么去找呢&#xff0c;开始没有办法&#xff0c;只能从开始点慢慢尝试&#xff01;我们需要定义一…

高斯金字塔和拉普拉斯金字塔

转自https://www.cnblogs.com/sddai/p/10330756.html 1、图像金字塔 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。 图像金字塔最初用于机器视觉和图像压缩&#xff0c;一幅图像的金字…

15. 图像金字塔-高斯金字塔、拉普拉斯金字塔、DOG金字塔

1. 什么是图像金字塔 图像金字塔是图像处理和计算机视觉中常用到的概念&#xff0c;常常用于多尺度处理领域&#xff08;multiscale processing)&#xff0c;尤其早年的图像匹配、识别、图像分割等算法中都用到了图像金字塔。一幅图像的金字塔是一系列以金字塔形状排列的分辨…

Lucas定理推导过程(全网最全,哈哈哈哈)

和大家一起学习Lucas定理,在网上找了好久都没有找到详细的推导过程,这大概就是传说中的的一血了吧 求证 C n m C n / p m / p ∗ C n % p m % p ( m o d ( p ) ) C_n^m C_{n/p}^{m/p} * C_{n\%p}^{m\%p}\quad\quad\quad(mod(p)) Cnm​Cn/pm/p​∗Cn%pm%p​(mod(p)) p为素数…

电脑群控Android手机技术,免费实现电脑端控制多台手机

需要集线器&#xff0c;链接usb链接手机&#xff0c; 软件都是免费的&#xff1a; 两款软件实现 一个是沙盒 一个是airdroid电脑客户端

Scrcpy -用电脑控制 Android 手机-安卓投屏控制软件

https://www.iplaysoft.com/scrcpy.html Scrcpy – 用电脑控制 Android 手机 https://www.appinn.com/scrcpy-remote-android-from-computer/

【安卓】电脑执行脚本控制安卓手机

电脑执行脚本控制安卓手机 一、通过安卓的ADB&#xff08;需要会安卓开发&#xff09; 二、Total Control&#xff08;推荐/简单&#xff09; http://tc.sigma-rt.com.cn/index.php 三、待补充

Windows电脑如何控制安卓手机

大家可能都知道电脑控制电脑&#xff0c;手机控制手机&#xff0c;是否尝试过用电脑控制手机呢&#xff1f; 其实很简单&#xff0c;一款免费的远控软件就能实现&#xff0c;今天就教大家如何用实现Windows电脑控制安卓手机的案例。被控安卓手机需要先领取安卓授权&#xff1a…