扩展中国剩余定理(扩展CRT)详解

今天在$xsy$上翻题翻到了一道扩展$CRT$的题,就顺便重温了下

中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$。

正常的$CRT$有一个微小的要求,就是$\forall i,j (m_i,m_j)=1$。

在某些情况下,这个式子无法被满足,这个时候就要用扩展$CRT$来求解了。

我们先假设我们只有两条方程要被求解,它们分别是:

$\begin{cases} x\equiv c_1 \pmod{m_1}\\x\equiv c_2 \pmod{m_2}\end{cases}$

我们考虑将同余去掉,就变成了:

$\begin{cases} x= c_1+m_1k_1\\x= c_2+m_2k_2\end{cases}$

联立一波,得:

$c_1+m_1k_1=c_2+m_2k_2$

$m_1k_1=(c_2-c_1)+m_2k_2$

若该方程存在解,则有$(m1,m2)|(c_2-c_1)$,否则无解

下面令$d=(m1,m2)$。

我们对等式两边全部除以$d$,得:

$\dfrac{m_1}{d}k=\dfrac{c_2-c_1}{d}+\dfrac{m_2}{d}k_2$

经过简单变式,得:

$\dfrac{m_1}{d}\equiv \dfrac{c_2-c_1}{d} \pmod{\dfrac{m_2}{d}}$

我们将$dfrac{m_1}{d}$移项到等式右侧,得:

$k_1 \equiv inv(\dfrac{m1}{d},\dfrac{m_2}{d})\times \dfrac{c_2-c_1}{d} \pmod{\dfrac{m_2}{d}}$

其中$inv(x,y)$表示模$y意$义下$x$的乘法逆元

重新将该式子变回等式,得:

$k_1 = inv(\dfrac{m1}{d},\dfrac{m_2}{d})\times \dfrac{c_2-c_1}{d} + y\dfrac{m_2}{d}$

该式子已经化简到尽了,考虑重新代入回最初的式子。

将$k_1$代入$x=c_1+m_1k$中,得:

$x\equiv inv(\dfrac{m1}{d},\dfrac{m_2}{d})\times \dfrac{c_2-c_1}{d} +c_1 \pmod{\dfrac{m_1m_2}{d}}$

至此,求两条式子的扩展$CRT$已经讲完了

如果方程有多条怎么办:我们做$n-1$次的两条式子的$CRT$合并就可以了。

原文地址:https://www.cnblogs.com/xiefengze1/p/10350652.html

时间: 2024-10-11 20:58:25

扩展中国剩余定理(扩展CRT)详解的相关文章

中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结

中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前置知识点:\(Exgcd\) 这两个东西都是用来解同余方程组的 形如 \[ \left\{ \begin{aligned} x\equiv B_1(mod\ W_1)\x\equiv B_2(mod\ W_2)\ \cdots\x\equiv B_n(mod\ W_n)\\end{aligned} \rig

欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍

1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. 1 int gcd(int x,int y){ 2 return y==0?x:gcd(y,x%y); 3 } 1 int lcm(int x,int y){ 2 return x*y/gcd(x,y); 3 } 2.扩欧:exgcd:对于a,b,一定存在整数对(x,y)使ax+by=gcd(a,b)=d ,且a,b互质时,d=1. x,y可递归地求得. 我懒得改返回值类型了 1 long long exgcd(long long a,

Acwing-204-表达整数的奇怪方式(扩展中国剩余定理)

链接: https://www.acwing.com/problem/content/206/ 题意: 给定2n个整数a1,a2,-,an和m1,m2,-,mn,求一个最小的非负整数x,满足?i∈[1,n],x≡mi(mod ai). 思路: 扩展中国剩余定理模板题. 代码: #include <bits/stdc++.h> using namespace std; typedef long long LL; LL R[50], M[50]; int n; LL ExGcd(LL a, LL

扩展欧几里得(ex_gcd),中国剩余定理(CRT)讲解 有代码

扩展欧几里得算法 求逆元就不说了. ax+by=c 这个怎么求,很好推. 设d=gcd(a,b) 满足d|c方程有解,否则无解. 扩展欧几里得求出来的解是 x是 ax+by=gcd(a,b)的解. 对于c的话只需要x*c/gcd(a,b)%(b/d)即可,因为b/d的剩余系更小. 为什么这样呢? 设a'=a/d,b'=b/d 求出a'x+b'y=1的解,两边同时乘d,然后x也是ax+by=d的解, 然后因为b'的剩余系更小,所以%b’ 中国剩余定理是合并线性方程组的 中国余数定理 转化为一个线性

LUOGU P4777 【模板】扩展中国剩余定理(EXCRT)

传送门 解题思路 扩展 $crt?$,就是中国剩余定理在模数不互质的情况下,首先对于方程 ?     $\begin{cases} x\equiv a_1\mod m_1\\x\equiv a_2\mod m_2\end{cases}$ 来说,可以将其写为: $\begin{cases} x=k_1*m_1+a_1\\x=k_2*m_2+a_2\end{cases}$ 然后联立方程: ?     $k_1*m_1+a_1=k_2*m_2+a_2$ $\Leftrightarrow -k_1*m_

Strange Way to Express Integers POJ 2891(中国剩余定理扩展)

原题 题目链接 题目分析 题意很明确,这里的模数是不互质的,因此不能直接套中国剩余定理.这里稍微讲一下中国剩余定理的扩展,假设前i个方程的特解为ans(i),通解为x(i)=ans(i)+k*lcm(前i个模数).把x(i)代入到第i+1个方程,用扩展欧几里得定理求解k=k0,ans(i+1)=ans(i)+k0*lcm(前i个模数),则x(i+1)=ans(i+1)+lcm(前i+1个模数).大概思路就是这样,但有些细节需要注意一下,求出来的k0,ans(i+1)需要用求模的方法缩小一下. 代

(light oj 1319) Monkey Tradition 中国剩余定理(CRT)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1319 In 'MonkeyLand', there is a traditional game called "Bamboo Climbing". The rules of the game are as follows: 1) There are N monkeys who play this game and there are N bamboos of equal h

51 Nod 1352 集合计数(中国剩余定理+扩展欧几里得)

题目链接:点我点我 题意:中文题 题解:由题意我们可以构造出方程:Ax+By=N+1,用扩展欧几里得算出最小的非负整数解x(x确定,y也就确定了),然后再把剩余的数分配掉(以它们的最小公倍数去分). 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 typedef long long LL; 7 8 LL e_gcd(LL a,LL b,

谷歌浏览器扩展程序manifest.json参数详解

1 { 2 // Required 3 "manifest_version": 2, // manifest编写规范版本,目前主流2 4 "name": "My Extension", // 插件名 5 "version": "versionString", // 版本号 6 7 // Recommended 8 "default_locale": "en", //