zoukankan      html  css  js  c++  java
  • 中国剩余定理及扩展中国剩余定理

    题目 给定数组 \(a,m\),保证所有 \(m\) 互质。请求出模方程组

    \[\begin{cases} x\equiv a_1 \pmod{m_1} \\ x\equiv a_2 \pmod{m_2} \\ \cdots \\ x\equiv a_n \pmod{m_n} \\ \end{cases} \]

    的最小正整数解。

    分析 我们令 \(M=\prod_{i=1}^n m_i, w_i = \frac{M}{m_i}, p_i \equiv w_i^{-1} \pmod{m_i}, e_i = w_i p_i\),则有 \(x_0 = e_1a_1 + e_2a_2 + \cdots + e_na_n\) 是原方程组的一个解。这是因为 \(e_i \equiv w_ip_i \equiv 1 \pmod{m_i}\),而对于其它的 \(k\neq i\),总有 \(e_k\equiv w_k\equiv 0 \pmod{m_i}\)。也就是说,对于第 \(i\) 个方程,\(x_0\) 除了第 \(i\) 项为 \(a_i\) 外其他项均为 \(0\)(在模 \(m_i\) 意义下)。这便是中国剩余定理(Chinese Reminder Theorem, CRT),代码如下:

    ll CRT(int n, ll *a, ll *m)
    {
        ll M = 1, res = 0;
        for(int i = 1; i <= n; ++i)
            M *= m[i];
        
        for(int i = 1; i <= n; ++i) {
            ll w = M / m[i], p = inv(w, m[i]);
            res = (res + w * p * a[i]) % M;
        }
        return (res + M) % M;
    }
    

    仔细分析,我们就能发现该算法的不足,在于所有 \(m\) 均互质。但如果将这个保证去掉呢?

    假定我们已经求得了前 \(k\) 个方程的通解 \(x + r\cdot M(r\in\mathbb{Z}, M=\prod_{i=1}^k m_i)\),现在就要求解 \(x+r\cdot M\equiv a_{k+1}\pmod{m_{k+1}}\),用扩展欧几里得莽干求解 \(r\) 就行了(雾)。这就是扩展中国剩余定理(Extended Chinese Reminder Theorem, exCRT),虽然和 CRT 完全不沾边。。。事实上,我们可以证明当 \(M=LCM_{i=1}^k m_i\) 结论依然成立。代码如下:

    ll exCRT(int n, ll *a, ll *m)
    {
        ll M = m[1], res = a[1], x, y;
        for(int i = 2; i <= n; ++i) {
            ll d = exgcd(M, m[i], x, y), c = (a[i] - res % m[i] + m[i]) % m[i];
            if(c % d) return -1;
    		
            x = mul(x, c / d, m[i] / d);
            res += x * M, M *= m[i] / d, res = (res % M + M) % M;
        }
        return res;
    }
    
  • 相关阅读:
    关于托管存储过程的部署, 调试和性能
    Fast Fourier Transform in C# (CookyTurkey)
    The Story of Lena(.tiff)
    反射之反思(转)
    分享Oracle9i中建立自增字段的最新办法
    C#操作注册表
    Oracle服务器的常用命令行详细讲解
    为汶川受灾群众祈福!!!!!
    新的开始,新的起点
    完全删除Oracle数据库的方法
  • 原文地址:https://www.cnblogs.com/whx1003/p/11710890.html
Copyright © 2011-2022 走看看