加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]中国剩余定理“大衍求一术”手算方法及四个习题

(2019-12-27 12:42:00)
标签:

转载

分类: 余一好奇收藏馆
                                       中国剩余定理“大衍求一术”手算方法及四个习题
                                                                                                                       2016-01-24  佛山下雪

今天广东佛山下雪。有一些雪花还真有点像鹅毛。这是我退休后移居广东20年来,第一次看到的景像。

                                                              一     中国剩余定理解题过程
 
    “中国剩余定理”是公元5-6世纪、我国南北朝时期的一部著名算术著作《孙子算经》中的一个“物不知数”的解法问题:
    今有物,不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
    答曰:二十三。
    术曰:「三三数之剩二,置一百四十,五五数之剩三,置六十三,七七数之剩二,置三十,并之,得二百三十三,以二百一十减之,即得。凡三三数之剩一,则置七十,五五数之剩一,则置二十一,七七数之剩一,则置十五,即得。」

用现代数学表示,即:
X≡R1  (mod  m1 )         X≡2  (mod  3 )
X≡R2  (mod  m2)    →   X≡3  (mod  5 )
X≡R3  (mod  m3)         X≡2  (mod  7 )    求物数X
计算步骤及名词注释如下:
1  余数R : 例中 R1=2、R2=3、R3=2
2  模,亦即除数m :例中 m1=3、m2=5、m3=7
3  模的最小公倍数G :G =m1×m2×m3,例中 G =3×5×7=105
4  衍数(局部公倍数)y :Y1=m2m3、Y2=m1m3,Y3=m1m2,例中Y1=5×7=35、Y2=3×7=21、Y3=3×5=15
5  计算乘率C :这是解算中国剩余定理的关键。计算“乘率”的方法,我认为在《孙子算经》年代就已经知道了,只是书上没有详细说明而己。否则怎么会有“三三数之剩二,置一百四十 … 凡三三数之剩一,则置七十 … ”等语呢?因为140=70×2,而2就是“乘率”。到了南宋,秦九韶才在《数书九章》一书中写出计算方法,称之为“大衍求一术”。
“求一”就是使 (衍数Y×乘率C) -模m×商N=余数1。以同余式表示为 :
衍数Y×乘率C≡1  (mod  m)。
例中 35C1≡1  (mod  3 ) 、 21C2≡1  (mod  5 ) 、15C3≡1  (mod  7 )。
已知Y、m、1,求C。经计算得C1=2、C2=1 、C3=1。求C的细节,见下面四个习题。
上述各项计算结果见下表:
 
同余式 i 衍数Y 乘率C 余数R 模m        检验  (Y C - 1)/ m = 整数N
   1            35            2             2            3       (35×C-1)/3 =N  (35×2-1)/3 = 21
   2           21            1             3            5       (21×C-1)/5 =N  (21×1-1)/5 = 4
   3           15            1            2            7       (15×C-1)/7 =N  (15×1-1)/7 = 2
    为什么先要算余数为 1 时的乘率C呢?
    原来,解题的最终目的是要解算余数为R的同余式Y×X≡R  (mod  m),求出X。但必须先算得Y×C≡1  (mod  m) 后,再两边各乘R,得:
    Y×C×R≡1×R  (mod  m)  → X≡R  (mod  m) → 才得到X=Y×C×R
   这是一个方程的情况。对于多个方程则有:
6 最终:X≡Y1C 1 R1+Y2C2 R2+Y3C3 R3  (mod G) 。见下表 :
                 同余式i 衍数Y 乘率C 余数R            Y×C× R
                    1           35             2             2           35*2*2 = 70*2 = 140
                    2           21             1             3           21*1*3 = 21*3 =   63
                    3           15             1             2           15*1*2 = 15*2 =   30
                                                                                      Σ      233

    X≡233 (mod 105)。X超过模m,不行。于是233 减去105的2倍后,剩下23,即
    233-2×105=233-210=23。
    最终,X≡23  (mod 105)
    这样,《孙子算经》中的一百四十、六十三、三十、二百三十三、二百一十、剩一、七十、二十一、十五、二十三, 每个数的来历,都得到了落实。

    传统的“大衍求一术”是不是就是这样计算“乘率C”的呢?似乎看不到这方面的文章。我买不到《算书九章》,对“求一术”这个谜解不了。但又想,即使看了《算书九章》,也肯定看不懂。于是去查百度、搜狗,结果只是见到各种赞叹,却见不到具体的计算方法,令人失望。这样空乏的议论,不看也罢。
最近,倒在网页上看到一篇博文,介绍清代黄宗宪的《求一术通解》里求乘率的方法,大喜,以为可以见到真传了。看其运算过程,有“辗转相除”的影子,但怎样得到最终结果的,还是讲得不细、不具体,我还是看不懂。
好在现代数学著作中,有二个方法可以求“乘率C”。但是否就是原汁原味的“大衍求一术”法,
我则不知道。这二个方法是:
     1、解算二元一次不定方程 (丢番图方程) 的“欧拉方法”。
    2、陈景润所著《初等数论Ⅰ》中,一次同余式的解法。但他没有定一个名称。我根据其解算过程,称它为“辗转相除的逆向追求法”。
    我就做了一些习题,练习一下“大衍求一术”的手算方法。

                             二    习题1  “物不知数”中  35C≡1 (mod 3 ) 的乘率C=2是怎样来的?

    注:这个解算过程,《初等数论Ⅰ》中省略了。

                                                                                1   欧拉方法

    欧拉法的主要特点是:各种分式 ( 分子∕分母),如 (2C-1)∕3、(T1+1)∕2等等,其结果一定要是整数的,并以整数表示,如T1=(2C-1)∕3、T2=(T1+1)∕2 。

         计算过程                                           说                    
1、35C≡1  (mod  3)      设商为Y,就等价于:35C=3Y+1,或35C-3Y=1
2、35C-3Y=1            实际上是一个二元一次不定方程。下面是解算C:
3、C=(3Y+1)∕35         凡分子中Y的系数(3),小于分母(35),就要改化这个等式,倒过来:
4、Y=(35C-1)∕3        现在分子上C的系数 (35),大于分母 (3),可以了。
5、Y=(35C-1)∕3=11C+(2C-1)∕3=11C+T1  〔其中(2C-1)∕3=T1 ,要求T1是整数〕
6、T1=(2C-1)∕3        分子上C的系数(2) 小于分母(3),要倒过来。  
7、C=(3T1+1)∕2=T1+(T1+1)∕2=T1+T2    〔其中 (T1+1)∕2 =T2 ,要求T2是整数〕
8、T2=(T1+1)∕2         当分子中T1的系数为1时,才停止展开,得:
9、T1=2T2-1            此时得整数了。下面是回代求C、Y。
T1代入7式的C:
10、C=T1+T2=2T2-1 +T2=3T2-1 
代入5式的Y:
11、Y=11C+T1=11(3T2-1)+2T2-1=35T2-12
最后:C= 3 T2-1
Y =35T2-12
当T2=0时,C=-1、Y=-12    负数,不取
当T2=1时,C=  2、Y= 23     取最小正整数。
检验: 35C=3Y+1 → 35×2=3×23+1  70=69+1  正确
最后得   C=2
衍数35的乘率C=2,就是这样来的。

                                                          2  “辗转相除的逆向追求法”

35 C≡1  (mod  3 ) ,是一次同余式 (35与3互质),它等价于二元一次不定方程:
35 C-3Y=1 ,现在求C、Y的最小解。而C正是“大衍求一术”中的乘率。

第一步 辗转相除:辗转相除的起算数为35与3 。
被除数=除数×商+余数
35= 3×11 +2    …  (1)
3= 2× 1 +1    …  (2)
由35 经辗转相除,最终得余数1。以下便逆向回代。由1开始,反求被除数35的乘率C与商Y。

第二步 清理一下余数3、1的表达式:
余数=被除数-除数×商
由(2)式得  1=3-2
由(1)式得  2= 35-3×11

第三步 逆向回代,把各余数的表达式代入,使最后的等式中只保留被除数35、除数3,形式为:
 1 =35×(?)-3×(??)。(?)就是C 、(??)就是Y了。
