首页 > 其他分享 >[数论]中国剩余定理CRT

[数论]中国剩余定理CRT

时间:2023-06-17 09:11:17浏览次数:48  
标签:return CRT 数论 定理 mi int bmod ll mod

Chinese Remainder Theorem

\(x≡ai(mod mi)\)
中国剩余定理CRT

1.定义

Th.
给出一元线性同余线性方程组
\(x ≡ a1 \bmod m1\)
\(x ≡ a2 \bmod m2\)
...
\(x ≡ an \bmod mn\)
定理指出假设素数\(m1,m2...mn\)两两互素,对任意的整数\(a1,a2...an\)
上述方程有解,并且可以通过如下步骤构造通解:
1>计算\(M=\prod_{i = 1}^{n}mi,Mi = \dfrac{M}{mi}\)(即,Mi是除\(mi\)之外的其他整数的乘积)
2>计算\(ti\)为\(Mi\)模\(mi\)的逆,对于\(i=1,2,..,n,\)计算满足\(tiMi≡1(\bmod mi)\)的\(ti\)
3>上述方程的通解为:
\(x=a1t1M1+a2t2M2+...+antnMn+kM,k∈Z\)
在模\(M\)的意义下,方程组只有一个解\(x=a1t1M1+a2t2M2+...+antnMn\)

2.写法

1.互质的写法(useless)

\(eg.\)
\(x \bmod 3 = 2\)
\(x \bmod 5 = 3\)
\(x \bmod 7 = 4\)

\(x1 \bmod 3 = 1\)
\(x1 \bmod 5 = 0 ————>x1=70\)
\(x1 \bmod 7 = 0\)

\(x2 \bmod 3 = 0\)
\(x2 \bmod 5 = 1 ————>x2=21\)
\(x2 \bmod 7 = 0\)

\(x3 \bmod 3 = 0\)
\(x3 \bmod 5 = 0 ————>x3=15\)
\(x3 \bmod 7 = 1\)

\(x = 2*70+3*21+4*15 = 263\)
2(1,0,0) 3(0,1,0) 4*(0,0,1)
(2,0,0) (0,3,0) (0,0,4)
(2,3,4)
\(x\)%\(105 = 53\)

总结:
对于\(n\)个
\(x \bmod mi = ai\)

我们先去解\(n\)个
\(xi \bmod mi = 1\)
$xi \bmod mj = 0(其他i≠j) $

\(xi \bmod (m1*m2..mi-1*mi+1...mn) = 0\)
即 \(xi \bmod (\frac{M}{mi}) = 0\)
$ xi \bmod mi = 1\( 设\)xi = (\frac{M}{mi})t\( 则有\)(\frac{M}{mi})t \bmod mi = 1$

比如上述例子$ 3 5 7$
\(35t1 ≡ 1(\bmod 3)\)
\(t1 = 2\)
\(∴x1 = 70\)

\(21t2 ≡ 1(\bmod 5)\)
\(t2 = 1\)
\(x2 = 21\)

\(15t3 ≡ 1(\bmod 7)\)
\(t3 =1\)
\(x3 = 15\)

即\(Mi*ti ≡ 1(\bmod mi)\)
\(xi = Miti\)
$ x = Σai*xi$

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 5e5 + 7;
int n, a[N], m[N];
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if(b == 0){
        x = 1; y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, x, y);
    ll z = x;x = y;y = z - (a / b) * x;
    return d;
}
int main()
{
   int t;
   cin>>t;
   while(t--)
   {
	   	ll M = 1;
	    scanf("%d", &n);
	    for(int i = 1; i <= n; ++ i) 
	    {
	        scanf("%d%d", &a[i], &m[i]);
	        M *= m[i];
	    }
	    ll res = 0;
	    for(int i = 1; i <= n; ++ i) 
	    {
	        ll Mi = M / m[i];
	        ll ti, y;
	        //exgcd求逆元:解同余方程:ax + my = 1;(ax ≡ 1 mod m)
	        ll d = exgcd(Mi, m[i], ti, y);
	        ti = (ti % m[i] + m[i]) % m[i];
	        res += a[i] * ti * Mi;
	    }
	    printf("%lld\n", (res % M + M) % M);//可能为负数,所以需要处理一下
   }
    return 0;
}

2.对于不互质的情况(增量法)

