一道初等数论题
问题
解一次同余方程
(1)
3
x
≡
5
(
m
o
d
7
)
3x\equiv 5\,(\mod 7)
3x≡5(mod7) (2)
103
x
≡
57
(
m
o
d
211
)
103x\equiv 57\,(\mod 211)
103x≡57(mod211)
解答
问题一是十分简单的因为显然 3 x ≡ 12 ≡ 5 ( m o d 7 ) 3x\equiv12\equiv5\,(\mod 7) 3x≡12≡5(mod7),而 ( 3 , 7 ) = 1 (3,7)=1 (3,7)=1,所以可以除去3,即 x ≡ 4 ( m o d 7 ) x\equiv 4(\mod 7) x≡4(mod7).
而问题二就比问题一稍稍棘手.因为首先211和103都是比较大的质数,所以利用欧拉定理将其化为首1的方程是不现实的.那么我们当然考虑和问题一一样,通过将余数加上模数进行等价变形(即更换代表元)来将其化为首1的方程.可惜的是,这个数不是特别好找的.我们可以看以下的寻找过程
⋮
(
103
,
57
+
3
×
211
)
=
(
103
,
690
)
=
1
(
103
,
57
+
2
×
211
)
=
(
103
,
479
)
=
1
(
103
,
57
+
1
×
211
)
=
(
103
,
268
)
=
1
(
103
,
57
+
0
×
211
)
=
(
103
,
57
)
=
1
(
103
,
57
−
1
×
211
)
=
(
103
,
−
154
)
=
1
(
103
,
57
−
2
×
211
)
=
(
103
,
−
365
)
=
1
(
103
,
57
−
3
×
211
)
=
(
103
,
−
576
)
=
1
⋮
\begin{array}{ccccc} &\vdots\\ (103,57+3\times211) &=& (103,690) &=& 1\\ (103,57+2\times211) &=& (103,479) &=& 1\\ (103,57+1\times211) &=& (103,268) &=& 1\\ (103,57+0\times211) &=& (103,57) &=& 1\\ (103,57-1\times211) &=& (103,-154) &=& 1\\ (103,57-2\times211) &=& (103,-365) &=& 1\\ (103,57-3\times211) &=& (103,-576) &=& 1\\ &\vdots \end{array}
(103,57+3×211)(103,57+2×211)(103,57+1×211)(103,57+0×211)(103,57−1×211)(103,57−2×211)(103,57−3×211)⋮=======⋮(103,690)(103,479)(103,268)(103,57)(103,−154)(103,−365)(103,−576)=======1111111
可以发现直接寻找是比较困难的,所以我们不妨使用带余除法来寻找代表元.即考虑方程
103
∣
57
+
211
a
′
103\mid 57 + 211a'
103∣57+211a′,或者将其写成
57
+
211
a
′
=
103
b
′
,
a
′
,
b
′
∈
Z
(1)
57+211a' = 103b',a',b'\in\mathbb{Z}\tag{1}
57+211a′=103b′,a′,b′∈Z(1)
这其实是一个一次不定方程,我们将其写成标准形式
211
a
+
103
b
=
57
,
a
,
b
∈
Z
211a+103b=57,a,b\in\mathbb{Z}
211a+103b=57,a,b∈Z
由于
(
211
,
103
)
=
1
∣
57
(211,103)=1\mid57
(211,103)=1∣57,利用带余除法可以解出
a
,
b
a,b
a,b
211
=
103
×
2
+
5
103
=
5
×
20
+
3
5
=
3
×
1
+
2
3
=
2
×
1
+
1
\begin{array}{ccccccc} 211&=&103&\times&2&+&5\\ 103&=&5&\times&20&+&3\\ 5&=&3&\times&1&+&2\\ 3&=&2&\times&1&+&1 \end{array}
21110353====103532××××22011++++5321
从下往上回代可得到
a
=
−
41
×
57
=
−
2366
,
b
=
84
×
57
=
4788
a=-41\times57=-2366,b=84\times57=4788
a=−41×57=−2366,b=84×57=4788.
4788就是我们要找的一个代表元,所以,
x
≡
4788
≡
146
(
m
o
d
211
)
(2)
x\equiv4788\equiv146(\mod 211) \tag{2}
x≡4788≡146(mod211)(2)
从另一个角度看,如果将
(
1
)
(1)
(1)式写成
103
x
=
211
q
+
57
,
x
,
q
∈
Z
103x = 211q + 57,x,q\in\mathbb{Z}
103x=211q+57,x,q∈Z
那么我们可以将此法更直接地理解为用定义改写
103
x
≡
57
(
m
o
d
211
)
103x\equiv 57\,(\mod 211)
103x≡57(mod211),然后利用带余除法求解.利用一次不定方程的解法可得到其所有解
{
x
=
4788
+
211
t
q
=
−
2366
+
103
t
,
t
∈
Z
(3)
\left\{ \begin{array}{l} x = 4788 + 211t\tag{3}\\ q = -2366 + 103t \end{array} \right. ,t\in\mathbb{Z}
{x=4788+211tq=−2366+103t,t∈Z(3)
事实上
(
3
)
(3)
(3)中
x
x
x的表达式与
(
2
)
(2)
(2)是等价的.
暴力点的话…
能暴力解决的事,为什么要动脑子呢? ——我说的
其实这题完全可以编程暴力解决【滑稽】.显然在 [ 1 , 211 ] [1,211] [1,211]上必有一整数满足方程,所以我们的循环甚至都不需要写成定数的,直接让循环指标从1开始自增就行.
Talk is cheap, show me the code.
#include <stdio.h>
int main(){
int i = 0;
int state = 1;
while(state){
i += 1;
if((103*i)%211==57) state = 0;
}
printf("%d", i);
}
输出为
146
整挺好,跟我算出来的一样.