您的位置:首页 > 其它

线性同余方程初步应用分析

2015-06-05 10:16 246 查看

一元线性同余方程

定义: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: