中国剩余定理

Posted vscoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中国剩余定理相关的知识,希望对你有一定的参考价值。

前言:

中国剩余定理($CRT$),也称孙子定理,原文如下:

啊“有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?”

很明显这是一个同余方程组,于是我们就可以用中国剩余定理求解

正文:

中国剩余定理

它可以用于求解模数两两互质时的同余方程组

设 $b_1,b_2,ldots,b_k$ 两两互质

则同余方程组 $egin{cases} xequiv a_1 (mod b_1) \\ xequiv a_2 (mod b_2) \\ qquaddots \\ xequiv a_k (mod b_k) end{cases}$ 有整数解

并且在 $mod lcm=prod_{i=1}^{k}b_i$ 意义下有唯一解

为 $x=sum_{i=1}^ka_ileft_iinv(left_i)\\%lcm$

其中 $left_i=dfrac{lcm}{b_i}$ ,$inv(left_i)$ 为 $left_i mod b_i$ 意义下的逆元

同时 $CRT$ 一般会配合龟速乘,防止乘起来会爆 $long long$

typedef long long ll;

void exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
}

ll qmul(ll a,ll b,ll p)
{
    ll ans=0,base=a%p;
    while(b)
    {
        if(b&1) ans=(ans+base)%p;
        base=(base+base)%p;
        b>>=1;
    }
    return ans;
}

ll CRT(int n,ll *a,ll *b)
{
    ll ans=0,lcm=1;
    for(int i=1;i<=n;i++)
        lcm*=b[i];
    for(int i=1;i<=n;i++)
    {
        ll inv,k;
        ll left=lcm/b[i];
        exgcd(left,b[i],inv,k);
        inv=(inv%b[i]+b[i])%b[i];
        ans=(ans+qmul(qmul(a[i],left,lcm),inv,lcm))%lcm;
    }
    return (ans+lcm)%lcm;
}

扩展中国剩余定理

扩展中国剩余定理可以用来解决模数不互质的情况

后序:

据说中国剩余定理好像很少会考

拓展中国剩余定理好像可以搞扩展卢卡斯定理

然而我并不会扩展卢卡斯

以上是关于中国剩余定理的主要内容,如果未能解决你的问题,请参考以下文章

中国剩余定理

简述中国剩余定理

中国剩余定理过程

什么叫中国剩余定理

中国剩余定理与扩展中国剩余定理

中国剩余定理公式是啥?