zoukankan      html  css  js  c++  java
  • 线性同余方程组

    今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?

    上述问题便是一个具体线性同余方程组。所谓线性同余方程组,就是形如:

    [left{egin{array}{c} {x equiv a_{1}pmod {m_{1}}} \ {x equiv a_{2}pmod {m_{2}}} \ {vdots} \ {x equiv a_{n}pmod {m_{n}} }end{array} ight. ]

    的方程组。

    中国剩余定理

    中国剩余定理是用于解决线性同余方程组的问题。
    要使用中国剩余定理,必须得保证任意两个模数之间互质。

    先说结论,上述方程的解为:

    [x = sum_{i = 1}^{n}a_iM_ib_i \ ]

    其中,(M_i = prod_{j = 1(i eq j)}^{n}m_j)(b_i)(M_i)的逆元。

    对于中国剩余定理,我们可以这样理解:

    对于方程组中,第 (i)个方程,如果能构造出这样一个解 (x_i),使得 (x_i equiv a_i pmod {m_i}),而 (x_i equiv 0 pmod {m_j} (i eq j)),那么最终方程组的答案就是 (sum_{i = 1}^{n} x_i)

    那么问题就换成了如何构造这样的一个解 (x_i)。要使得 (x_i)满足第二个条件,那么只需要 (x_i)里含有 (M_i)即可。
    然后我们对 (M_i)求逆元 (b_i),也就是找到一个 (b_i)使其满足:

    [M_i b_i equiv 1 pmod {m_i} ]

    由于 (M_i)(m_i)互质,所以逆元肯定存在。(这也是为什么中国剩余定理要求任意两个模数之间互质的原因)
    之后我们两边乘以一个 (a_i),就会得到:

    [a_i M_i b_i equiv a_i pmod {m_i} ]

    那么, (x_i = a_i M_i b_i)就是我们所需要构造的解了。

    扩展中国剩余定理

    当线性同余方程组中,存在两个模数不互质的时候,就要用到扩展中国剩余定理。
    我们可以用数学归纳法来证明(理解/构造)扩展中国剩余定理。

    首先,对于第一个方程,(x_1 = a_1)显然是第一个方程的解。

    然后对于第(k)个方程,定义 (m = { m{lcm}}{m_1, m_2, cdots, m_{k - 1}}), (x_{k - 1})为前 (k - 1)个方程的解。那么对于(x_{k - 1} + tm)肯定也是前 (k - 1)个方程的解((tm)会被模掉)。那么在求解第 (k)个方程的时候,我们只需要找到一个参数 (t)使得满足 (x_{k - 1} + tm equiv a_k pmod {m_k})。那么

    [x_k = x_{k - 1} + tm ]

    对于 (x_{k - 1} + tm equiv a_k pmod {m_k}),这显然就是一个线性同余方程,用exgcd即可求解。当这个线性同余方程无解的时候,整个方程组也无解。
    也就是:

    [gcd{{m, m_k}} mid a_k - x_{k - 1} ]

    时,同余方程有解。
    整个过程就类似于两两个方程的解不断的合并,直到最后合并剩下最后一个解。

    所以,当仅仅是判断方程组有没有解的情况,我们可以判断所有任意两个方程 (i, j),判断是否满足 (gcd{{m_i, m_j}} mid a_i - a_j)。不满足时,整个方程组无解。

  • 相关阅读:
    jenkins+jmeter结合使用
    Bean的前身今世&处理器&Aware
    Spring的profile属性
    XML的验证模式
    org.springframework.beans包
    packge-info.java
    字节码解释执行引擎
    invokedynamic指令
    多态方法调用的解析和分派
    运行时栈帧结构
  • 原文地址:https://www.cnblogs.com/ljxtt/p/12128255.html
Copyright © 2011-2022 走看看