1 =3-2     保留3,把余数2的表达式2=(35-3×11 )代入:
=3 - (35-3×11)= 35×(-1)+3×12 → 35×(-1)-3×(-12),等式中只有被除数35与除数3,没有余数,就完成逆算。
对比     35 C-3 Y=1 
与     35×(-1)-3×(-12)=1
可见 C=-1 ,Y=-12,与“欧拉方法”的结果相同。
C=-1为负数,不取,加最小公倍数3,得C=2
衍数35的乘率C=2,就是这样来的。
其他21C2≡1  (mod  5 ) 的解C2=1及15C3≡1  (mod  7 ) 的解C3=1 ,也是同样方法。

    特别要说明一点的是:不要以为C是靠凑,凑出来的。用C=1、2、3 … 一次次凑呗。以
35C≡1 (mod 3 ) 、21C2≡1 (mod 5 ) 及15C3≡1 (mod 7 )为例,的确可以凑出C=2、1、1,倒也不难。我以前也是这样想的。但靠凑,没有理据。碰到C很大,不知凑到何时。于是我才想到编程,其实编程方法也是凑,不过因为速度太快,也就使我乐于此道。但如果停留在此步,学识似乎不够。于是我又刻苦一下,终于基本上弄懂了手算的方法。

                                         三   习题2     45C≡1  (mod  7 )  求C     答:C=5

                                                                   1  欧拉方法

       计 算 过 程                     说                          
1、45C≡1  (mod  7 )      设商为Y,等价于:45C-7Y=1
2、45C-7Y=1            实际上是一个二元一次不定方程:得C:
3、C=(7Y+1)∕45         凡分子中Y的系数 (7),小于分母(45),就要改化这个等式,倒过来:
4、Y=(45C-1)∕7        现在分子上C的系数(45),大于分母(7),可以了。
5、Y=(45C-1)∕7=6C+(3C-1)∕7=6C+T1  〔其中 (3C-1)∕7 =T1 ,要求T1是整数〕
6、T1=(3C-1)∕7        分子上C的系数3小于分母(7),要倒过来  
7、C=(7T1+1)∕3=2T1+(T1+1)∕3=2T1+T2  〔其中 (T1+1)∕3 =T2 ,要求T2是整数〕
8、T2=(T1+1)∕3        当分子中T1的系数为1时,才停止展开,得
9、T1=3T2-1           此时得整数。下面是回代求C、Y。
T1代入7式C:
C=2T1+T2  得C=2(3T2-1)+T2=6T2-2+T2=7T2-2
代入5式Y,Y=6C+T1=6(7T2-2)+(3T2-1)=42T2-12+3T2-1=45T2-13

最后:C= 7T2-2
Y=45T2-13
当T2=0时,C=-2、Y=-13   负数,不取
当T2=1时,C=  5、Y=32     取最小正整数。
检验: 45C=7Y+1 → 45×5=7×32+1 →  225=224+1  正确。最后得 C=5 。

                                                             2   “辗转相除的逆向追求法”

45C-7Y=1 ,辗转相除的起算数为45与7 。
第一步 辗转相除:
被除数=除数×商+余数
45 = 7 ×6+ 3    …  (1)
7 = 3 ×2+ 1    …  (2)
由45 经辗转相除,最终得余数1。以下便逆向回代。由1开始,反求被除数45的乘率C与商Y。
第二步 清一下余数3、1的表达式:
余数=被除数-除数×商
由(2)式得  1=  7 - 3 ×2
由(1)式得  3= 45 - 7 ×6
第三步 逆向回代,把各余数的表达式代入,使最后的等式中只保留被除数45、除数7形式为:
 1 =45×(?)-7×(??)。(?)就是C、(??)就是Y。
1 =7 -3×2     保留7,把余数3的表达式3=(45-7×6) 代入:
=7 - (45-7×6)×2=7 - 45×2+7×12=45×(-2)+7×(13),等式中只有被除数45与除数7,没有余数了,就完成逆算。
对比     45 C-7 Y=1 
与 45×(-2)+7×(13) =1  →  45×(-2)-7×(-13) =1 ,
所以 C=-2 ,Y=-13,取最小正整数C=7-2=5,与“欧拉方法”的结果相同。可见“辗转相除的逆向追求法”也非常有效,步骤不多、计算简易、结果正确。陈景润在《初等数论Ⅰ》中的第59、61、81、82、83、125、133、134页多次用到这个方法。


                       四   习题3    25C≡1  (mod  18 ) 求C    答: C=13

                                                                              1   欧拉方法

     计  算  过  程                 
