中国剩余定理

中国剩余定理

问题引入#

求出一个数,使得这个数除 32, 除 53, 除 72

问题求解#

下面我们依照中国剩余定理的算法流程对这个问题进行求解,并且逐步解释其原理

对于这个问题,我们有一个比较简单的方法是:先找出每一个方程的解,再通过加其模数使之与其他方程的解的值相等

然而这样的想法是很难进行求解的,我们引入如下两个性质:

性质一(a+b)modp=amodp+bmodp

性质二(ab)modp=(amodp)b

性质一告诉我们:如果有一个数除 53,还有任意两个数被 5 整除,则这三个数的和满足除 53

那么,我们构造出三个数 a,b,c 分别满足这三个方程,并且能被其它两个数整除,那么a+b+c就是这个方程组的一个解

因此,这个问题被我们转化成了一个简单的问题:求一个 x,使得xmod3=0,xmod7=0 并且 xmod5=3

显然,x会是 37=21 的倍数,那我们直接考虑 (k21)mod5=3 就行了。由性质二可以得知,我们只需将 21mod5 扩大 (5×d)/(21mod5) 倍就行了,这个值就是 k 的值

上面这个问题(以本体为例)相等于求解一个 x 使得 1x=3(mod5) 这个问题可以通过拓展欧几里得算法求解

以本题为例,我们写出计算过程。

  1. 求出最小公倍数lcm=357=105
  2. 求出个数对应基础数
    对于第一个条件, 我们有105/3=3535mod3=2 满足,则基础数为 35
    对于第二个条件, 我们有105/5=2121mod5=1 不满足,将这个式子乘 3,使得 63mod5=3 则基础数为 63
    对于第三个条件, 我们有105/7=1515mod7=1 不满足,与上一个步骤相同,乘 2 得到基础数为 30
    把基础数相加: 35+63+30=128
  3. 减去最小公倍数(在比最小公倍数大的情况下)
    得到x=128105=23

数学模型#

m1,m2,,mn 是两两互质的整数,m=i=1nmi,Mi=m/miti 是线性同余方程 Miti=1(modm)i 的一个解,对于任意的 n 个数 a1,a2,,an, 方程组 x=ai(modm)i有整数解,解为 x=i=1naiMiti

证明#

因为 Mi=m/mi 是除 mi 意外所有数的倍数,所以 ki,aiMiti=0(modm)k, 又因为 aiMiti=ai(modm)i 所以带入 x, 原方程成立

代码#

Copy
ll exgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { y = 0, x = 1; return a; } int d = exgcd(b, a%b, y, x); return y = y - x * (a / b), d; } ll base[maxn], ans[maxn]; ll M = 1; inline void CRT() { for (int i = 1; i <= n; ++ i) base[i] = M / a[i]; ll y; for (int i = 1; i <= n; ++ i) { exgcd(base[i], a[i], ans[i], y); (res += ans[i] * b[i] * base[i]) %= M; } printf("%lld", (res + M) % M); }
posted @   AlessandroChen  阅读(782)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
CONTENTS