定义:a,b是整数,m是正整数,形如ax≡b(mod m),且x是未知整数的同余式称为一元线性同余方程。
定理:a,b,m是整数且m>0,gcd(a,m)=d,如果d|b,则方程恰有d个模m不同余的解,否则方程无解。
由同余方程式的定义可知:ax+my=b(y为整数),这个方程称为二元一次不定方程。
(1)解一元线性同余方程
设d=gcd(a,m),由定理可知若不满足d|b,那么方程无解,否则有:a=d×ao,m=d×mo;
那么方程变为:ao*x+mo*y=b/d;
由于此时gcd(ao,mo)=1,因此可以运用扩展欧几里得算法得出方程ao*x+mo*y=b/d的解x,虽然x不唯一,但是属于一个模m剩余系,由定理可知,共有d个模m剩余类满足方程,其代表元分别为:
x,x+mo,x+2*mo,...x+(d-1)*mo;
(2)一元线性同余方程求解代码实现
//扩展欧几里得算法 typedef long long LL; void exgcd(LL a,LL b,LL &d,LL &x,LL &y) { if(!b) { x=1,y=0,d=a; return ; } else { exgcd(b,a%b,d,x,y); LL temp=x; x=y; y=temp-(a/b)*y; } } //求方程的所有解 LL ans[maxn]; int solve(int a,int b,int m) { exgcd(a,m,d,x,y) if(b%d) return -1; //代表无解 x=x*(b/d)%m; for(int i=1;i<=d;i++) ans[i]=(x+(i-1)*m/d)%m; }
由上一讲我们知道,任何一元同余方程都可以变成若干个形如x≡b(mod m)的方程。对于模线性方程组,可以进行方程组合并,求出合并后的方程的解,这样就可以很快推出方程的最终解,不管这样的方程有多少个,都可以两两解决,求得方程组的最终解,我们拿两个方程构成的方程组为例来讲:
x≡b1(mod m1).......(1)
x≡b2(mod m2).......(2)
令m=lcm(m1,m2)。首先,此方程有解的充分必要条件是gcd(m1,m2)|(b1-b2),此方程仅有一个小于m的非负整数解,利用扩展欧几里得短发可以很容易解出来:
式(1)等价于 x=b1+m1*y1;
式(2)等价于 x=b2+m2*y2;
联立可得:b1+m1*y1=b2+m2*y2==>m2*y2-m1*y1=b1-b2
用解一元线性同余方程的方法,可以求出次方程的解y2,因此小于m的非负整数解即为(b2+m2*y2)%m。
假设同余方程组为:
x≡r1(mod a1)
x≡r2(mod a2)
x≡r3(mod a3)
...
x≡rn(mod an)
下面给出求此方程组小于m的非负整数解的代码:
typedef long long LL; LL a,b,c,d,a1,r1,a2,r2; int solve(int n) {//函数返回值即为方程的解,若方程无解,则返回-1 bool ifhave=1; scanf("%lld%lld",&a1,&r1); for(int i=1;i<n;i++) { scanf("%lld%lld",&a2,&r2); a=a1,b=a2,c=r2-r1; exgcd(a,b,d,x0,y0); if(c%d) ifhave=0; LL t=b/d; x0=(x0*(c/d)%t+t)%t; r1=a1*x0+r1; a1=a1*(a2/d); } if(!ifhave) r1=-1; return r1; }
多元线性同余方程
定义:形如a1x1+a2x2+...+anxn+b≡0(mod m)的同余方程称为多元线性同余方程。
定理:多元线性同余方程a1x1+a2x2+...+anxn+b≡0(mod m)有解的充分必要条件是:
gcd(a1,a2,...,an,m)| b.若方程有解,则解(模m的剩余类)的个数为m^(n-1) ×gcd(a1,a2...,an,m).
解多元线性同余方程:令d=gcd(a1,a2,...,an,m),d1=gcd(a1,a2,...,a(n-1),m),那么gcd(d1,an)=d,由方程可知:anxn+b≡0(mod d1).
这样,我们就把方程分成两部分:
(1)a1x1+a2x2+...+a(n-1)x(n-1)+b1d1≡0(mod m),其中(b1d1=anxn+b);
(2)anxn+b≡0(mod d1).
方程成立当且仅当(1),(2)都满足,所以能够求得方程的解。
例题:
http://poj.org/problem?id=2891
http://poj.org/problem?id=2115
http://acm.hdu.edu.cn/showproblem.php?pid=1573
http://acm.hdu.edu.cn/showproblem.php?pid=3579