中国剩余定理即孙子定理的五种解法
(2013-10-05 12:29:36)
标签:
教育 |
X≡2
X≡3
X≡2
X÷3=A…2
X÷5=B…3
X÷7=C…2,
一、枚举法
二、解不定方程法
三、逐级满足法
四、化为相同除数的同余式法、
五、才用到典经的、不同除数的同余式组解法
试解下列同余方程
X≡2
X≡5
X≡1
X≡2
X≡5
X≡1
代入各式,计算各式的X,当三个X相同时,就是一个解。
X=7A+2
X=9B+5
X=5C+1
A
3
12
21
…
可见,只能取A=12 、B=9
X=7A+2=7*12+2=86
X=9B+5=9*9+5=86
X=5C+1=5*17+1=86
得 X=86、通解为X=86+315K得X=86、通解为X=86+315K。实际上,这仍然是枚举法,只是枚举个数减少一些而已。
三
这个方法的基本思路是:先解算出合符第一个方程的X1。再解算出合符第一、第二个方程的X2,令X2=X1+P1。关键是P1要保持第一个方程中的倍数要求,又要合符第二个方程中的剩余要求。再解算出合符第一、第二、第三个方程的X3,令X3=X2+P2,关键是P2要保持第一第二两个方程中的倍数要求,又要合符第三个方程中的剩余要求。这样逐级解算,满足全部条件。
P要同时考虑两个方程的倍数关系如7A、9B,又要考虑两个余数关系,如余2、余5,方程数一多,处理时要拐几个弯,方法不易理解。
最近,我在作《数论—余数习题集》时,对“逐级满足法”作了改进。把第一个方程的通解,直接作为第二个方程的初值,不作任何转弯,就同时解决了两个方程之间的相关关系及余数关系,变得容易理解,容易操作、便于列式。这可以说是我的又一个心得罢。
仍按原例: X除以7余2、除以9余5、除以5余1,求最小X。
答:最小X=86
X≡2
X≡5
X≡1
A、B、C都是整数,可用K统一表示,且不论其具体数值。
解算步骤:
1、 先解第一个方程X÷7余2的通解X1。一般都很容易,即:
通解X1=余数+除数的倍数,例中X1=2+7A 。其中余数就是最小解X0=2,加上7的最小公倍数的A倍,就是通解X1=2+7A 。
X1是一个数列,其中总有一个数能满足所有方程,关键在于A是多少,又怎样定?A怎样定呢?现在不能定。因为要考虑到它能满足第二个方程,所以到那时才能定下来。
2、第二个方程。X÷9余5,此时的X首先应满足本方程要求:
(X-5)÷9
= K
注意,(X1-5)÷9 =K这种形式的方程,是有规律的,即:
(第一方程的通解X1(=2+7A
)
减
且以下各方程也都是这样的规律,亦即:
( 上一个方程的通解 减 本方程的余数 )÷本方程的除数 应 = 整数K
现在有了 (2+7A-5)÷9 =K ,就整理为(7A-3)÷9 = K。这时两个余数就自动合并了。
于是
X2也是一个数列,其中总有一个数,能满足所有方程,所以就是下一个方程的未知数初值了。关键在于M是多少。M怎样定呢?现在不能定。要考虑到它能满足第三个方程。到那时才能定下来。
至此,得到一个同余式
X≡2
X≡5
至于用什么方法来解
(7A-3)÷9
= K
A
得A=3、K=2 。其实K仅起检验作用,是整数就行了,没有其他用处。
解二元一次不定方程最好的方法,当然是编个电脑程序。我已经编就了,请用吧
3、第三个方程。X÷5余1,此时X首先应满足本方程要求:
(X-1)÷5
= K,又要满足第一、第二个方程。既然X2可以满足所有方程,所以就干脆用第二方程的通解X2代替第三方程的未知数X
(X2-1)÷5 = (23+63M -1)÷5=K,→ (63M+22)÷5 = K。才顾及了三个方程。
解此二元不定方程 M=1 、 K=17。把M代入X2,
于是
即X3=86。再加上63与5的最小公倍数63×5=315的倍数,得通解
X3=86+315P。(P=1、2、3 … )
验算
86÷5=17
*
“逐级满足法”解法有规律了,容易操作了。但也有两点麻烦:
1、组成形如 (AX±B)÷C=K的不定方程,要一个个顺序进行,虽有规律,但还是比较麻烦。
2、解算(AX±B)÷C=K方程,求待定量X、K,无论用手算,或是电子表格算,要解(N-1)次。也很烦人,特别是大数相除更麻烦。
为了加快计算,我编了一个VB程序,不用烦心,输入完数据,↙,就出结果了。
上述算题:
输入方程个数N =
3
输入各方程的除数与余数
结果为:
通解 X =86+ 315 N ( N=1、2、3 … )
还有一例:我曾靠电子表格算了一天,才得结果的,现在包括输入在内,仅15秒就搞定。
输入方程个数N =
6
输入各方程的除数与余数
结果为:
通解 X =20183+ 60060N ( N=1、2、3 … )
中国剩余定理即孙子定理 “逐级满足法”VB程序
Private Sub
Form_Click()
Form1.Width =
11520
Form1.Height =
15360
Dim
W(20)
Dim
R(20)
Dim
G(20)
Dim
F(20)
Dim
Y(20)
N = InputBox ("输入方程个数 N =")
For I = 1 To N
R(I) = InputBox ("输入余R(I)=")
S=1
For I = 1 To N
G(I)=S
Next I
F(1) =
R(1)
Y(1) = R(1)
For I = 2
B=F(I)
C= W(I)
Print Spc(4); "
ABC=
For X = 1 To 1000000
If P = 0 Then GoTo
SS
Next X
SS:
Print Spc(4); " X =";
X
Y(I)=
Y(I-1)+X*
G(I-1)
Print Spc(4); "
最小";
Y(I)
Print Spc(4); "
公倍
=";
G(I)
Next I
Print Spc(4); " 通解 X = "; Y(N); " + "; G(N); " N ( N=1、2、3 … )"
Print Spc(4); " 完"
End Sub
四
X≡2
X≡5
X≡1
这三个同余式,除数不同,分别为7、9、5,为了能利用同余式的和差特性,简化计算,先设法使它们的除数相同,为此:
X≡2
X≡5
X≡1
根据同余式的加减性质,(1)+(2)+(3)得:
143 X≡328
143 X÷315=K
…13
(143X-13)÷315=K(整数)用通式表示为
通解为
或
这一种算法,在所有五种算法中,我认为是最简洁、工作量最小的算法。因为不管方程有多少个,它解算形如(AX-B)÷S=K这种不定方程,仅解一次而已。而其他方法要解多次。同时,这种算法也容易理解,算法单纯。
我编了一个程序。这个程序,非但可以解算互质的同余方程组,还可以解算非互质的同余方程组。如果方程组不合解题条件,会显示“无解”。操作方法是:
输入方程个数N=3
再按方程顺序,输入每个方程的除数与余数
:7
就得结果:
K=38
成功
广义同余方程组的“除数相同法”Visual
Basic
Private Sub Form_Click(): Form1.Width = 11520: Form1.Height = 15360
Dim W(20)
: Dim R(20) :
N =
InputBox("输入方程个数 N
=")
For I = 1
To N : W(I) = InputBox("输入模W(I)=") : R(I) =
InputBox("输入余R(I)=") :
For I = 1
To N: Print Spc(4); "
For I = 1
To N : V(I) = W(I) :
For I = 1 To N - 1
If m1 > n1 Then
M = m1: G = n1
Else
M = n1: G = m1
End If
Do
E = M Mod G
If E = 0 Then Exit Do
M = G
G = E
Loop
S = m1 * n1 / G
Next I
A = 0 :
For I = 1 To N : Y(I) = S / W(I) : A = A + Y(I) : Next I
B = 0
For I = 1 To N : F(I) = R(I) * Y(I) : B = B + F(I) : Next I
Print
Spc(4); " 同余式 "; A;
"
SP = 1
For I = 1
To N : SP = SP * W(I) :
If (S = SP) Then GoTo S1
If (S <> SP) Then Print Spc(4); " 注意 非互质 ": Print: GoTo PP
S1:
For k = 1 To 10000000
If (X - Int(X)) = 0 Then GoTo S2
Next k
S2:
If k = 10000001 Then Print Spc(4); " 无解 ": GoTo ZZ
Print Spc(4); " k = "; k; " 通解 X = "; X; " + "; S; " N ": GoTo ZZ
PP:
For k = 1 To 10000
If (X - Int(X)) <> 0 Then GoTo H1
For J = 1 To N
C = (X - R(J)) / W(J)
If (C - Int(C)) <> 0 Then GoTo H1
Next J
Print Spc(4); " k = "; k; " 通解 X = "; X; " + "; S; " N ": GoTo ZZ
H1:
Next k
Print Spc(4); "无解 "
ZZ:
Print Spc(4); " 完 "
End Sub
例一
程序运行后,显示“ 输入方程个数 N = ” 、“输入模W(I)=”、“输入余R(I)” 等,即顺次输入: 2、 33、
电脑运算后显示:
X
X
同余式
注意 非互质
K =
9
例二
电脑运算后显示:
X÷
5余
X÷
7余
X÷13余
X÷31余17
同余式
k=1477
分析:上面4个同余式是互质的,所以没有显示 注意 非互质 ,直接算得结果。
例三
电脑运算后显示:
X÷
X÷ 21余 16
同余式
注意 非互质
K
=2
分析:2个同余式,不互质。又因7与21有公约7,余数差16-2=14,7|14,所以有解。
例四: 输入
电脑运算后显示:
X÷
11余
X÷
5余
X÷35余
同余式
注意 非互质
K =
96
分析:后两个同余式不互质但有解。又与第一个同余式互质,应有解。
例五
电脑运算后显示:
X÷
X÷
21余
同余式
注意 非互质
无解
五
X≡R1
X≡R2
X≡R3
名词注释及计算步骤:
1
2
3
4
5
衍数Y*乘率C≡1
计算C1方法。由Y1C1≡1
同余式 i |
|
乘率C |
余1 |
模m |
|
|
|
|
|
|
(45*C-1)/7 =N |
|
|
|
|
|
(35*C-1)/9 =N |
|
|
|
|
|
(63*C-1)/5 =N
|
最终结果,X≡R1Y1C
1+R2Y2C2+R3Y3C3
即X≡Σ余数*衍数*乘率 (mod G),见下表计算:
i |
余数R |
衍数Y |
乘率C |
R*Y*C |
1 |
2 |
45 |
5 |
|
2 |
5 |
35 |
8 |
1400 |
3 |
1 |
63 |
2 |
|
|
|
|
Σ |
1976 |
X≡1976
1976 除去315的6倍后,剩下86,最终,X≡86
“大衍求一术”的关键与难点,是如何解“衍数Y*乘率C≡1
2015-11-21补充:
X≡R1
X≡R2
X≡R3
→
→
→
我在2013年10月发表的博文《中国剩余定理即孙子定理的五种解法》,距今两年,阅读者6900多位。感到很欣慰。
今天编了一个解算中国剩余定理的Visual Basic程序,供朋友们共享。解算太快了,真过瘾。例子仍用原博文的:
A≡2
A≡5
A≡1
操作。
输入方程个数
输入模(除数
马上显示
又陈景润
A≡1
输入方程个数
输入模(除数
马上显示
中国剩余定理“大衍求一术” Visual Basic程序
Private Sub
Form_Click()
Form1.Width =
11520
Form1.Height =
15360
N =
InputBox("输入方程个数
Dim B (20)
Dim R (20)
Dim Y (20)
Dim C (20)
R(I) =
InputBox("输入余R(I)=")
For I = 1 To N
Next I
If (Z - Int(Z)) = 0 Then
C(I) = J: GoTo SS
Next J
SS:
Next I
For I = 1 To N
Next I
If A < M Then GoTo PP
Next I
PP:
End Sub
去吧,与爱好算术的网友们共享去吧。
六
1
第一,它要使除数相同,方法最简单、统一,初中二年级学生都会。
第二,它解算不定方程“(AX+B)÷C=
K”
只解一次,也即只“凑”一次。而“逐级满足法”和“大衍求一术”,则要“凑”多次 (N次,即方程的个数)。方程个数越多,“化为相同除数法”就越显得省力。我认为应该宣传、普及一下通俗易懂的“化为相同除数”。
3
七
2013年的国庆过得很忙,甚至还起了一个早床来计算。感谢我的老伴,以她的勤劳与宽容,给了我闲暇与自由,使我能够静心地做做算术、写写文章,自得其乐,有时间消磨我的时光。
2015年11月,我在作《数论—余数习题集》时,对“逐级满足法”作了改进。对“大衍求一术”作了认真学习,进而对“化为相同除数法”作了规范化计算,还编了相应的三个Visual Basic 程序。我高兴的把我的“发现”与神速的计算告诉我老伴。老伴点赞说,脑筋还没有老化呢。我报以-个开心的微笑,间接的感谢她为我洗衣做饭,使我安心计算、写作。
我仰望深邃的数学天空,深感自己的渺小。我浅尝一滴数学的清泉,来润湿一下我干枯的灵感。