zoukankan      html  css  js  c++  java
  • 中国剩余定理 CRT

    中国剩余定理 CRT

    正常版本CRT

    要解的是一个很容易的东西

    [egin{aligned} xequiv a_1(mod m_1)\ xequiv a_2(mod m_2)\ ...\ xequiv a_n(mod m_n) end{aligned} ]

    保证(m_1,m_2...m_n)之间两两互质,求最小的(x)

    (M=prod m_i)

    首先我们确定一点,我们求出了任意一个满足条件的(x)之后,只需要对其模(M)就是最终的答案。

    因为(M)是所有数的(lcm)

    考虑一下,对于每一个(a_i),如果我们能够求出一个数(x_i)

    满足它是其他所有(m)的乘积,即(M_i=M/m_i)的倍数,并且(x_iequiv 1(mod m_i))

    也就是对于任意一个(x_i),满足(x_iequiv 0(mod m_k),k e i)(x_iequiv 1(mode m_i))

    那么最终的答案就会是(sum(a_ix_i)mod M)

    深思熟虑的考虑如何求出(x_i)

    因为(x_i)(M_i)的倍数,所以(x_i=kM_iequiv 1(mod m_i))

    所以(k)(M_i)在模(m_i)意义下的逆元。所以(x_i)就是(k)(M_i)倍,注意最终统计入结果的模数是(M)

    所以,(CRT)的结果就是(sum (a_ik_iM_i)mod M)

    不正常版本CRT

    要求的东西同上,不保证所有(m_i)互质。

    我们肯定不能像上面那样堆在一起求了。

    换个方法,假设我们只有两个方程。(xequiv a_1(mod m_1),xequiv a_2(mod m_2))

    怎么算答案?

    显然是要满足:(x=x_1m_1+a_1=x_2m_2+a_2),并且(x)最小。

    显然是(x_1,x_2)都要尽可能的小。

    所以(x_1m_1+x_2m_2=a_2-a_1)

    那么(exgcd)可以求解最小的(x_1),然后就可以求得(x=x_1m_1+a_1)

    这样子就可以同时满足这两个方程了,因为方程有多个,

    所以我们把这两个方程合并,假设当前求出来的解是(x')

    那么我们就新加入一个方程(xequiv x'(mod lcm(m_1,m_2)))就好了。

  • 相关阅读:
    Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'
    linux基本命令(4) 查看文件相关
    linux基本命令(3) 文件操作相关
    php 验证码不显示
    linux基本命令(2) 修改文件所属人以及权限
    linux 修改开机欢迎文字
    Mysql 自定义HASH索引带来的巨大性能提升
    Maven依赖范围<scope>
    深入理解Java G1垃圾收集器
    Redis EXISTS命令耗时过长case排查
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9315969.html
Copyright © 2011-2022 走看看