中国剩余定理

EXCRT戳这里
先导知识:扩展欧几里得, 逆元。

引理1:若 \(SUM = \sum_{i = 1}^{n}a_{i}\) 且其中只有一个数 \(a_{k}\) 不能被\(P\)整除, 那么\(SUM\) 不能被 \(P\) 整除, 且余数为 \(a_{k} \mod P\)

引理2:在一个不能整除的式子中,若被除数扩大 \(n\) 倍,则余数在不超过除数的情况下同时扩大 \(n\)

\(S = \prod_{i = 1}^{n}m_{i}\)\(M_{i} = S / m_{i}\), 因为模数两两互质,所以 \(M_{i}\) 不能被 \(m_{i}\) 整除(互质)

\(t_{i}\) 满足 \(M_{i}t_{i} \equiv 1\ (Mod\ m_{i})\), 即为 \(M_{i}\)\(Mod\ m_{i}\) 意义下的逆元

如何保证其有解呢?这个同余方程有解, 当且仅当 \(1\ |\ gcd(m_{i},\ M_{i})\); 然而上面就已经得到这两数互质, 即 \(gcd(m_{i},\ M_{i}) = 1\)中国剩余定理在模数互质的情况下总有解

现在我们得到了 \(M_{i}t_{i} \equiv 1(Mod\ m_{i})\)

依据引理2, 两边同时乘以 \(a_{i}\) , 有: \(a_{i}M_{i}t_{i} \equiv a_{i}\ (Mod\ m_{i})\)

现在令 \(Ans = \sum_{i = 1}^{n}a_{i}M_{i}t_{i}\), 这个数满足两个重要条件:

对于 \(k\) 讨论:

\(Ans\) 分为两部分, 第一部分为 \(One = a_{k}M_{k}t_{k}\), 第二部分为 \(Two = Ans - a_{k}M_{k}t_{k} = \sum_{i = 1}^{n}a_{i}M_{i}t_{i},\ i \not= k\)

对于第一部分, 有 \(One \equiv a_{k}\ (Mod\ m_{k})\)

对于第二部分, 因为 \(Two = \sum_{i = 1}^{n}a_{i}M_{i}t_{i},\ i \not= k\) 中每一项加数都含有 \(m_{k}\) 这一因子,故 \(Two \equiv 0\ (Mod\ m_{k})\)

我们的 \(Ans = One + Two\)引理1可得, \(Ans\) 满足 \(Ans \equiv a_{k}\ (Mod\ m_{k})\)

因为讨论的 \(k\) 具有任意性, 故中国剩余定理的通项解为 $$\sum_{i = 1}^{n}a_{i}M_{i}t_{i}$$

证毕。

其中 \(t_{i}\) 可以有扩展欧几里得算法解得


Code

LL exgcd(LL a,LL b,LL &x,LL &y){
    if(!b){x = 1,y = 0;return a;}
    LL d = exgcd(b,a % b,x,y);
    LL temp = x;x = y,y = temp - y * (a / b);
    return d;
    }
LL China(){
    LL ans = 0,M = 1;
    for(int i = 1;i <= num;i++)M *= I[i].m;
    for(int i = 1;i <= num;i++){
        LL m = M / I[i].m;
        LL d = exgcd(m,I[i].m,x,y);
        ans = (ans + I[i].a * m * x) % M;
        }
    if(ans < 0)ans += M;
    return ans;
    }
posted @ 2018-07-16 16:17  Tony_Double_Sky  阅读(262)  评论(0编辑  收藏  举报