1.同余方程组(中国剩余定理)不互质版
已知同余方程组
x≡ri(modmi)
(其中
m1,m2...mn
不保证互质)的
mi
和
ri
,求x.
先看前两个方程,
xmodm1=r1
,即
x=r1+m1k1......(1)
xmodm2=r2 ,即
x=r2+m2k2......(2)
由上面两式可得, r1+m1k1=r2+m2k2 ,
移项,得
m1k1−m2k2=r2−r1......(3)
令 a=m1,b=−m2,c=r2−r1 ,
得
ak1+bk2=c......(4)
(此时要判断是否有解)
用扩展欧几里得解出 k1 后带入(1),得到满足前两个同余方程的一个特解 x2 .
在(4)中, k1+p⋅b/gcd(m1,m2) (p∈Z)也是解,则 k1+p⋅m2/gcd(m1,m2) 也是解,
将 k1+p⋅m2/gcd(m1,m2) 带入(1)中,得
x=r1+m1k1+p⋅m1m2/gcd(m1,m2)
,
即
x=x0+p⋅lcm(m1,m2)......(5)
也就是
x≡x0(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.同余方程组(中国剩余定理)互质版
x≡ri(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;
}
同余方程组求解

404

被折叠的 条评论
为什么被折叠?



