中国剩余定理

邮差的信 提交于 2020-01-17 05:27:05

https://www.cnblogs.com/MashiroSky/p/5918158.html

(拼凑自以上连接)

备忘录:

a|b是指a能整除b,a是b的因式,4|2是不成立的,2|4才成立

lcm(a,b) a,b的最小公倍数

中国剩余定理

设正整数两两互素,则同余方程组

                             

有整数解。并且在模下的解是唯一的,解为

                               

其中,而的逆元。

int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;y=0;
        return a;
    }
    int g=exgcd(b,a%b,x,y);
    int x1 = y,y1 = x-a/b*y;
    x = x1;
    y = y1;
    return g;
}
int inv(int m, int p){
    int x, y;
    int g = exgcd(m,p,x,y);
    return ((x%p)+p)%p;
}

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

扩展中国剩余定理

中国剩余定理扩展——求解模数不互质情况下的线性方程组:

  普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?

  这种情况就采用两两合并的思想,假设要合并如下两个方程:

  那么得到:

  我们需要求出一个最小的x使它满足:

  那么x1和x2就要尽可能的小,于是我们用扩展欧几里得算法求出x1的最小正整数解,将它代回a1+m1x1,得到x的一个特解x′,当然也是最小正整数解。

  所以x的通解一定是x′加上lcm(m1,m2)∗k,这样才能保证x模m1和m2的余数是a1和a2。由此,我们把这个x′当做新的方程的余数,把lcm(m1,m2)当做新的方程的模数。(这一段是关键

  合并完成:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!