[关闭]
@ysner 2018-07-22T22:06:00.000000Z 字数 1587 阅读 2860

关于同余方程解法

数论


单个同余方程

求解形如的最小正整数解。

  1. il void exgcd(re ll A,re ll B,re ll &D,re ll &x,re ll &y)
  2. {
  3. if(!B) x=1,y=0,D=A;
  4. else exgcd(B,A%B,D,y,x,c),y-=(A/B)*x;
  5. }
  6. il void solve2()
  7. {
  8. re ll A=atk[1],B=a[1],M=p[1],D,x,y,ysn,zsy;
  9. exgcd(A,M,D,x,y);//D=gcd(A,M)
  10. if(B%D) {puts("-1");return;}
  11. x=x*(B/D)%(M/D);
  12. printf("%lld\n",x);
  13. }

解释一下:


(正负号不重要)
于是就是解这个不定方程。

根据斐蜀定理:
所以必须,否则无解。

,所以此时
时,设
根据欧几里德原理,则


对应得

于是我们就可以一边求一边解这个方程。
当然,注意到跑了后解出来的是
解同时乘上即可。
注意到的解不止一个,后总是合法。(因为加减的都是)。
为了求最小正整数值,我们模这个值即可。

如果要把最后一步套路化,就是

模数互质的同余方程组

中国剩余定理(孙子定理)解决。
讲这玩意儿需要栗子。
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以),五五数之剩三(除以),七七数之剩二(除以),问物几何?”

首先,我们假设是满足除以的一个数。同样,我们假设是满足除以的一个数,是满足除以的一个数。

现在把作为该问题最终解。
则依“两数相加则模数相加”:

所以,孙子问题解法的本质是对每一个方程,从其它所有模数公倍数中找出符合该方程的解,最终解就是这些解相加

在求时又用了一个小技巧,以为例,并非从的公倍数中直接找一个除以的数,而是先找一个除以的数,再乘以。也就是找解时先求出公倍数模数下的逆元,再用逆元去乘余数。

找逆元和解单个同余方程一样。

模数不互质的同余方程

拓展中国剩余定理解决。
还是栗子。
有一同余方程组:(注意到没有系数



发现右边两个表达式相等可以看做一个方程
显然可以拓欧求解

又由斐蜀定理可知,
所以
代入即可得出特解
如果解出特解,则

这个方程的解就是整个方程组的解。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注