中国剩余定理

中国剩余定理详解

只谈情不闲聊 提交于 2019-11-28 01:34:47
START 中国剩余定理用于求解线性同余方程组: a = a1 (mod n1) a = a2 (mod n2) a = a3 (mod n3) ........ a = ai (mod ni) 任意ni和nj(i != j)互质,问a的值。 我们可以把a写成a=Σai*ci,(ci待求),这个式子要满足两个条件: 1.任意i!=j时ai*ci%nj=0 2.满足ai*ci%ni=ai。 只要满足了这两个条件的a就是我们要求的a。 如何求ci?: 因为正整数n1,n2......ni都互质,那么任意 i != j 都有gcd(ni,nj)=1。 设mi=(n)/ni。其中n=n1*n2*n3*.......*ni。 于是有gcd(ni,mi)=1。 根据扩欧的性质我们知道,存在mi',ni'使得mi*(mi')+ni*(ni')=1。 在模ni的条件下就是:mi*(mi') = 1 (mod ni)。------① 显然,令ci=mi*(mi'),这样的ci是满足条件2的(将①左右同时×ai) 又因为mi包含有nj(i!=j) ,则mi*(mi')%nj =0(i!=j),左右同时×ai得到ai*mi*(mi')=0 (mod nj)所以条件1也成立 现在求ci就是求mi*mi'的问题。 mi和mi'都很好求。 mi=n/ni。 mi'直接用扩欧来求,实际上在求的过程我们发现mi

[数论]拓展中国剩余定理

落花浮王杯 提交于 2019-11-28 01:25:23
拓展中国剩余定理 •拓展中国剩余定理 拓展中国剩余定理来解 $\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2}\left( mod\ m_{2}\right) \\ \ldots \\ x\equiv c_r\left( mod\ m_r\right) \end{cases}$ 来源: https://www.cnblogs.com/MMMinoz/p/11385728.html

模板 - 扩展中国剩余定理

流过昼夜 提交于 2019-11-27 22:41:38
解k个线性同余方程构成的线性同余方程组,每个方程形如: $x_i = c_i mod m_i$ ,假如有解输出最小非负整数解,否则输出-1。 可能在模数比较大的时候会溢出的版本,方法是直接对两个方程强行合并。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXK = 100005; void exgcd(ll a, ll b, ll &x, ll &y) { if(!b) x = 1, y = 0; else exgcd(b, a % b, y, x), y -= a / b * x; } ll inv(ll a, ll b) { ll x = 0, y = 0; exgcd(a, b, x, y); x = (x % b + b) % b; if(!x) x += b; return x; } int k; ll c[MAXK], m[MAXK]; //解k个线性同余方程构成的方程组, xi = ci mod mi ,假如有解,返回最小非负整数解,否则返回-1 ll exCRT(int k) { ll c1, c2, m1, m2, t; for(int i = 2; i <= k; ++i) { m1 = m[i - 1], m2 = m[i], c1 = c[i -

中国剩余定理,扩展中国剩余定模板。

我们两清 提交于 2019-11-27 21:53:09
解决的问题:求一个最小正整数x。 x 满足条件 x % m[ ] = a[ ]; 1 中国剩余定理只能 解决 m互质时; 2 扩展中国剩余定理可以 解决的m 不互质 ,但是可以m互质时用扩展中国剩余定理会慢。 中国剩余定理的证明我说一下把,扩展的不熟练怕误人子弟。 首先说一下值的意思。 lcm = m1*m2*m3..... Mi = lcm/mi 证明: ①mi和其他数是互质的和其他值的乘积同样互质 gcd(Mi, mi) == 1    ②由扩展欧几里得性质(ax+by=c 当且仅当c%gcd(x,y) = 0) Mi*x + mi*y = 1    ③ 两边模mi,-> Mi*x % mi = 1, 令ei = Mi*x    即ei ≡ 0(mod mj), j != i ei ≡ 1(mod mj), j = i    ④故一个解是e1*a1 + e2*a2 + ....... + en*an 中国剩余定理模板 洛谷模板题 https://www.luogu.org/problem/P3868 求x:x % m[] = a[]; 并且m数组是互质的。①适用于a,m为非负整数,如果又a有负数,先转化成正,下边有写。②乘时可能爆ll,有时需要快速乘。 ll a[100], m[100]; ll exgcd(ll a, ll b, ll &x, ll &y){ //扩展欧几里得

