卢卡斯定理小记

本文详细介绍了卢卡斯定理及其扩展形式,通过二项式定理和费马小定理证明了卢卡斯定理,并给出了具体的实现代码。此外,还探讨了当模数不是质数时如何求组合数的模,使用中国剩余定理进行求解。

卢卡斯定理:

(nm)≡(n%pn%p)(⌊np⌋⌊mp⌋)(mod  p))\boxed{\dbinom n m\equiv \dbinom{n\%p}{n\%p} \dbinom{\lfloor \dfrac n p\rfloor }{\lfloor \dfrac m p\rfloor }(\mod p))}(mn)(n%pn%p)(pmpn)(modp))

证明:二项式定理+费马小定理.

{1+xp≡1+x(1+x)p≡1+x→(1+x)p≡1+xp(mod  p)→(1+x)n≡(1+x)⌊np⌋p(1+xp)n%p≡(1+xp)⌊np⌋(1+xn%p)(mod  p)\begin{cases} 1+x^p\equiv 1+x\\(1+x)^p \equiv 1+x\end{cases} \rightarrow (1+x)^p \equiv 1+x^p(\mod p)\rightarrow (1+x)^n\equiv(1+x)^{\lfloor \dfrac n p \rfloor p}(1 +x^p)^{n\%p}\equiv (1+x^p)^{\lfloor \dfrac n p \rfloor }(1+x^{n\%p})(\mod p){1+xp1+x(1+x)p1+x(1+x)p1+xp(modp)(1+x)n(1+x)pnp(1+xp)n%p(1+xp)pn(1+xn%p)(modp).(费马小定理)

然后我们带入二项式定理,考究系数的关系.

为了方便,以后的下去整忽略不写.

∑i=0nCnixi≡∑i=0n/pCn/piCnixip∗∑j=0n%pCn%pjxj(mod  p)\sum_{i=0}^n C_n^i x^i\equiv \sum_{i=0}^{ n/p} C_{n/p}^i C_n^i x^{ip} *\sum_{j=0}^{n\% p} C_{n\% p}^j x^j(\mod p)i=0nCnixii=0n/pCn/piCnixipj=0n%pCn%pjxj(modp)

∀i∈[0,n]∩N,i=sp+t(p,t∈N),Cnixi≡Cn/psxspCn%ptxt\forall i\in [0,n]\cap \N,i=sp+t(p,t\in \N),C_n^ix^i\equiv C_{n/p}^s x^{sp}C_{n\%p}^tx^ti[0,n]N,i=sp+t(p,tN),CnixiCn/psxspCn%ptxt

消去xxx,则可得到卢卡斯定理.

实现:递归处理.复杂度:O(log⁡pn)O(\log_p n)O(logpn).(不计预处理阶乘的时间)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll jc[N],jc_inv[N],ans;
ll power_mod(ll a,ll b,ll c)
{
	ll ans=1%c;a%=c;
	while(b>0)
	{
		if(b&1)ans=ans*a%c;
		a=a*a%c;b=b>>1;
	}
	return ans;
}
int t,p,n,m;
void dfs(int a,int b)
{
	if(!b)return;
	dfs(a/p,b/p);
	ans=ans*(jc[a%p]*jc_inv[a%p-b%p]*jc_inv[b%p]%p)%p;
}
int main()
{
	scanf("%d",&t);
	jc[0]=jc_inv[0]=1;
	while(t--)
	{
		scanf("%d%d%d",&n,&m,&p);
		ans=1;
		for(int i=1;i<=p;i++)
		{
			jc[i]=jc[i-1]*i%p;
			jc_inv[i]=power_mod(jc[i],p-2,p);
		}
		dfs(n+m,m);
		printf("%lld\n",ans);
	}
	return 0;
}

拓展卢卡斯:

已知n,m,pn,m,pn,m,p,求(nm)mod  p\boxed{\dbinom n m \mod p}(mn)modp(其中ppp不为质数)

推导:设p=∏pikip=\prod p_i^{k_i}p=piki,则我们只要求解所有(nm)mod  piki\dbinom n m \mod p_i^{k_i}(mn)modpiki,最后用中国剩余定理合并即可.

此时我们就求n!m!(n−m)!mod  pk\dfrac {n!}{m!(n-m)!}\mod p^km!(nm)!n!modpk(为了方便这里的p是质数,与上面的意义不同).

由于不一定有逆元,所以我们可以先把ppp的倍数约去,即n!pxm!py(n−m)!pz∗px−y−zmod  pk\dfrac {\dfrac {n!}{p^x}}{\dfrac{m!}{p^y} \dfrac {(n-m)!} {p^z} }*p^{x-y-z}\mod p^kpym!pz(nm)!pxn!pxyzmodpk.

定义F(x)F(x)F(x)表示x!x!x!除去ppp的因子后mod  pk\mod p^kmodpk的结果.则有:

F(x)=pn/pF(n/p)∏i=1n/pk∗pki(imod  p≠0)∏i=n/pk∗pk+1ni(imod  p≠0)F(x)=p^{n/p}F(n/p) \prod_{i=1}^{n/p^k*p^k} i(i\mod p\ne 0)\prod_{i=n/p^k*p^k+1}^n i(i\mod p\ne 0)F(x)=pn/pF(n/p)i=1n/pkpki(imodp=0)i=n/pkpk+1ni(imodp=0).

PS:前面部分表示含ppp的因子的情况.

中间部分有周期性,我们可以减小枚举范围.

而且ppp要消去,所以可以忽略.

所以F(x)=F(n/p)∗(∏i=1pki(imod  p≠0))n/pk∗∏i=1n−n/pk∗pki(imod  p≠0)F(x)=F(n/p)*(\prod_{i=1}^{p^k} i(i\mod p\ne 0))^{n/p^k}*\prod_{i=1}^{n-n/p^k*p^k} i(i\mod p\ne 0)F(x)=F(n/p)(i=1pki(imodp=0))n/pki=1nn/pkpki(imodp=0)

递归处理即可.递归层数log⁡pn\log_p nlogpn,单层扫描pkp^kpk.

总复杂度:O(log⁡pnpk)O(\log_p^n p^k)O(logpnpk).

之后我们定义G(x)G(x)G(x)表示xxx中含有多少个ppp个因子,复杂度:O(log⁡pn)O(\log_p n)O(logpn).

单次求解Cnmmod  pikiC_n^m \mod p_i^{k_i}Cnmmodpiki的复杂度:O(pklog⁡pn)O(p^k \log_p^n)O(pklogpn).

合并复杂度:O(log⁡pkT),TO(\log p^k T),TO(logpkT),T为质因子个数.

总复杂度可以认为是:O(plog⁡p)O(p\log p)O(plogp).

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=66;
typedef long long ll;

ll power(ll a,ll b,ll mod) {
	ll c=1;
	while(b&&c) {
		if(b&1) c=c*a%mod;
		b /= 2; a=a*a%mod;
	}
	return c;
}

void exgcd(ll a,ll b,ll &x,ll &y) {
	if(!a) {x=0; y=1; return ;}
	exgcd(b%a,a,y,x); x-=b/a*y;
}

ll inv(ll a,ll p) {
	ll x,y; exgcd(a,p,x,y);
	return (x%p+p)%p;
}

ll F(ll n,ll p,ll pk) {
	if(!n) return 1;
	ll s=1;
	for(int i=1;i<pk;i++)
		if(i%p) s=s*i%pk;
	s=power(s,n/pk,pk);
	for(int i=n%pk; i;i--)
		if(i%p) s=s*i%pk;
	return F(n/p,p,pk)*s%pk;
}

ll G(ll n,ll p) {
	ll s=0;
	while(n) s+=(n/=p);
	return s;
}

ll C(ll n,ll m,ll p,ll pk) {
	ll a=F(n,p,pk),b=inv(F(m,p,pk),pk),c=inv(F(n-m,p,pk),pk),d=power(p,G(n,p)-G(m,p)-G(n-m,p),pk);
	return a*b%pk*c%pk*d%pk;
}

ll A[N],B[N];
ll lucas(ll n,ll m,ll p) {
	int cnt=0;ll x=p;
	for(int i=2;i*i<=x;i++) if(x%i==0) {
		ll y=1;
		while(x%i==0) y*=i,x/=i;
		A[++cnt]=y; B[cnt]=C(n,m,i,y);
	}
	if(x>1) A[++cnt]=x,B[cnt]=C(n,m,x,x);
	ll ans=0;
	for(int i=1;i<=cnt;i++) 
		(ans += B[i]*(p/A[i])%p*inv(p/A[i],A[i])%p) %= p;
	return ans;
}

int main() {
	ll n,m,p; scanf("%lld%lld%lld",&n,&m,&p);
	printf("%lld\n",lucas(n,m,p)); return 0;
}

内容概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过与传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内容涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计与实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子与电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面测试系统的动态与稳态性能,从而深刻理解最优滑模控制的核心机理与工程应用价值。
内容概要:本文提出了一种基于数据驱动的Koopman算子与递归神经网络(RNN)相结合的模型线性化方法,旨在解决纳米定位系统中因强非线性、迟滞和蠕变效应导致的建模困难问题。该方法通过Koopman算子将非线性动态系统映射至高维线性空间,利用RNN学习系统的时间序列演化特征,从而实现对复杂动态行为的精确建模与预测,并进一步集成于模型预测控制(MPC)框架中,显著提升了纳米定位系统的控制精度、动态响应能力与运行稳定性。整个算法体系在Matlab平台上完成代码实现与仿真实验验证,展示了良好的控制性能与工程应用潜力。; 适合人群:具备控制理论、非线性系统建模、机器学习及智能控制基础,从事精密仪器控制、高端制造装备研发、自动化系统设计等领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应对扫描探针显微镜、光刻机、超精密加工平台等纳米级定位设备中的非线性建模挑战;②提升高精度运动系统的实时预测控制性能,抑制迟滞与蠕变带来的定位误差;③为数据驱动的非线性系统线性化与先进控制策略(如MPC)的融合提供可复现、可扩展的技术范例。; 阅读建议:建议读者结合提供的Matlab代码,深入理解Koopman观测矩阵构造、RNN网络训练流程及MPC控制器设计之间的协同机制,重点关注数据预处理、特征提取、模型训练与闭环控制仿真的完整链路,以便在相似高精度控制系统中进行迁移与优化应用。
内容概要:本文围绕“主辅助服务市场出清模型研究【旋转备用】”展开,基于Matlab代码实现了电力系统中旋转备用辅助服务的市场出清机制建模与求解,属于SCI论文复现类科研仿真资源。研究聚焦于旋转备用资源的优化调度与定价逻辑,通过Matlab编程构建数学模型并进行数值求解,深入揭示电力市场中辅助服务的运行机理。该资源作为一系列电力系统、微电网优化、储能调度、路径规划等Matlab/Simulink仿真资料的重要组成部分,提供了可复用的代码框架与模型参考,有助于推动相关领域的科研进展和技术验证。; 适合人群:面向具备电力系统、自动化、能源优化等相关学科背景,熟悉Matlab编程环境,从事电力市场、可再生能源集成、智能电网等方向科研或工程仿真的研究生、高校教师、科研人员及电力行业工程师。; 使用场景及目标:① 学习并复现电力系统辅助服务市场中旋转备用的出清模型,掌握其优化建模方法;② 应用Matlab工具开展微电网、储能系统、电力市场出清等问题的建模与仿真研究;③ 借助提供的完整代码资源加速科研项目推进,提升论文复现效率与学术成果产出能力。; 阅读建议:建议结合电力市场基本理论与优化算法知识进行学习,重点关注模型构建的数学逻辑、约束条件设定及Matlab代码实现细节,同时可参考文中列出的其他相关仿真资源进行横向拓展研究,充分利用所附网盘资料开展实践验证与对比分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Infinite_Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值