对于中国剩余定理,博主看过很多人的文章,但认为他们讲的过于生疏,希望我能讲的更明白,通俗些,全文无代码嵌入,通俗理论。
引子:
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”
题意为:求一个数x,使x除以3余2,除以5余3,除以7余2.
这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。分三步:
1.求出3和5的最小公倍数且15,求出5和7的最小公倍数35,求出3和7的最小公倍数21;
2.找出一个最小数使其除以7余2且为15的倍数 30
找出一个最小数使其除以5余3且为21的倍数 63
找出一个最小数使其除以3余2且为35的倍数 140
三者相加得:30+63+140=233
3.3,5,7的最小公倍数为105,让233除以105取它的余数 得 23
经验证发现,23确实满足条件,为最小的数!
我们在惊叹古人智慧的同时,也在好奇这其中蕴藏着怎样的奥秘,我们一探究竟。
再开始正解前,需要了解两个基本定理:
如果有a%b=c,则有(a+或-k∗b)%b=c k为非零整数 ——————1式
翻译:如果一个除法运算的余数为c,那么被除数与k倍的除数相加(或相减)的和(差)再与除数相除,余数不变。
如果a%b=c,那么(a∗k)%b=a%b+a%b+…+a%b=c+c+…+c=k∗c(k>0) ——————2式
翻译:如果一个除法的余数为c,那么被除数的k倍与除数相除的余数为k∗c。展开式中已证明。实际上,公式2也能用公式1推导出来
正解
首先设n1除以3余2,设n2除以5余3,设n3除以7余2;
n1 为 3∗k+2(k>=0) n2为 5∗k+3(k>=0) n3 为 7∗k+2(k>=0)
假设n1+n2的和同样除以3余2,那么由公式1得 n2相当于 kb,b已知为3,k为常数,则n2为3的倍数。同理若要n1+n2+n3为3的倍数,则n3也必须是3的倍数,在这里我们以n1为中心来讨论的。
对于以n2,n3的讨论同上,读者请自行思考,综上可以得出:
- 为使n1+n2+n3的和满足除以3余2,n2和n3必须是3的倍数。
- 为使n1+n2+n3的和满足除以5余3,n1和n3必须是5的倍数。
- 为使n1+n2+n3的和满足除以7余2,n1和n2必须是7的倍数。
综上题目要求和讨论结果,又可以得出:
- n1必须除以3余2,且必须是5和7的公倍数。
- n2必须除以5余3,且必须是3和7的公倍数。
- n3必须除以7余2,且必须是3和5的公倍数。
再看看上面《孙子算经》的一道题,本质是从5和7的公倍数中找一个除以3余2的数n1,从3和7的公倍数中找一个除以5余3的数n2,从3和5的公倍数中找一个除以7余2的数n3,再将三个数相加得到解。真聪明,古人的奥妙已被破解。
在这里有一个小技巧,例如在从5和7的公倍数中直接找一个除以3余2的数的过程中,我们可以先找除以3余1的数,找到之后再乘以二。为什么?请看公式2,看不懂就废了。
注意:
这里求出的n1+n2+n3不一定是最小的数,比如还是上面这道题,和为233,满足但不是最小,那怎么求最小呢?
还是请看公式,1,这里我们把除数当做105,那么减去两个105,余数根据公式1也不变吧,所以233-210得23,自此,题目真正理解解决
应用:
题意:
人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。
分析:
首先我们要知道,任意两个峰值之间一定相距整数倍的周期。假设一年的第N天达到峰值,则下次达到峰值的时间为N+Tk(T是周期,k是任意正整数)。所以,三个峰值同时出现的那一天(S)应满足
S=N1+T1∗k1=N2+T2∗k2=N3+T3∗k3
N1,N2,N3分别为为体力,情感,智力出现峰值的日期, T1,T2,分别为体力,情感,智力周期。 我们需要求出k1,k2,k3三个非负整数使上面的等式成立。
想直接求出k1,k2,k3貌似很难,但是我们的目的是求出S, 可以考虑从结果逆推。根据上面的等式,S满足三个要求:除以T1余数为N1,除以T2余数为N2,除以T3余数为N3。这样我们就把问题转化为求一个最小数,该数除以T1余N1,除以T2余N2,除以T3余N3。这就是著名的中国剩余定理,我们的老祖宗在几千年前已经对这个问题想出了一个精妙的解法。依据此解法的算法,时间复杂度可达到O(1)。
END~~~
希望大家能够理解,若是竞赛生就好好参加竞赛,静下心来学习,不负自己........
其他博主的笔记分享: