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)))就好了。

  • 相关阅读:
    34.页面刷新 Walker
    32.标题栏图标 Walker
    44.相对路径 Walker
    白乔原创:实战软件DIY
    白乔原创:VC之美化界面篇
    白乔原创:在公司里,你会是什么样的程序员?
    白乔原创:程序员的路该怎么走?
    白乔原创:VC之控件篇
    08年5月份培训的照片一张
    关于resin的认证框架
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9315969.html
Copyright © 2011-2022 走看看