孙子定理,模线性同余方程

参考博客

Acdreamer

中国剩余定理

解线性同余方程,运用拉格朗日插值法,得孙子定理
这里写图片描述

模板

int m[maxn];
int  China(int a[],int n,int b[])//其中a[]是模数,b[] 是余数
{
    int M = 1;
    for(int i = 0;i < n;++i)
        M *= a[i];
    int ans = 0;
    for(int i = 0;i < n;++i)
    {
        int Mi = M/a[i];
        LL x,y;
        ex_gcd(Mi,a[i],x,y);
        ans += b[i] * x*Mi;
    }
    ans = (ans%M + M) %M;
    return ans;
}

扩展

如果模数两两不互素,就合并两个模数
假设
         y=a1(mod m1)
         y=a2(mod m2)
         gcd(m1,m2)!=1
则有
         xa1+t1m1(mod m1);1
         xa2+t2m2(mod m2);2
         t1m1t2m2=a1a2
        利用欧几里得扩展求出 t1带入1 求出x

y=x(mod lcm(m1,m2))

posted on 2017-10-07 19:13  zzuzxy  阅读(252)  评论(0)    收藏  举报

导航