一开始有两个方程\(x≡a(\bmod b),x ≡ c(\bmod d)\)
设\(x = bt+a;\)
那么有\(bt+a≡c(\bmod d),\)
\(bt ≡ c-a(\bmod d)\)
要有解\(,c-a\)要被\(g=\gcd(b,d)\)整除
\(b't≡(c-a)'(\bmod \dfrac{d}{(b,d)})\)
\(t ≡ (c-a)'*(b'^-1)(mod \dfrac{d}{(b,d)})\)
设\(t0 = (c-a)'*(b'^{-1})\)
转化为线性同余方程,
然后解出\(t ≡ t0(\bmod \dfrac{d}{(d,b)})\)
$ t ≡ t0(\bmod \dfrac{d}{g})\( 再t代回去,\)x ≡ bt0+a(\bmod \dfrac{bd}{g})\( 得出\)x ≡ x0(\bmod[b,d])\( 然后下一条方程, 可以解决模数不互质的情况 即在不互质的情况下,要么无解,要么在\)\bmod([b,d])$的意义下有唯一解

\(eg\).
\(x ≡ 2(mod 3)①\)
\(x ≡ 3(mod 5)②\)
\(x ≡ 4(mod 7)③\)

先连立前两个方程\(x ≡ 8(\bmod 15)④\)
在联立\(③④得x≡53(\bmod 105)\)

\(eg2.\)

\(x ≡ 3(\bmod 4)①\)
\(x ≡ 5(\bmod 6)②\)
\(x ≡ 5(mod 9)③\)

\(x = 4t+3\)代入\(②得:4t+3 ≡ 5(\bmod 6)\)
\(4t ≡ 2(\bmod 6)\)
$ 2t ≡ 1(\bmod 3)\( \) t ≡ 2(\bmod 3)\( 再将\)t\(带回去\)x ≡ 11(\bmod 12)④\( 在联立③④: 令\)x = 12t+11$代入③得:\(12t+11≡5(\bmod 9)\)
\(12t ≡ 3(\bmod 9)\)
\(4t ≡ 1(\bmod 3)\)
\(t ≡ 1(\bmod 3)\)
再将\(t\)带回去\(x ≡ 23(\bmod 36)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0)
	{
		x = 1,y = 0;
		return a;
	}
	ll d = exgcd(b,a%b,y,x);
	y -= (a/b)*x;
	return d;
}

void merge(ll &a,ll&b,ll c,ll d)
{
	if(a==-1&&b==-1)return;
	//bt = c-a(mod d)
	ll x,y;
	ll g = exgcd(b,d,x,y);
	//x = b^(-1)
	if((c-a)%g!=0)
	{
		a = b = -1;
		return;
	}
	d/=g;//d'
	ll t0 = ((c-a)/g)%d*x%d;
	if(t0<0)t0+=d;
	a = b*t0+a;
	b = b*d;
}

void solve()
{
	cin>>n;
	ll a = 0,b = 1;//x ≡ a(mod b)
	for(int i = 1;i<=n;i++)
	{
		int c,d;
		cin>>c>>d;
		merge(a,b,c,d);
	}
	cout<<a<<endl;
}


int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

例题:中国剩余定理2

一共\(T\)组数据,每组数据,给定\(n\)个方程,
\(x≡ai(\bmod mi)\)。判断方程是不是有解。

x mod 合数 = a ==>等价于模数是素数幂的方程,再去判断有没有解,我们还是用中国剩余定理
\(eg.x \bmod 10 = 1 <==> x \bmod 2 = 1(*)且x \bmod 5 = 1\)

\(eg.x \bmod 12 = 3 <==> x \bmod 4 = 3(*)且x \bmod 3 = 0\)

模数按照素数的幂次分类,比如(*)式看成一类,我们只需要看其中指数最高的那个方程,但我们还是要判前面满不满足的,比如我们既有一个方程\(x \mod 4 = 3\)又有个方程\(x \mod 4 = 2\)这样也是不行的

转化:
合数取模
|
CRT

素数幂取模

即:

\(x \bmod mi = ai\)
|
CRT

\(x \bmod p^{ei} = ?\) 然后对于每个素数幂的我们都check一下是否都是满足的
|
CRT

若满足,则有解