1、25C≡1  (mod 18)     
2、C=(18Y+1)∕25          
3、Y=(25C-1)∕18 =C+(7C-1)∕18=C+T1        
4、T1=(7C-1)∕18            
5、C=(18T1+1∕7=2T1+(4T1+1)∕7=2T1+T2  
6、T2=(4T1+1)∕7       
7、T1=(7T2-1)∕4=T2+(3T2-1)∕4=T2+T3  
8、T3=(3T2-1)∕2         
9、T2=(4T3+1)∕3=T3+(4T3+1)∕3= T3+(T3+1)∕3=T3+T4             
10、T4=(T3+1)∕3
11、T3=3T4+1
回代到9
T2=T3+T4 =3T4-1+T4=4T4-1 
回代到7
T1=T2+T3=4T4-1+3T4+1 =7T4-2
回代到5
C=2T1+T2=2(7T4-2)+4T4-1=14T4-4+4T4-1=18T4-5
回代到3
Y=C+T1 =18T4-5 +7T4-2==25T4-7

最后:C=18T4-5
Y =25T4-7
当T4=1时,C=13、Y=18    
最后:C=13

                                                     2   “辗转相除的逆向追求法”

25C≡1  (mod  18 )
25C-18Y =1
第一步 辗转相除:
被除数=除数×商+余数
25 =18×1+7   …  (1)
18 = 7×2+4    …  (2)
7 = 4×1+3      …  (3)
4 =3×1+1       …  (4)
第二步 清一下余数 1、3、4、7的表达式:
余数=被除数-除数×商
由(4)式得    1=( 4 - 3 )
由(3)式得    3=(7 - 4 )
由(2)式得    4=(18 - 7 ×2 )
由(1)式得    7=( 25 -18 )
第三步 逆向回代, 
1=4 - 3 ×1 =(18-7×2 )-(7-4 )=18-7×3+ (18-7×2 )
=18×2-7×5=18×2-( 25  -18)×5=-25×5+18×7
=25×(-5)-18×(-7)
与  25C-18Y =1 相对照,得 C=-5、
取正值,C=-5+18=13
   
                             五      习题4  71X≡58  (mod 105 )求X    答:C=71、X=23

    “大衍求一术”的目的,不单是为了求得余数为1时的解C,而是为了求得余数为R时的解X。
即:为了解算YX≡R  (mod  m) 得到X,要先解算YC≡1  (mod  m),再两边乘R,便得X=CR。
因此,要解71X≡58  (mod 105 )  求X,得先解71C≡1  (mod 105 ) ,求C。
现仅用“欧拉方法” 来求C 。

1、71C≡1  (mod  105)     
2、71C-105Y=1
3、C=(105Y+1)∕71=Y+(34Y+1)∕71=Y+T1          
4、T1=(34Y+1)∕71           
5、Y=(71T1-1)∕34=2T1+(3T1-1)∕34=2T1+T2  
6、T2=(3T1-1)∕34       
7、T1=(34T2+1)∕3=11T2+(T2+1)∕3=11T2+T3  
8、T3=(T2+1)∕3         
9、T2=3T3-1    
回代到7
T1=11T2+T3=11(3T3-1)  +T3=33T3-11 +T3=34 T3-11
回代到5
Y=2T1+T2=2 (34 T3-11)+3T3-1=68 T3-22+3T3-1=71 T3-23
回代到3
C=Y+T1 =71 T3-23+(34 T3-11) =105 T3-34
当T3=1时,C=71
再算 X
71C≡1  (mod  105) 两边乘上真正的余数58,得:
    71C×58≡1×58     (mod  105)
71×71×58≡1×58  (mod  105)
71×4118≡58  (mod  105)
对照  71X≡58  (mod 105 )
可见    X=4118
验算  71×4118=292378 、292378÷105=2784 … 58   正确。但4118不是最小值,它超过除数105,所以要减去105的39倍才成为最小值。4118-39×105=23 → 得 X=23
再验算  71×23=1633 、1633÷105=15 … 58正确
X通解为 X=23+105K  ( K=0、1、2、3、… )

    我另外还做了四五个习题,不再抄下了。做熟了,也就觉得并不难。年岁到79了,不怕罗梭,写点心得,算是留个纪录罢。


0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有