中国剩余定理

同余方程组求解

1.同余方程组(中国剩余定理)不互质版

已知同余方程组 xri(modmi) (其中 m1,m2...mn 不保证互质)的 mi ri ,求x.
先看前两个方程, xmodm1=r1 ,即

x=r1+m1k1......(1)

xmodm2=r2 ,即
x=r2+m2k2......(2)

由上面两式可得, r1+m1k1=r2+m2k2
移项,得
m1k1m2k2=r2r1......(3)

a=m1,b=m2,c=r2r1
ak1+bk2=c......(4)

(此时要判断是否有解)
用扩展欧几里得解出 k1 后带入(1),得到满足前两个同余方程的一个特解 x2 .
在(4)中, k1+pb/gcd(m1,m2) (p∈Z)也是解,则 k1+pm2/gcd(m1,m2) 也是解,
k1+pm2/gcd(m1,m2) 带入(1)中,得
x=r1+m1k1+pm1m2/gcd(m1,m2)


x=x0+plcm(m1,m2)......(5)

也就是
xx0(modlcm(m1,m2))......(6)

至此,我们求出了满足方程(1)和(2)的解,它就是(6)的解
将(6)和 xmodm3=r3 联立,会发现这和解(1)(2)是同一个问题!于是就可以愉快的往下递推了!!!
下面代码求了x的 最小正值

int excrt(int m[], int r[], int n)
{
     int M = m[0], R = r[0], x, y;
     for (int i = 1; i < n; i++)
     {
         if(!solve(M, m[i], r[i] - R, x, y)) return -1;//无解输出-1
         R += x * M;
         M /= d;
         M /= m[i];
         (R += M) %= M;
     }
     return R;
 }

2.同余方程组(中国剩余定理)互质版

xri(modmi) ,其中 m1,m2...mn 互质。
需要用到扩展欧几里得算法
下面返回了最小的正数x
设M为 mi 的乘积,则x+kM也是解

int crt(int n,int r[],int m[])
{
    int lcm = 1;
    for(int i = 0; i < n; i++) lcm *= m[i];
    int ans = 0;
    int M,t,tmp;
    for(int i = 0; i < n; i++)
    {
        M = lcm/m[i];
        if(!solve(M, m[i], 1, t, tmp)) return -1;
        ans+= r[i]*t*M;
    }
    (ans += lcm) %= lcm;
    return ans;
}

扩展欧几里得

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值