关注我的公众号c137Lab获取更多相关内容
同余式的定义与性质
整除性是数论的有利工具。下面介绍一种同余式理论,可以简便的表达整除性质。
如果 m m m 整除 a − b a-b a−b 那么定义: a a a 与 b b b 模 m m m 同余,记为
a ≡ b ( m o d m ) a\equiv b(\ mod\ m) a≡b( mod m)
特别的,如果 a a a 除以 m m m 得余数 r r r ,则 a a a 与 r r r 模 m m m 同余。余数满足 0 ≤ r < m 0\leq r<m 0≤r<m ,故每个整数必与 [ 0 , m − 1 ] [0,m-1] [0,m−1] 之间的一个数模 m m m 同余
具有相同模的同余式满足加法和乘法 :
a 1 ≡ b 1 ( m o d m ) , a 2 ≡ b 2 ( m o d m ) a_1\equiv b_1(\ mod\ m),\quad a_2\equiv b_2(\ mod\ m) a1≡b1( mod m),a2≡b2( mod m)
则:
a 1 + a 2 ≡ b 1 + b 2 ( m o d m ) , a 1 a 2 ≡ b 1 b 2 ( m o d m ) a_1+a_2\equiv b_1+b_2(\ mod\ m),\quad a_1a_2\equiv b_1b_2(\ mod\ m) a1+a2≡b1+b2( mod m),a1a2≡b1b2( mod m)
但是如果 a c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) ac≡bc( mod m) ,则 a ≡ b ( m o d m ) a\equiv b(\ mod\ m) a≡b( mod m) 未必成立。而且可能有 u v ≡ 0 ( m o d m ) uv\equiv 0(\ mod\ m) uv≡0( mod m) 但 u ≢ 0 ( m o d m ) , v ≢ 0 ( m o d m ) u\not\equiv0(\ mod\ m),v\not\equiv0(\ mod\ m) u≡0( mod m),v≡0( mod m) .但是,如果 g c d ( c , m ) = 1 gcd(c,m)=1 gcd(c,m)=1,则可以从 a c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) ac≡bc( mod m) 两端消去 c c c 。
证明:若 g c d ( c , m ) = 1 gcd(c,m)=1 gcd(c,m)=1 则 可以从 a c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) ac≡bc( mod m) 两端消去 c c c
由于
m ∣ ( a c − b c ) m\mid(ac-bc) m∣(ac−bc)m ∣ c ( a − b ) m\mid c(a-b) m∣c(a−b)
又因为 g c d ( c , m ) = 1 gcd(c,m)=1 gcd(c,m)=1 ,则根据线性方程定理:
m x + c y = 1 mx+cy=1 mx+cy=1
必有整数解,方程两边同乘 ( a − b ) (a-b) (a−b)
m ( a − b ) x + c ( a − b ) y = ( a − b ) m(a-b)x+c(a-b)y=(a-b) m(a−b)x+c(a−b)y=(a−b)
有整数解。显然 m ∣ m ( a − b x ) , m ∣ c ( a − b ) y m\mid m(a-bx),m\mid c(a-b)y m∣m(a−bx),m∣c(a−b)y ,则:
m ∣ ( a − b ) m\mid (a-b) m∣(a−b)根据同余式的定义,有:
a = b ( m o d m ) a=b(\ mod\ m) a=b( mod m)
同余式方程、线性同余式定理
现有方程:
a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) ax≡c( mod m)
应该如何求得其解呢?
该方程可以表示为:
m ∣ a x − c m\mid ax-c m∣ax−c
即存在 y y y 使得 a x − c = m y ax-c=my ax−c=my,即:
a x − m y = c ax-my=c ax−my=c
这就将这一同余式方程转化为线性方程了,则该同余式方程有解的条件可以根据线性方程定理得出:
假设 g = g c d ( a , m ) g=gcd(a,m) g=gcd(a,m), 当 g ∣ c g\mid c g∣c 时,该方程有解。当方程有解时,使用欧几里得算法可以求出 方程 a u + m v = g au+mv=g au+mv=g 的一组解 u = u 0 , v = v o u=u_0, v=v_o u=u0,v=vo.由于此时 g ∣ c g\mid c g∣c ,方程两边同乘 c / g c/g c/g 得:
a c u 0 g + m c v 0 g = c a\frac{cu_0}g+m\frac{cv_0}g=c agcu0+mgcv0=c
即: x 0 ≡ c u 0 g ( m o d m ) x_0\equiv\frac{cu_0}g(\ mod\ m) x0≡gcu0( mod m) 是同余式方程 a x ≡ c ( m o d m ) ax\equiv c(\ mod \ m) ax≡c( mod m) 的解。
这样,就求出了同余式方程的一个解,但是同余式方程往往不止一个解。假设 x 1 x_1 x1 是方程的另一个解,则 a x 1 ≡ a x 0 ( m o d m ) ax_1\equiv ax_0(\ mod\ m) ax1≡ax0( mod m) ,所以 m m m 整除 a x 1 − a x 0 ax_1-ax_0 ax1−ax0 则:
m g ∣ a ( x 1 − x 0 ) g \frac m g \mid \frac{a(x_1-x_0)}g gm∣ga(x1−x0)
已知 g c d ( m / g , a / g ) = 1 gcd(m/g,a/g)=1 gcd(m/g,a/g)=1 ,故 m / g ∣ ( x 1 − x 0 ) m/g\mid(x_1-x_0) m/g∣(x1−x0) ,则存在整数 k k k 使:
x 1 = x 0 + k m g x_1=x_0+k\frac m g x1=x0+kgm
上式中由 m m m 的倍数所得的任何两个不同解被视为相同解。则正好有 g 个不同解,在 k = 0 , 0 , … , g − 1 k=0,0,\dots,g-1 k=0,0,…,g−1 处取得。
将结果总结成定理,就得到了线性同余式定理:
线性同余式定理 :设 a , c , m a,c,m a,c,m 是整数, m > 1 m>1 m>1 且设 g = g c d ( a , m ) g=gcd(a,m) g=gcd(a,m)
如果 g ∤ c g\nmid c g∤c 则同余式 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) ax≡c( mod m) 无解
如果 g ∣ c g\mid c g∣c 则同余式 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) ax≡c( mod m) 有 g g g 个不同解
要求方程的解,首先使用线性方程定理求 a u + m v = g au+mv=g au+mv=g 的一个解 ( u 0 , v 0 ) (u_0,v_0) (u0,v0) 则 x 0 = c u 0 / g x_0=cu_0/g x0=cu0/g 是 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) ax≡c( mod m) 的一个解。
不同余的完全集由
x ≡ x 0 + k m g , k = 0 , 1 , … , g − 1 x\equiv x_0+k\frac m g,\quad k=0,1,\dots,g-1 x≡x0+kgm,k=0,1,…,g−1
给出。
重要 :线性同余式定理最重要的情形是 g c d ( a , m ) = 1 gcd(a,m)=1 gcd(a,m)=1 此时同余式方程只有一个解。我们将其写成分数:
x ≡ c a ( m o d m ) x\equiv \frac c a(\ mod\ m) x≡ac( mod m)
线性同余式定理的编程实现
def linear_equ(a, b):
if a == 0 or b == 0:
return -1
else:
g, w = a, b
x, v = 1, 0
while w != 0:
t = g % w
s = x - (g // w) * v
x, g = v, w
v, w = s, t
y = (g - a * x) // b
return g, x, y
def linear_congruence(a, c, m):
g, u, v = linear_equ(a, m)
print(g)
if c % g == 0:
x0 = [c * u // g]
for k in range(g - 1):
x0.append(x0[0] + k * m // g)
return x0
else:
return -1
a = int(input())
c = int(input())
m = int(input())
print(linear_congruence(a, c, m))
参考文献:A Brief Introduction to Number Theory --Joseph H.Silverman