数学基础III 扩展中国剩余定理 扩展Lucas定理 扩展BSGS 原根 指标

本文介绍了扩展中国剩余定理、扩展Lucas定理及扩展BSGS算法等,详细讲解了如何解决模数不互质情况下的同余方程组、模数为任意正整数的组合数计算以及指数型同余方程的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扩展中国剩余定理

一般的中国剩余定理只能解决模数互质的情况。扩展中国剩余定理可以解决模数不互质的情况。
考虑依次将nnn个方程合并起来。设前面合并起来的方程是x=muku+aux=m_uk_u+a_ux=muku+au,当前枚举到的方程是x=mvkv+avx=m_vk_v+a_vx=mvkv+av,则联立得到(xxx的符号可忽略)muku+mvkv=au−avm_uk_u+m_vk_v=a_u-a_vmuku+mvkv=auav
使用扩展欧几里得,求出最小正整数解ku′k_u'kukv′k_v'kv。那么我们合并得到的方程就是x=lcm(mu,mv)k+muku′+aux=\rm lcm(m_u,m_v)k+m_uk_u'+a_ux=lcm(mu,mv)k+muku+au
这样合并到最后就能得到答案。

long long cm = m[0], ca =a[0];
for(int i = 1; i < n; i++) {
	long long d, x, y, dela = (a[i]-ca%m[i]+m[i])%m[i];
	exgcd(cm, m[i], d, x, y);
	if(dela % d) {
		printf("You've got no electricity, I come to your house!\n");
		return 0;
	}
	long long sol = qmul(x, dela/d, m[i]/d);
	ca += sol * cm;
	cm *= m[i] / d;
	ca = (ca%cm+cm)%cm;
}
return ca;
//2019.3.14 // mod = 苯酚醛

20180929UPD:由m1k1=a2−a1+m2k2m_1k_1=a_2-a_1+m_2k_2m1k1=a2a1+m2k2
两边同时除以gcd⁡(m1,m2)\gcd(m_1,m_2)gcd(m1,m2),令其为GGG(注意判断是否a2−a1∣Ga_2-a_1|Ga2a1G,不成立则方程无解)。令A=a2−a1GA=\frac{a_2-a_1}{G}A=Ga2a1
m1Gk1=A+m2Gk2\frac{m_1}{G}k_1=A+\frac{m_2}{G}k_2Gm1k1=A+Gm2k2
m1Gk1=A(modm2G)\frac{m_1}{G}k_1=A \pmod{\frac{m_2}{G}}Gm1k1=A(modGm2)
k1=A⋅inv(m1G,m2G)(modm2G)k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})\pmod{\frac{m_2}{G}}k1=Ainv(Gm1,Gm2)(modGm2)
k1=A⋅inv(m1G,m2G)+m2G⋅k′k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})+\frac{m_2}{G}\cdot k&#x27;k1=Ainv(Gm1,Gm2)+Gm2k
最后将k1k_1k1代为x−a1m1\frac{x-a_1}{m_1}m1xa1
x=A⋅inv(m1G,m2G)⋅m1+a1(modm1m2G)x=A\cdot inv(\frac{m_1}{G},\frac{m_2}{G})\cdot m_1+a_1 \pmod{\frac{m_1m_2}{G}}x=Ainv(Gm1,Gm2)m1+a1(modGm1m2)
这就是合并后的方程。

扩展Lucas定理

Lucas定理只能解决模数是质数的情况。事实上很多扩展定理都是将质数推广到非质数而来的。扩展Lucas定理可以解决模数为任意正整数的问题,复杂度为O(pt)O(p^t)O(pt),其中ptp^tpt是模数分解为的质因数的幂。

