当前位置: 首页 > news >正文

扩展中国剩余定理

中国剩余定理

中国剩余定理

考虑一组模线性同余方程:

{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . x ≡ a k ( m o d m k ) \begin{cases} x\equiv a_1\pmod{m1} \\ x\equiv a_2\pmod{m2}\\ .\\ .\\ .\\ x\equiv a_k\pmod{mk}\\ \end{cases} xa1(modm1)xa2(modm2)...xak(modmk)

其中, a 1 , a 2 , . . . , a k a_1,a_2,...,a_k a1,a2,...,ak是给定整数,而 m 1 , m 2 , . . . , m k m_1,m_2,...,m_k m1,m2,...,mk是两两互质的正整数。

具体步骤如下:

计算模数的乘积:$ M = m_1 ⋅m_2⋅…⋅m_k$

计算辅助模数: 对于每个 i,计算 M i = M / m i M_i=M/m_i Mi=M/mi

计算模反元素: 对于每个 i,找到 M i − 1 M_i^{-1} Mi1,使得 M i ⋅ M i − 1 ≡ 1 ( m o d m i ) M_i\cdot M_i^{-1}\equiv 1 \pmod{m_i} MiMi11(modmi)

计算解: 最终解 x 由以下公式给出:$\left ( a_1\cdot M_1 \cdot M_1^{-1}+a_2\cdot M_2 \cdot M_2^{-1}+…+a_k\cdot M_k \cdot M_k^{-1}\right ) \bmod M $

中国剩余定理在密码学、编码理论、计算机科学等领域有着广泛的应用。它不仅用于解决同余方程组,还被应用于很多领域,例如数据传输、数字签名等。

扩展中国剩余定理

考虑一组模线性同余方程:

{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . x ≡ a k ( m o d m k ) \begin{cases} x\equiv a_1\pmod{m1} \\ x\equiv a_2\pmod{m2}\\ .\\ .\\ .\\ x\equiv a_k\pmod{mk}\\ \end{cases} xa1(modm1)xa2(modm2)...xak(modmk)

其中, a 1 , a 2 , . . . , a k a_1,a_2,...,a_k a1,a2,...,ak是给定整数,而 m 1 , m 2 , . . . , m k m_1,m_2,...,m_k m1,m2,...,mk是正整数。

x = k 1 m 1 + a 1 x=k_1m_1+a_1 x=k1m1+a1, x = k 2 m 2 + a 2 x=k_2m_2+a_2 x=k2m2+a2

所以 k m 1 + a 1 = k m 2 + a 2 km_1+a_1=km_2+a_2 km1+a1=km2+a2

从而 k 1 m 1 − k 2 m 2 = a 2 − a 1 k_1m_1-k_2m_2=a_2-a_1 k1m1k2m2=a2a1,其中 k 1 , k 2 k_1,k_2 k1,k2未知。

k 1 m i n = ( ( k 0 ⋅ a 2 − a 1 g c d ( m 1 , m 2 ) ) % m 2 g c d ( m 1 , m 2 ) + m 2 g c d ( m 1 , m 2 ) ) % m 2 g c d ( m 1 , m 2 ) k_1min=((k_0\cdot \frac{a_2-a_1}{gcd(m_1,m_2)})\%\frac{m_2}{gcd(m_1,m_2)} +\frac{m_2}{gcd(m_1,m_2)})\%\frac{m_2}{gcd(m_1,m_2)} k1min=((k0gcd(m1,m2)a2a1)%gcd(m1,m2)m2+gcd(m1,m2)m2)%gcd(m1,m2)m2

其中 k 0 k_0 k0 k 1 m 1 − k 2 m 2 = g c d ( m 1 , m 2 ) k_1m_1-k_2m_2=gcd(m_1,m_2) k1m1k2m2=gcd(m1,m2)的特解, k 1 m i n k_1min k1min为最小正整数解。

x = ( k 1 m i n + k ⋅ m 2 g c d ( m 1 , m 2 ) ) m 1 + a 1 = m 1 m 2 g c d ( m 1 , m 2 ) k + k 1 m i n + a 1 x=(k_1min+k\cdot\frac{m_2}{gcd(m_1,m_2)} )m_1+a_1=\frac{m_1m_2}{gcd(m_1,m_2)}k+k_1min+a_1 x=(k1min+kgcd(m1,m2)m2)m1+a1=gcd(m1,m2)m1m2k+k1min+a1

m 1 = m 1 m 2 g c d ( m 1 , m 2 m_1=\frac{m_1m_2}{gcd(m_1,m_2} m1=gcd(m1,m2m1m2 a 1 = k 1 m i n + a 1 a_1=k_1min+a_1 a1=k1min+a1

代码实现

#include <cstdio>
#include <iostream>
#include <cmath>using namespace std;typedef __int128 ll;int n;ll read() {ll x = 0, f = 1;char c = getchar();while (c < '0' || c>'9') {if (c == '-') f = -1;c = getchar(); }while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
void write(ll x) {if(x == 0){putchar('0');return;}if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 + '0');
}ll my_abs(ll x){return x >= 0 ? x : -x;
}
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 t = x;x = y;y = t- a / b * y;return d;
}int main(){cin >> n;ll m1, a1, m2, a2, k1, k2;m1 = read(), a1 = read();bool flag = false;for (int i = 1; i <= n-1; i++){m2 = read(), a2 = read();ll d = exgcd(m1, m2, k1, k2);if ((a2 - a1) % d){flag = true;continue;}	ll r = my_abs(m2 / d);k1 = (((k1 * (a2 - a1) / d ) % r) + r) % r;a1 = m1 * k1 + a1, m1 =  m2 / d * m1;}if (flag)	puts("-1");else write(a1);return 0;
} 

例题

  1. 表达整数的奇怪方式
#include <cstdio>
#include <iostream>
#include <cmath>using namespace std;typedef long long ll;int 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 t = x;x = y;y = t- a / b * y;return d;
}/*
x=ka+m
x=k1*a1+m1=k2*a2+m2
k1*a1-k2*a2=m2-m1
k1*a1+k2*a2=m2-m1
k0=(k1*(m2-m1)/d%(a2/d)+a2/d)%(a2/d)  其中:k0为最小正整数解x=(k0+k*a2/d)*a1+m1=a1*a2/d*k+k0*a1+m1
a1=a1*a2/d,m1=k0*a1+m1; 
*/int main(){ll a1, a2, m1, m2, k1, k2;scanf("%d", &n);scanf("%lld%lld", &a1, &m1);bool f = 0;for(int i=1; i <= n-1; i++){scanf("%lld%lld", &a2, &m2);ll d = exgcd(a1, a2, k1, k2);if((m2 - m1) % d){f = 1;continue;}ll k0 = (k1 * (m2 - m1) / d % (a2 / d) + a2 / d) % (a2 / d);m1 = k0 * a1 + m1, a1 = a1 * a2 / d;// m1=k0*a1+m1 和  a1=a1*a2/d  顺序不能换 }if(f)	puts("-1");else	printf("%lld\n", m1);return 0;
}

相关文章:

  • day 32 学习笔记
  • 【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时
  • ZooKeeper配置优化秘籍:核心参数说明与性能优化
  • 多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)
  • 最高支持高速L3商用,华为发布ADS 4智驾系统
  • AT45DB161串行FLASH操作
  • 晶振不集成到芯片内部的原因分析
  • Ubuntu中选择Python虚拟环境
  • 考拉悠然:科技与匠心,以烟草虫情AI监测系统共筑品质未来
  • git tag使用场景和实践
  • BDO分厂开展地沟“大清肠”工作
  • 交通运输行业综合智慧监管平台:商贸物流的安全与效率引擎
  • G3学习笔记
  • ejs列表渲染,条件渲染,在node中使用ejs
  • 【C++入门:类和对象】[3]
  • JS 应用算法逆向三重断点调试调用堆栈BP 插件发包安全结合
  • java中final以及static的作用
  • Linux并发与竞争:从生活例子到内核实战
  • 从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战
  • 高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件
  • 东阿至聊城公交票价取消八折优惠:运行成本高昂
  • 体坛联播|AC米兰挺进意大利杯决赛,弗雷戴特宣布退役
  • 内蒙古镶黄旗委原书记好毕斯哈拉图履新锡林郭勒盟民政局局长
  • 岳阳一管道疑似有黑水直排东洞庭湖,生态环境局:已赶往现场核查
  • 外交部答澎湃:愿同阿曼在国际和地区事务中加强沟通协调
  • 青岛:今年计划新增城镇住房约5.77万套,推动房地产市场回稳