中国剩余定理
中国剩余定理
前置知识
逆元(扩展欧几里得算法,费马小定理),模意义下的四则运算
介绍
中国剩余定理主要用于解决这样的线性同余方程组,其中 两两互质
对于这样的方程组我们只需要求出 的一组特解,把这个特解加上 的最小公倍数的任意整数倍就可以得到所有解,所以我们就只需要考虑怎么构造出一组特解
例子
下面举个例子来帮助理解
直接构造不太行,但是对于每一个线性同余方程构造出一个特解是非常轻松的,所以我们先设第 个式子的解是 ,那么有
最终的 一定是 以各种方式组合起来,那么问题就是怎么组合才能得到 ,如果 之间相乘就把问题变得更复杂了,所以我们把它们加起来,想办法凑出
如果 ,那么每一个 需要满足什么条件呢?
因为 ,所以 一定是 的倍数,当 分别都是 的倍数时这一定也是满足条件的一个特解
所以我们不妨假设 都是 的倍数
同理 都是 的倍数, 都是 的倍数
那我们就可以把 写成 ,把 写成 ,把 写成
原方程就变成了这样
然后就非常好求了,只需要求出
也就是 分别对于 的乘法逆元,然后在等式两边同时分别乘以 就可以得到 的一组特解
用扩展欧几里得算法求出 ,所以
于是
最后就得到 ,由于 的最小公倍数是 ,我们将 对于 取模就能得到 的最小正整数解
的通解就能表示为
数学语言
上面的例子比较好理解,下面用更严谨的数学语言再来描述一遍,没兴趣可以直接跳过
直接构造不太行,但是对于每一个线性同余方程构造出一个特解是非常轻松的,所以我们先设第 个式子的解是 ,那么有
最终的 一定是 以各种方式组合起来,如果 之间相乘就把问题变得更复杂了,所以我们把它们加起来以凑出
如果 ,那么考虑每一个 需要满足的条件
由于 且 ,所以
因为只要构造一组特解所以我们不妨假设 ,也就是
用人话说就是 在加上所有其他 之后对于 取模的结果仍然不变,所以其他所有 的和一定是 的倍数,因为只要构造一组特解所以我们不妨假设其他每一个 都是 的倍数
不妨令 设
原方程组就转换为了
假设 在模 意义下的乘法逆元为 ,那么根据乘法逆元的定义 ,两边同时乘以 就有 ,所以 一定是 的一个特解
那么对于 , 一定有一个特解为 在模 意义下的乘法逆元的 倍
可以直接算出来,然后利用扩展欧几里得算法( 为质数时也可以使用费马小定理)求出 ,乘上 就能得到 ,再将 乘上 就能得到 ,全部加起来就可以算出 的一个特解了,只需要模 的最小公倍数就可以得到最小正解
C++ Code
#include<bits/stdc++.h>
#define in read()
using namespace std;
typedef long long ll;
inline int read()
{
char c=getchar();
int x=0;
while(c<48)c=getchar();
while(c>47)x=(x*10)+(c^48),c=getchar();
return x;
}
inline void mwrite(ll a)
{
if(a>9)mwrite(a/10);
putchar((a%10)|48);
}
inline void write(ll a,char c)
{
mwrite(a);
putchar(c);
}
//上面是IO优化
const int MAXN=15;
int n,c[MAXN],d[MAXN];
inline void exgcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得
{
if(!b) return x=1,y=0,void(0);
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
inline ll inv(ll x,ll p)//求逆元
{
ll X,Y;
exgcd(x,p,X,Y);
return (X%p+p)%p;
}
inline ll crt()//CRT
{
ll prod=1,ans=0;
for(int i=1;i<=n;++i) prod*=d[i];
ll tmp;
for(int i=1;i<=n;++i)
{
tmp=prod/d[i];
ans+=(inv(tmp,d[i])*c[i]*tmp)%prod;
}
return ans%prod;
}
signed main()
{
n=in;
for(int i=1;i<=n;++i) d[i]=in,c[i]=in;
write(crt(),'\n');
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】