首先学习求n!mod&ThinSpace;&ThinSpace;ptn!\mod p^tn!modpt。将乘数中将ppp的倍数提出来,除以倍数后依然是阶乘形式,因此这一部分可以递归计算。而其它部分按值域每(p−1)pt−1(p-1)p^{t-1}(p1)pt1分为一组,它们对mod&ThinSpace;&ThinSpace;pt\mod p^tmodpt是同余的,因此计算一组即可,复杂度O(pt)O(p^t)O(pt)
举例说明,模数为32时,3^2时,3225!≡38×8!×(1×2×4×5×7×8)3×2525!\equiv3^8\times 8!\times (1\times2\times4\times5\times7\times8)^3\times 2525!38×8!×(1×2×4×5×7×8)3×25
然后就可以计算Cnmmod&ThinSpace;&ThinSpace;ptC_n^m\mod p^tCnmmodpt了。
回到原问题,我们将模数质因数分解为∏piti\prod p_i^{t_i}piti,设答案为ansansans,则我们得到若干个同余方程ans≡Cnm(mod&ThinSpace;&ThinSpace;piti)ans\equiv C_n^m(\mod p_i^{t_i})ansCnm(modpiti)。使用上述方法算出系数,然后中国剩余定理合并即可。

扩展BSGS

ax≡b(mod&ThinSpace;&ThinSpace;m)a^x\equiv b(\mod m)axb(modm)mmm为任意正整数。
因为要求a−1mod&ThinSpace;&ThinSpace;ma^{-1}\mod ma1modm,所以在gcd⁡(a,m)=1\gcd(a,m)=1gcd(a,m)=1时才能用BSGS解。考虑转化成这个形式。
原方程化为ax−1agcd⁡(a,m)≡bgcd⁡(a,m)(mod&ThinSpace;&ThinSpace;mgcd⁡(a,m))a^{x-1}\frac{a}{\gcd(a,m)}\equiv \frac{b}{\gcd(a,m)}(\mod \frac{m}{\gcd(a,m)})ax1gcd(a,m)agcd(a,m)b(modgcd(a,m)m)。将agcd⁡(a,m)\frac{a}{\gcd(a,m)}gcd(a,m)a等看作系数,递归计算直到gcd⁡(a,m)=1\gcd(a,m)=1gcd(a,m)=1。然后反带回去即可。答案=x+递归次数=x+递归次数=x+

upd on 2019.1.13
d=gcd⁡(a,p)d=\gcd(a,p)d=gcd(a,p),则当d∣pd|pdp时有解。每次ppp会除以一个数,因此最多递归O(log⁡p)O(\log p)O(logp)次。每次aaa的次数会减少111,因此最后求出的是x−递归次数x-递归次数x。注意答案有可能小于递归次数,因此还要枚举小于等于递归次数的答案判断是否合法。

原根 指标

在模ppp意义下的原根ggg有以下性质:
原根个数=φ(φ(p))=\varphi(\varphi(p))=φ(φ(p))
gi≡gj(mod&ThinSpace;&ThinSpace;p)⇔i≡j(mod&ThinSpace;&ThinSpace;φ(p))g^i\equiv g^j(\mod p)\Leftrightarrow i\equiv j(\mod\varphi(p))gigj(modp)ij(modφ(p))
指标的定义:gind(x)≡xg^{ind(x)}\equiv xgind(x)x
由此,xk(mod&ThinSpace;&ThinSpace;p)x^k(\mod p)xk(modp)可转化为ind(x)⋅k(mod&ThinSpace;&ThinSpace;φ(p))ind(x)\cdot k(\mod\varphi(p))ind(x)k(modφ(p))
求指标用BSGS,将指标还原用快速幂。

原根的求法

设模数为ppp,将φ(p)\varphi(p)φ(p)分解为∏Piti\prod P_i^{t_i}Piti。从222开始枚举ggg,如果有gφ(p)Pi≡1(mod&ThinSpace;&ThinSpace;p)g^{\frac{\varphi(p)}{P_i}}\equiv1(\mod p)gPiφ(p)1(modp)满足则不是原根,否则找到一个原根。
如果广义黎曼猜想成立,ggg取到log⁡log⁡log⁡log⁡log⁡log⁡n\log\log\log\log\log\log nloglogloglogloglogn规模时即可找到一个原根。由一个数的质因数个数是log⁡nlog⁡log⁡n\frac{\log n}{\log \log n}loglognlogn,总复杂度为log⁡n×log⁡log⁡log⁡log⁡log⁡log⁡nlog⁡log⁡n\frac{\log n\times\log\log\log\log\log\log n}{\log \log n}loglognlogn×loglogloglogloglogn,该算法的瓶颈在于分解质因数。

二次剩余

本季度内
from **999
已隐藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值