[TJOI2009]猜数字

倾然丶 夕夏残阳落幕 提交于 2019-11-27 20:54:44
[TJOI2009]猜数字 中国剩余定理+龟速乘 这个大概就是中国剩余定理的板子题了啊。。。 中国剩余定理: 问题: 若 \(m_1,m_2...m_n,\) 是两两互质的正整数, 求解线性同余方程组: \[f(n)=\begin{cases} x\equiv a_1\pmod {m_1}\\ x\equiv a_2\pmod {m_2}\\ ... ...\\ x\equiv a_n\pmod {m_n}\\ \end{cases}\] 的解 \(x\) 。 解法: 设 \(M=\prod_{i=1}^n,M_i=M/m_i\) \(t\) 是同余方程 \(M_it_i\equiv 1\pmod {m_i}\) 的一个解 关于怎么解同余方程 然后答案就是 \[x=\sum_{i=1}^n a_im_it_i\] 证明: 因为 \(M_i\) 是处 \(m_i\) 外所有数的倍数,所以 \[\forall k\not=i,a_iM_it_i\equiv 0\pmod {m_k}\] 而且 \[a_iM_it_i\equiv a_i\pmod {m_i}\] \[x=\sum_{i=1}^na_iM_it_i\] 原方程成立。 通解: \[x=\sum_{i=1}^n a_im_it_i\] 是问题的一个特殊解,通解为 \[x+kM(k\in Z)\] 证明: 显然(大雾) 龟速乘:

中国剩余定理(crt)和扩展中国剩余定理(excrt)

