「学习笔记」中国剩余定理及扩展

本文详细介绍了中国剩余定理及其扩展版本的原理与应用。针对互质与非互质模数的情况,给出了具体的求解算法,并附带了C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中国剩余定理总是不太熟练,写一篇BlogBlog复习一下好了。

中国剩余定理

nn个线性同余方程:xai(modmi)mimi都互质,求解这个线性同余方程组

使用中国剩余定理(ChineseremaindertheoremChineseremaindertheoremcrtcrt)来解决,它是一种构造方法,本质思想是每项只对自己有贡献.

M=ni=1miM=∏i=1nmi,答案为:

x=(i=1nai×Mi×Ni)modMx=(∑i=1nai×Mi×Ni)modM

其中MiMi表示MmiMmiNiNi表示MiMimodmimodmi意义下的逆元.

大概写起来是这样的,比较简单

int Crt(int n, int * m, int * a) {
    int ans = 0, M = 1;
    for(int i = 1; i <= n; i ++) M *= m[i];
    for(int i = 1; i <= n; i ++) {
        int Mi = M / m[i];
        int Ni = inv(Mi, m[i]); 
        (ans += Mi * Ni % M * a[i] % M) %= M;
    }
    return (ans + M) % M;
}

扩展中国剩余定理

nn个线性同余方程:xai(modmi)不保证mimi都互质,求解这个线性同余方程组

使用扩展中国剩余定理ExtendedChineseRemainderTheoremExtendedChineseRemainderTheoremcrtcrt)解决,ScαpeScαpe鸽鸽 称其为增量法.

考虑每次如何把两个线性同余方程合并。
假设有两个方程,xa(modb)x≡a(modb)xc(modd)x≡c(modd)

由于第一个式子得:x=bt+ax=bt+a.
于是得到:bt+ac(modd)bt+a≡c(modd)
btca(modd)bt≡c−a(modd)
然后这是经典的同余方程,直接使用exgcdexgcd求解.

解出:tt0(moddgcd(b,d))t≡t0(moddgcd(b,d))
于是得到x=bt+a(moddgcd(b,d))x=bt+a(moddgcd(b,d))

于是每次我们两两合并,合并n1n−1次,就完事了.

LL exgcd(LL a, LL b, LL &x, LL &y, LL &g) {
    if(!b) x = 1, y = 0, g = a;
    else exgcd(b, a % b, y, x, g), y -= x * (a / b);
}

LL excrt(int n, LL * m, LL * a) { //x = a[i] (mod m[i])
    LL c = a[1], d = m[1], p, q, g;
    for(int i = 2; i <= n; i ++) {
        exgcd(d, m[i], p, q, g);
        LL tmp = a[i] - c;
        if(tmp % g != 0) return ; //No result
        p *= tmp / g;
        p = (p % (m[i] / g) + (m[i] / g)) % (m[i] / g);
        c += p * d;
        d = d / g * m[i];
        c %= d;
    }
    return (c % d + d) % d;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值