孙子定理
摘自:百度百科
目录
定义
解释
解法
数学公式
中国剩余定理
案例
展开
编辑本段
定义
中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国剩余定理。
内容
编辑本段
解释
三数为a b c余数分别为 m1 m2 m3,%为求余计算,&&意为“且”
1、分别找出能被两个数整除,而满足被第三个整除余一的最小的数。
k1%b==k1%c==0 && k1%a==1;
k2%a==k2%c==0 && k2%b==1;
k3%a==k3%b==0 && k3%c==1;
2、将三个未知数乘对应数字的余数再加起来,减去这三个数的最小公倍数的整数倍即得结果。
Answer = k1*m1 + k2*m2 + k3*m3 - P*(a*b*c);
P为满足Answer > 0的最大整数;
或者 Answer = (k1*m1 + k2*m2 + k3*m3)%(a*b*c) ;
证明
令T1=k1*m1,T2=k2*m2,T3=k3*m3;
因为 k1%a==1 ;所以 T1%a==m1;
对于 a,已知: T2%a==0,T3%a==0,T1%a==m1;
所以: Answer%a==m1;
因为:T1%b==0,T3%b==0,T2%b==m2 => Answer%b==m2
同理:Answer%c==m3;
又因为 a*b*c能同时整除 a b c,所以Answer ± P*(a*b*c)也是题目的解;
所以Answer是题目的解,又Answer = Answer % (a*b*c),所以Answer为最小解.
额外的解释
k1*m1实际上是找 一个T1 : T1%b==T1%c==0 && T1%a==m1;
证明里也可以推论出只要找到符合要求的T1 T2 T3即可;
孙子老祖的做法是先找 k1 再将 k1*m1;
所以他原题的解里出现的是70,然后乘以 2得到140,而实际上算的时候我们发现5*7得到的35已经可以
用来解题:35+63+30=128-105=23; 即35已经是符合条件的T1
那么,为什么老祖要用70捏?
答案是:规格化。
解一题不算什么,能解一类题才是能力。老祖反正是具有了解这一类题的能力,然后他把算法规格化,
以便后人使用。碰到这个刚好符合要求的35纯属运气~
如果不规定先找个除第三个数余1的k,那方法就要改为:取b c的公约数 t,如果 t%a==m1,取t,否则一直
将t 加上b c的公约数直到 t%a==m1; 你说这是何必呢~
学了算法的人就会知道,老祖的解法是优化了的。
原文(取自楼下中国剩余定理)
《孙子算经》中的题目:有物不知其数,三个一数余二,五个一数余三,七个一数又余二,问该物总数几何?
《孙子算经》中的解法:三三数之,取数七十,与余数二相乘;五五数之,取数二十一,与余数三相乘;七七数之,取数十五,与余数二相乘。将诸乘积相加,然后减去一百零五的倍数。
编辑本段
解法
解法中的三个关键数70,21,15,有何妙用,有何性质呢?首先70是3除余1而5与7都除得尽的数,所以70a是3除余a,而5与7都除得尽的数,21是5除余1,而3与7都除得尽的数,所以21b是5除余b,而3与7除得尽的数。同理,15c是7除余c,3与5除得尽的数,总加起来 70a+21b+15c 是3除余a,5除余b ,7除余c的数,也就是可能答案之一,但可能不是最小的,这数加减105(105=3*5*7)仍有这样性质,可以多次减去105而得到最小的正数解。
附:如70,其实是要找余2的,但只要找到了余1的再乘2即余二了。
孙子问题的解法,以现代的说法,是找出三个关键数70,21,15。解法的意思就是用70乘3除所得的余数,21乘5除所得的余数,15乘7除所得的余数,然后总加起来,除以105的余数就是答案。
即题目的答案为 70×2+21×3+15×2
=140+63+30
=233
233-2×105=23
公式:70a+21b+15c-105n
题中有三个数,分别为3、5、7,5*7/3余数为2,取35;3*7/5余数为1,要使余数为3,只需将3*7扩大3倍变成63即可;同样3*5/7的余数为1,要使余数为2,则将3*5扩大2倍,变成30。
编辑本段
数学公式
(中国剩余定理CRT)设m1,m2,...,mk是两两互素的正整数,即gcd(mi,mj) =1,i≠j,i,j = 1,2,...,k
则同余方程组:
x≡b1 (mod m1)
x≡b2 (mod m2)
...
x≡bk (mod mk)
模[m1,m2,...,mk]有唯一解,即在[m1,m2,...,mk]的意义下,存在唯一的x,满足:
x≡bi mod [m1,m2,...,mk],i = 1,2,...,k
编辑本段
中国剩余定理
在中国古代劳动人民中,长期流传着“隔墙算”、“剪管术”、“秦王暗点兵”等数学游戏。有一首“孙子歌”,甚至远渡重洋,输入日本:
“三人同行七十稀,五树梅花廿一枝,
七子团圆正半月,除百零五便得知。”
这些饶有趣味的数学游戏,以各种不同形式,介绍世界闻名的“孙子问题”的解法,通俗地反映了中国古代数学一项卓越的成就。“孙子问题”在现代数论中是一个一次同余问题,它最早出现在中国公元四世纪的数学著作《孙子算经》中。《孙子算经》卷下“物不知数”题说:有物不知其数,三个一数余二,五个一数余三,七个一数又余二,问该物总数几何?显然,这相当于求不定方程组
N=3x+2,N=5y+3,N=7z+2
的正整数解N,或用现代数论符号表示,等价干解下列的一次同余组。
《孙子算经》所给答案是N=23。由于孙子问题数据比较简单,这个答数通过试算也可以得到。但是《孙子算经》并不是这样做的。“物不知数”题的术文指出解题的方法多三三数之,取数七十,与余数二相乘;五五数之,取数二十一,与余数三相乘;七七数之,取数十五,与余数二相乘。将诸乘积相加,然后减去一百零五的倍数。列成算式就是:
N=70×2+21×3+15×2-2×105。
这里105是模数3、5、7的最小公倍数,容易看出,《孙子算经》给出的是符合条件的最小正整数。对于一般余数的情形,《孙子算经》术文指出,只要把上述算法中的余数2、3、2分别换成新的余数就行了。以R1、R2、R3表示这些余数,那么《孙子算经》相当于给出公式
N=70×R1+21×R2+15×R3-P×105(p是整数)。
孙子算法的关键,在于70、21和15这三个数的确定。后来流传的《孙子歌》中所说“七十稀”、“廿一枝”和“正半月”,就是暗指这三个关键的数字。《孙子算经》没有说明这三个数的来历。实际上,它们具有如下特性:
也就是说,这三个数可以从最小公倍数M=3×5×7=105中各约去模数3、5、7后,再分别乘以整数2、1、1而得到。假令k1=2,K2=1,K3=1,那么整数Ki(i=1,2,3)的选取使所得到的三数70、21、15被相应模数相除的时候余数都是1。由此出发,立即可以推出,在余数是R1、R2、R3的情况下的情况。
应用上述推理,可以完全类似地把孙子算法推广到一般情形:设有一数N,分别被两两互素的几个数a1、a2、……an相除得余数R1、R2、……Rn,即
N≡Ri(mod ai)(i=1、2、……n),
只需求出一组数K,使满足
1(mod ai)(i=1、2、……n),
那么适合已给一次同余组的最小正数解是
(P是整数,M=a1×a2×……×an),
这就是现代数论中著名的剩余定理。如上所说,它的基本形式已经包含在《孙子算经》“物不知数”题的解法之中。不过《孙子算经》没有明确地表述这个一般的定理。
孙子问题出现在公元四世纪的中国算书中,这并不是偶然的。中国古代天文历法资料表明,一次同余问题的研究,明显地受到天文、历法需要的推动,特别是和古代历法中所谓“上元积年”的计算密切相关。大家知道,一部历法,需要规定一个起算时间,中国古代历算家把这个起点叫做“历元”或“上元”,并且把从历元到编历年所累积的时间叫做“上元积年”。上元积年的推算需要求解一组一次同余式。以公元三世纪三国时期魏国施行的《景初历》做例,这部历法规定以冬至、朔旦(朔日子夜)和甲子日零时会合的时刻作为历元。设a是一回归年日数,b是一朔望月日数,当年冬至距甲子日零时是R1日,离平朔时刻是R2日,那么《景初历》上元积元数N就是同余组的解。
aN≡Ri(mod 60)≡R2(mod b)
到了南北朝时期,祖冲之《大明历》(公元462年)更要求历元必须同时是甲子年的开始,而且“日月合璧”、“五星联珠”(就是日、月、五大行星处在同一方位),月亮又恰好行经它的近地点和升交点。这样的条件下推算上元积年,就相当于要求解十个同余式了。天文历法数据一般又都十分庞杂,所以,在《孙子算经》成书前后的魏晋南北朝时期,中国的天文历算家无疑已经能够求解形式比《孙子算经》“物不知数”题复杂得多的一次同余式,因而必定掌握了按一定程序计算一次同余式的方法。《孙子算经》比例题的形式总结、反映了这一事实。以后天文历算家长期沿用孙子算法推算上元积年,这中间肯定会引起更加深入的探讨。到公元十三世纪,大数学家秦九韶集前法之大成,终于在一次同余式的研究上获得了超越前人的辉煌成果。
秦九韶,字道古,生活于南宋时期,自幼喜好数学,经过长期积累和苦心钻研,干公元1247年写成《数书九章》。这部中世纪的数学杰作,在许多方面都有创造,其中求解一次同余组的“大衍求一术”和求高次方程数值解的“正负开方术”,更是具有世界意义的成就。
这里主要介绍秦九韶对一次同余论的伟大贡献。
秦九韶在《数书九章》中明确地系统地叙述了求解一次同余组
的一般计算步骤。秦的方法,正是前述的剩余定理。我们知道,剩余定理把一般的一次同余问题归结为满足条件的一组数Ki,的选定。秦九韶给这些数起名叫“乘率”,并且在《数书九章》卷一“大衍总术”中详载了计算乘率的方法——“大衍求一术”。
为了介绍“大衍求一术”,我们以任一乘率ki的计算作例。如果Gi=>ai,秦九韶首先令ai除Gi,求得余数giGi≡gi(mod ai), 于是 kiGi≡Kigi(mod ai), 但是因为 kiGi≡1(mod ai), 所以问题归结为求ki使适合kigi≡1(mod ai)。秦九韶把ai叫“定数”,gi叫“奇数”,他的“大衍求一术”,用现代语言解释,实际就是把奇数gi和定数ai辗转相除,相继得商数q1、q2、……qn和余数r1、r2、……rn,在辗转相除的时候,随即算出下面右列的c值: 秦九韶指出,当rn=1而n是偶数的时候,最后得到的cn就是所求乘率ki。如果rn=1而n是奇数,那么把rn-1和rn相除,形式上令qn+1=rn-1-1,那么余数rn+1仍旧是1,再作cn+1=qn+1cn+cn-1,qn+1=rn-1-1是偶数,cn+1就是所求的ki。不论哪种情形,最后一步都出现余数1,整个计算到此终止,秦九韶因此把他的方法叫做“求一术”(至于“大衍”的意思,秦九韶本人在《数书九章》序中把它和《周易》“大衍之数”相附会)。可以证明,秦九韶这一算法是完全正。所有这些系统的理论,周密的考虑,即使以今天的眼光看来也很不简单,充分显示了秦九韶高超的数学水平和计算技巧。秦九韶小时曾跟随他父亲到南宋京城杭州,向太史局(主管天确,十分严密的。 在秦九韶那个时代,计算仍然使用算筹。秦九韶在一个小方盘上,右上布置奇数g,右下布置定数a,左上置1(他叫它做“天元1”),然后在右行上下交互以少除多,所得商数和左上(或下)相乘并入左下(或上),直到右上方出现1为止。下页就是秦九韶的一般筹算图式,右边是一个数字例子(g=20,a=27,K=C4=23)。 秦九韶在《数书九章》中采集了大量例题,如“古历会积”、“积尺寻源”、“推计土功”、“程行计地”等等,广泛应用大衍求一术来解决历法、工程、赋役和军旅等实际问题。在这些实际问题中,模数ai并不总是两两互素的整数。秦九韶区分了“元数”(ai是整数)、“收数”(ai是小数)、“通数”(ai是分数)等不同情形,并且对每种情形给出了处理方法。“大衍总术”把“收数”和“通数”化成“元数”的情形来计算,而对于元数不两两互素的情形,给出了可靠的程序,适当选取那些元数的因子作定数而把问题归结为两两互素的情形 文历法的机构)的官员学习天文历法,“大衍求一术”很可能就是他总结天文历法计算上元积年方法的结果。但是“大衍求一术”似乎没有为他同时代的人所充分理解。明中叶以后几乎失传。一直到清代,“大衍求一术”又重新被发掘出来,引起了许多学者(张敦仁、李锐、骆腾凤、黄宗宪等)的兴趣。他们对“大衍求一术”进行了解释、改进和简化,其中黄宗宪《求一术通解》对模数非两两互素的情形给出了更加简明的方法,但是时代已是晚清。 从《孙子算经》“物不知数”题到秦九韶的“大衍求一术”,中国古代数学家对一次同余式的研究,不仅在中国数学史上而且在世界数学史上占有光荣的地位。在欧洲,最早接触一次同余式的,是和秦九韶同时代的意大利数学家裴波那契(1170—1250),他在《算法之书》中给出了两个一次同余问题,但是没有一般的算法。这两个问题从形式到数据都和孙子物不知数题相仿,整个水平没有超过《孙子算经》。直到十八、十九世纪,大数学家欧拉(1707—1783)于公元1743年、高斯(1777—1855)于公元1801年对一般一次同余式进行了详细研究,才重新获得和秦九韶“大衍求一术”相同的定理,并且对模数两两互素的情形给出了严格证明。欧拉和高斯事先并不知道中国人的工作。公元1852年英国传教士伟烈亚力(1815—1887)发表《中国科学摘记》,介绍了《孙子算经》物不知数题和秦九韶的解法,引起了欧洲学者的重视。1876年,德国马蒂生(1830—1906)首先指出孙子问题的解法和高斯方法一致,当时德国著名数学史家康托(1829—1920)看到马蒂生的文章以后,高度评价了“大衍术”,并且称赞发现这一方法的中国数学家是“最幸运的天才”。直到今天,“大衍求一术”仍然引起西方数学史家浓厚的研究兴趣。如1973年,美国出版的一部数学史专著《十三世纪的中国数学》中,系统介绍了中国学者在一次同余论方面的成就,作者力勃雷希(比利时人)在评论秦九韶的贡献的时候说道:“秦九韶在不定分析方面的著作时代颇早,考虑到这一点,我们就会看到,萨顿称秦九韶为‘他那个民族、他那个时代、并且确实也是所有时代最伟大的数学家之一’,是毫不夸张的。”
印度学者对一次同余论也有过重要贡献。从公元六世纪到十二世纪,他们发展了一种称为“库塔卡”的算法,用来求解和一次同余式等价的不定方程组。“库塔卡”法出现在孙子算法之后,印度数学家婆罗门复多(七世纪)、摩柯吠罗(九世纪)等人的著作中,都有和物不知数题相同的一次同余问题。这当然不是要借此断言“库塔卡”法一定受到了孙子算法的影响,但是有人(如万海依等)硬说中自的“大衍求一术”来源于“库塔卡”,就是毫无根据的妄说了。万海依居然把中国算法中数码从左到右横写作为“大衍术”受印度影响的重要根据。大家知道,中国古代至迟从春秋战国时期就开始使用算筹记数,我们今天还可以从现存的公元前三世纪的货币上看到这种从左到右的记数方法。由此可见,万海依的论点多么荒唐可笑。中国古代数学家对一次同余论的研究有明显的独创性和继承性,“大衍求一术”在世界数学史上的崇高地位是毋容置疑的,正因为这样,在西方数学史著作中,一直公正地称求解一次同余组的剩余定理为“中国剩余定理”。
编辑本段
案例
中国剩余定理”算理及其应用:
为什么这样解呢?因为70是5和7的公倍数,且除以3余1。21是3和7的公倍数,且除以5余1。15是3和5的公倍数,且除以7余1。(任何一个一次同余式组,只要根据这个规律求出那几个关键数字,那么这个一次同余式组就不难解出了。)把70、21、15这三个数分别乘以它们的余数,再把三个积加起来是233,符合题意,但不是最小,而105又是3、5、7的最小公倍数,去掉105的倍数,剩下的差就是最小的一个答案。用歌诀解题容易记忆,但有它的局限性,只能限于用3、5、7三个数去除,用其它的数去除就不行了。后来中国数学家又研究了这个问题,运用了像上面分析的方法那样进行解答。
例1:一个数被3除余1,被4除余2,被5除余4,这个数最小是几?题中3、4、5三个数两两互质。则〔4,5〕=20;〔3,5〕=15;〔3,4〕=12;〔3,4,5〕=60。为了使20被3除余1,用20×2=40;使15被4除余1,用15×3=45;使12被5除余1,用12×3=36。然后,40×1+45×2+36×4=274,因为,274>60,所以,274-60×4=34,就是所求的数。
例2:一个数被3除余2,被7除余4,被8除余5,这个数最小是几?题中3、7、8三个数两两互质。则〔7,8〕=56;〔3,8〕=24;〔3,7〕=21;〔3,7,8〕=168。为了使56被3除余1,用56×2=112;使24被7除余1,用24×5=120。使21被8除余1,用21×5=105;然后,112×2+120×4+105×5=1229,因为,1229>168,所以,1229-168×7=53,就是所求的数。
例3:一个数除以5余4,除以8余3,除以11余2,求满足条件的最小的自然数。题中5、8、11三个数两两互质。则〔8,11〕=88;〔5,11〕=55;〔5,8〕=40;〔5,8,11〕=440。为了使88被5除余1,用88×2=176;使55被8除余1,用55×7=385;使40被11除余1,用40×8=320。然后,176×4+385×3+320×2=2499,因为,2499>440,所以,2499-440×5=299,就是所求的数。
例4:有一个年级的同学,每9人一排多5人,每7人一排多1人,每5人一排多2人,问这个年级至少有多少人 ?(幸福123老师问的题目)题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使35被9除余1,用35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然后,280×5+225×1+126×2=1877,因为,1877>315,所以,1877-315×5=302,就是所求的数。
例5:有一个年级的同学,每9人一排多6人,每7人一排多2人,每5人一排多3人,问这个年级至少有多少人 ? 题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使35被9除余1,用35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然后,280×6+225×2+126×3=2508,因为,2508>315,所以,2508-315×7=303,就是所求的数。(例5与例4的除数相同,那么各个余数要乘的“数”也分别相同,所不同的就是最后两步。)
关于“中国剩余定理”类型题目的另外解法“中国剩余定理”解的题目其实就是“余数问题”,这种题目,也可以用倍数和余数的方法解决。不懂论坛上有没人发过。小学奥赛考试时学习过,也用过,现在把方法写出来,如果懂的也别笑我,呵呵。例一,一个数被5除余2,被6除少2,被7除少3,这个数最小是多少?解法:题目可以看成,被5除余2,被6除余4,被7除余4。看到那个“被6除余4,被7除余4”了么,有同余数的话,只要求出6和7的最小公倍数,再加上4,就是满足后面条件的数了,6X7+4=46。下面一步试下46能不能满足第一个条件“一个数被5除余2”。不行的话,只要再46加上6和7的最小公倍数42,一直加到能满足“一个数被5除余2”。这步的原因是,42是6和7的最小公倍数,再怎么加都会满足“被6除余4,被7除余4”的条件。46+42=8846+42+42=13046+42+42+42=172这是一种形式的,它的前提是条件中出现同余数的情况,如果遇到没有的,下面讲例二,一个班学生分组做游戏,如果每组三人就多两人,每组五人就多三人,每组七人就多四人,问这个班有多少学生?解法:题目可以看成,除3余2,除5余3,除7余4。没有同余的情况,用的方法是“逐步约束法”,就是从“除7余4的数”中找出符合“除5余3的数”,就是再7上一直加4,直到所得的数除5余3。得出数为18,下面只要在18上一直加7和5得最小公倍数35,直到满足“除3余2”4+7=1111+7=1818+35=53这种方法也可以解“中国剩余定理”解的题目。比“中国剩余定理”更好理解,我觉的速度上会比那个繁琐的公式化的解题更快。大家可以试下. 所以:一共有5个 187 367 547 727 907
此题的初等解法
四川省三台县工商局王志成的初等解法,简单、方便、可以永远的延续下去。
条件1、三三数之余二 ,条件2、五五数之余三 ,条件3、七七数之余二,条件4、十一十一数之余七,条件5、十三十三数之余五,条件6、十七十七数之余七,
1、满足条件1为等差数列:3N+2。
2、将等差列3N+2取5项有:2,5,8,11,14,必然有一项满足条件2,五五数之余三,结果为8,同时满足条件1和2的为等差数列:15N+8。
3、将等差列15N+8取7项有:8,23,38,53,68,83,98,必然有一项满足条件3,七七数之余二,结果为23,同时满足条件1,2,3的为等差数列:23+ 105N。
4、将等差列23+ 105N取11项有:23,128,233,338,443,548,653,758,863,968,1073,必然有一项满足条件4,十一十一数之余七,结果为128,同时满足条件1,2,3,4的为等差数列:128+1155N。
5、将等差列128+1155N取13项有:128,1283,2438,3593,4748,5903,7058,8213,9368,10523,11678,12833,13988,必然有一项满足条件5,十三十三数之余五,结果为3593,同时满足条件1,2,3,4,5的为等差数列:3593+15015N。
6、将等差列3593+15015N N取17项有:3593,18608,33623,48638,63653,78668,93683,108698,123713,138728,153743,168758,183773,198788,213803,228818,243833,必然有一项满足条件6,十七十七数之余七,结果为198788,同时满足条件1,2,3,4,5,6的为等差数列:198788+255255N。
数列化简
当等差数列的首项及公差较大时,对于求任何素因子的余数,都可以先进行化简计算。
如在该问题增加十九十九数余5,如果对198788+255255N取19项再寻找每一项的余数,用笔算是相当的不方便,我们用首项和公差分别除以19的余数,得新的等差数列:10+9N,取19项有:10,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172。各项再除以19得余数分别为:10,0,9,18,8,17,7,16,6,15,5,14,4,13,3,12,2,11,1。因该数列第11项除以19余5。
即原数列的第11项除以19必然余5,198788+255255*(11-1)=2751338,得等差数列2751338+4849845N为同时满足上面七个条件的数。
如何判别错题?
在计算余数问题上,很容易出现错题,正确的题有解,错误的题是无解的。什么是错题?题意自相矛盾的题是错题。判断标准:一个数除以一个素因子只有一个余数;除以合数时,要看它与合数的素因子的余数是否有矛盾。
1、素因子的重复。即M/A余C,式中的M与A都是固定的,那么,余数C只能有一个。除以同一个素因子可以在题中出现多次,但余数必须相同,否则,就是错题。如,除以3余1,除以5余2,除以7余3,除以3余2,问该数为多少?这里的除以3余1与除以3余2自相矛盾,为错题。
2、单个素因子组成的合数。如,除以3余1,除以5余2,除以7余3,除以9余8,问该数为多少?因为,9是由素因子3组成的,既然前面明示除以3余1,那么,这里的除以9必须服从该条件。因8/3余2与除以3余1矛盾,该题为错题。满足除以3余1的在9之内只有1+3N为:除9余1,余4,余7。除以9余2,3,5,6,8,0都属于错题。
3、多个素因子组成的合数。如,除以3余1,除以5余2,除以7余3,除以15余8,问该数为多少?因为,这里的除以15余8,8/3余2与前面的除以3余1矛盾,8/5余3与前面的除以5余2矛盾,该题为错题。同时满足除以3余1,除以5余2有:7+15N,即除以15只能余7,对于除以15余0,1,2,3,4,5,6,8,9,10,11,12,13,14都属于错题。除以多个素因子组成的合数时,必须与题中所出现的素因子不产生矛盾,不产生矛盾的标准是除以多个素因子组成的合数,必须是同时满足题中所出现(合数所包含的)的素因子的数。
扩展阅读: