中国剩余定理简介
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(mod3=2),五五数之剩三(mod5=3),七七数之剩二(mod7=2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。
具体解法分下面三步:
1、找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
2、用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加15∗2+21∗3+70∗215∗2+21∗3+70∗2得到和233。
3、用233除以3、5、7的最小公倍数105,得到余数23,这个余数23就是符合条件的最小数。
很神奇,是吧?我们逐步剖析。
我们第一目标是求一个数n符合条件,而不需最小。
我们先假设n1是满足mod3=2的任意一个数,n2是满足mod5=3的任意一个数,n1是满足mod7=2的任意一个数。如果想要(n1+n2)也mod3=2,n2必须是3的倍数(易证)。如果想要(n1+n2+n3)也mod3=2,n3也得是3的倍数。归纳得要想(n1+n2+n3)同时满足mod3=2,mod5=3,mod7=2,必须有:
- n1mod3=2 && 5|n1 && 7|n1
- n2mod5=3 && 3|n2 && 7|n2
- n3mod7=5 && 3|n3 && 5|n3
于是只需要在5,7的倍数中找一个mod3=2的作为n1,在3,7的倍数中找一个mod5=3的作为n2,在3,5的倍数中找一个mod7=2的作为n3即可。解决这个小问题孙子又用了一个小技巧。就是不是先找mod3=2的,而是先找mod3=1的再把它乘2自然它就mod3=2了。其他两个同理。问题转为:如何在a,b的倍数当中找到一个modp=1的数。
事实上,这个问题是很好解决的。由逆元的性质得a·inv(a)=1(modp),因此令r=a·b,r·inv(r)就是一个满足要求的数,因为它是a,b的倍数,而且r·inv(r)=1(modp)
逆元的常见求法为①费马小定理:(mod p,p必须是质数) inv(n)=pow(n,p-2)%p②由于n·inv(n)=1(mod p)⇒n·inv(n)+p·k=1(k为一参量),由exgcd解得inv(n),p不需要是质数
在多数题目中并未限定p为质数因此求解中国剩余定理问题时必须使用②求逆元
这解决了“找一个”的问题,但没有解决“最小”。其实很好解决,因为你看lcm(b1,b2,...,bn)其实大于它的其实就相当于从头开始数了,以前数的不会影响余数的,所以把“找到的”模上lcm就得到“最小的”。
将以上解法推广到n个余数问题,事实上就是求解一个同余方程组(\(\forall i\ne j,\gcd(b_i,b_j)=1\)):
而它的解法就是:
- 求出 \(M=\prod_{i=1}^n b_i\),记\(M_i=\frac{M}{b_i}\)
- 将\(ans+=M_i\times inv(M_i)\times a_i\),\(ans\%=lcm(b)\)
https://www.luogu.com.cn/problem/P3868
【注】使用exCRT 可以解决所有CRT问题。