总结:对合数取模 <=CRT 是桥梁=> 对素数幂取模

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool solve()
{
	int n;
	cin>>n;
	map<int,vector<pair<int,int>>>eqns;

	for(int i = 1;i<=n;i++)
	{
		int a,m;
		cin>>a>>m;
		for(int j = 2;j*j<=m;j++)//分解为素数幂
		{
			if(m%j==0)
			{
				int p = j,pe = 1;
				while(m%j==0)
					m/=j,pe*=j;
				eqns[p].push_back({pe,a%pe});	
			}
		}
		if(m>1)eqns[m].push_back({m,a%m});
	}
	for(auto eq:eqns)
	{
		auto eqn = eq.second;
		int v = max_element(eqn.begin(),eqn.end())->second;//最后的余数由指数最大的所决定
		for(auto p:eqn)
		{
			if(v%p.first!=p.second)return false;
		}
	}
	return true;
}


int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		if(solve())
			cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}

标签:return,CRT,数论,定理,mi,int,bmod,ll,mod
From: https://www.cnblogs.com/nannandbk/p/17487023.html

相关文章

  • [数论]素数筛和整数分块
    PrimesievingandIntegerblocking一、Primenumbersievemethod1.埃氏筛O(nloglogn)从2开始,2是质数,那么2的倍数:4、6、8、10、12、14、16...肯定不是质数3是质数,那么3的倍数:6、9、12、15、18、21.....肯定不是质数4已经被筛去了(即被置为false),不是质数,那么4的倍数肯定......
  • 【笔记】韦达定理的定义与证明
    前言已知,一元二次方程\(ax^2+bx+c=0\)\((a,b,c\in\mathbb{R},a\not=0)\)有如下求根公式:\[\Delta=b^2-4ac\]\[x_{1,2}=\frac{-b\pm\sqrt{\Delta}}{2a}\]当\(\Delta<0\)时,方程无实数根;当\(\Delta=0\)时,方程有两个相等的实数根(\(x_{1}=x_{2}\));当\(\D......
  • 算法学习笔记(25): 矩阵树定理
    矩阵树定理本文不作为教学向文章。比较好的文章参考:矩阵树-定理以及凯莱公式【学习笔记】矩阵树定理(Matrix-Tree)_繁凡さん的博客-CSDN博客矩阵树定理入土-ixRic的博客-洛谷博客对于无向图无向图中应该是矩阵树定理的常用场景。无向图的矩阵树定理讲的是:......
  • 扩展CRT
    考虑递推假设对于前\(i\)个线性同余方程,我们得到了\(x\)的一个解其通解显然为\(x+k*M_i\)其中\(M\)为前\(i\)个方程的最小公倍数对于第\(i+1\)个方程,我们需要求出\(x+t*M_i\equiva_{i+1}(mod\,\,m_{i+1})\)中的t值exgcd求解同余方程即可这样推n次即可得......
  • 扩展中国剩余定理(EXCRT)
    中国剩余定理(CRT)不能解决模数不互质情况的模线性同余方程组。这是中国剩余定理的原理所决定的。但当我们的模数不互质时,这个方式显然就寄掉了,因此我们要打破原有的思路,去找一个新的方式解不定方程组,这时我们的扩展中国剩余定理(EXCRT)就出现了假设我们现在有如下不定方程组\[\b......
  • 隐函数定理的几何应用
    隐函数定理的几何应用一、平面曲线的切线与法线设平面曲线由方程\[F(x,y)=0\tag{1}\]确定,它在\(P_0(x_0,y_0)\)的某领域上满足隐函数定理的条件,于是在点\(P_0\)附近所确定的连续可微隐函数\(y=f(x)\)(或\(x=g(y)\))和方程\((1)\)在\(P_0\)附近表示同一曲线,从而该曲......
  • Luogu P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有\(16\)头母猪,如果建了\(3\)个猪圈,剩下......
  • CAP原则(CAP定理)、BASE理论
    一、CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),三者不可得兼。CAP原则是NOSQL数据库的基石。分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:一致性(C):在分......
  • 调题时出现的问题 in 『中国剩余定理』
    1(焯冲养pig/板子)【模板】中国剩余定理(CRT)/曹冲养猪要注意这东西不能用费马小定理,只能用扩欧.因为费马小定理的适用条件是模数为质数.......
  • 数学分析复习:Weierstrass 逼近定理, Müntz–Szász 定理
    本学期的“数学分析(不是实验班)”讲了一堆Approximationtheory,这是怎么绘事呢?定理1(Weierstrass).连续函数\(f\in\mathrmC[0,1]\)可被多项式一致逼近.对任意\(\varepsilon>0\)和\(x\in[0,1]\),设随机变量\(X\)服从二项分布\(\mathrmB(n,x)\),由Chebysh......