穿精又带淫゛_ 提交于 2019-11-27 19:07:21
数论守门员二号 =。= 中国剩余定理: 1.一次同余方程组: 一次同余方程组是指形如x≡ai(mod mi) (i=1,2,…,k)的同余方程构成的组 中国剩余定理的主要用途是解一次同余方程组,其中m1,m2,...,mk互质 2.中国剩余定理: 令M=m1*m2*...*mk(即所有m的lcm) ti为同余方程M/mi*ti≡1(mod mi)的最小正整数解 则存在解x=∑ai*M/mi*ti 通解为x+i*M 最小非负整数解为(x%M+M)%M (我承认这段是抄的orz 原文看起来更方便: https://blog.csdn.net/niiick/article/details/80229217 ) M/mi*ti≡1(mod mi)可转化为M/mi*ti+mi*y=1,然后用exgcd求ti 3.证明: 对于第k个方程 ①当i≠k时,有mk|M/mi,即ai*M/mi*ti≡0(mod mk) ②当i=k时,有M/mk*tk≡1(mod mk),即ak*M/mk*tk≡ak(mod mk) 故∑ai*M/mi*ti≡ak(mod mk) 4.代码: (其中LL是long long,qcm是快速乘) 1 LL crt(){ 2 LL bwl=0; 3 for(int i=1;i<=k;++i){ 4 LL x,y; 5 exgcd(M/m[i],m[i],x,y); 6 if

中国剩余定理和扩展中国剩余定理

笑着哭i 提交于 2019-11-27 15:56:42
也许更好的阅读体验 前置知识 快速乘 扩展欧几里得定理 同余方程 中国剩余定理(CRT) 目的 求最小的正整数 \(x\) ,使其满足 \(\begin{cases} x\equiv a_{1}\left( mod\ m\right) \\ x\equiv a_{2}\left( mod\ m_{2}\right) \\ \vdots \\ x\equiv a_{n}\left( mod\ m_{n}\right) \end{cases}\) 其中 \(m_1,m_2\dots m_n\) 互质 求法 令 \(\begin{aligned}M=\prod ^{n}_{i=1}m_{i}\end{aligned}\) 设 \(\omega _{i}=\dfrac {M}{m_{i}}\) \(\omega_i^{-1}\) 为 \(\omega_i\) 在 \(mod\ M\) 下的逆元 则有 \(\begin{aligned}x=\sum ^{n}_{i=1}a_{i}\omega_{i}\omega_{i}^{-1} mod\ M\end{aligned}\) 当对 \(m_i\) 取模时,除了有 \(\omega_i\) 的项,其余项都是 \(m_i\) 的倍数,也就是说它们 \(mod\ m_i\) 是为 \(0\) 的,最后得到的结果就是 \(a_i\) \(m_1,m_2

中国剩余定理

喜欢而已 提交于 2019-11-27 13:41:06
中国剩余定理:若各方程的模数两两互质,设 M = k ∏ i=1 mi,Mi = M mi,MiM′ i ≡ 1 (mod mi) 则同余方程组在模 M 下的解唯一且解为 x≡a1M1M′ 1 +a2M2M′ 2 + ... +akMkM′ k (mod M) 然后我们需要用到扩欧求Mi'的逆元就好了扩欧(求逆元的数,mod数,x,y) #include<iostream> #include<cstdio> using namespace std; int d,M=23*28*33,ans,t; int m[4]={0,23,28,33};//存mod数 int a[4]; void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) { x=1; y=0; d=a; } else { exgcd(b,a%b,d,x,y); int t=x; x=y; y=t-a/b*y; } } int intchina(int n)//中国剩余定理 { ans=0;//注意初始化 int Mi,x,y,g; for(int i=1;i<=n;i++) { Mi=M/m[i]; exgcd(Mi,m[i],g,x,y); ans=(ans+Mi*x*a[i])%M; } if(ans<=d) return 21252-(d-ans); else

中国剩余定理(孙子定理)(精华详细版!)

笑着哭i 提交于 2019-11-27 05:42:23
问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何? 简单点说就是,存在一个数x,除以3余2,除以5余三,除以7余二,然后求这个数。上面给出了解法。再明白这个解法的原理之前,需要先知道一下两个定理。 定理1:两个数相加,如果存在一个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。 定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。 以上两个定理随便个例子即可证明! 现给出求解该问题的具体步骤: 1、求出最小公倍数 lcm=3 5 7=105 2、求各个数所对应的基础数 (1)105÷3=35 35÷3=11…2 //基础数35 (2)105÷5=21 21÷5=4…1 定理2把1扩大3倍得到3,那么被除数也扩大3倍,得到21*3=63//基础数63 3、105÷7=15 15÷7=2…1 定理2把1扩大2倍得到2,那么被除数也扩大2倍,得到15*2=30//基础数30 把得到的基础数加和(注意:基础数不一定就是正数) 35+63+30=128 4、减去最小公倍数lcm(在比最小公倍数大的情况下) x=128-105=23 那么满足题意得最小的数就是23了。一共有四个步骤。下面详细解释每一步的原因。 (1)最小公倍数就不解释了,跳过(记住,这里讨论的都是两两互质的情况) (2

中国剩余定理模数不互质的情况(poj 2891

北慕城南 提交于 2019-11-26 14:19:32
中国剩余定理模数不互质的情况 主要有一个ax+by==k*gcd(a,b),注意一下倍数情况和最小 https://vjudge.net/problem/POJ-2891 #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 1000010 #define p(a) putchar(a) #define For(i,a,b) for(long long i=a;i<=b;++i) //by war //2019.8.8 using namespace std; long long T,n; long long r[N],a[N],x,y,gcd,flag; void in(long long &x){ long long y=1;char c=getchar();x=0; while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();} x*=y; } void o(long long x){ if(x