關注我的公衆號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 ( m o d 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)
a 1 ≡ b 1 ( m o d m ) , a 2 ≡ b 2 ( m o d 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)
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 c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) a c ≡ b c ( m o d m ) ,則 a ≡ b ( m o d m ) a\equiv b(\ mod\ m) a ≡ b ( m o d m ) 未必成立。而且可能有 u v ≡ 0 ( m o d m ) uv\equiv 0(\ mod\ m) u v ≡ 0 ( m o d 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 ( m o d m ) , v ≡ 0 ( m o d m ) .但是,如果 g c d ( c , m ) = 1 gcd(c,m)=1 g c d ( c , m ) = 1 ,則可以從a c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) a c ≡ b c ( m o d m ) 兩端消去 c c c 。
證明:若 g c d ( c , m ) = 1 gcd(c,m)=1 g c d ( c , m ) = 1 則 可以從a c ≡ b c ( m o d m ) ac\equiv bc(\ mod\ m) a c ≡ b c ( m o d m ) 兩端消去 c c c
由於
m ∣ ( a c − b c )
m\mid(ac-bc)
m ∣ ( a c − b c )
m ∣ c ( a − b )
m\mid c(a-b)
m ∣ c ( a − b )
又因爲 g c d ( c , m ) = 1 gcd(c,m)=1 g c d ( c , m ) = 1 ,則根據線性方程定理:
m x + c y = 1
mx+cy=1
m x + c y = 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 − b x ) , 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 ( m o d m )
同餘式方程、線性同餘式定理
現有方程:
a x ≡ c ( m o d m )
ax\equiv c(\ mod\ m)
a x ≡ c ( m o d m )
應該如何求得其解呢?
該方程可以表示爲:
m ∣ a x − c
m\mid ax-c
m ∣ a x − c
即存在 y y y 使得 a x − c = m y ax-c=my a x − c = m y ,即:
a x − m y = c
ax-my=c
a x − m y = c
這就將這一同餘式方程轉化爲線性方程了,則該同餘式方程有解的條件可以根據線性方程定理得出:
假設 g = g c d ( a , m ) g=gcd(a,m) g = g c d ( a , m ) , 當 g ∣ c g\mid c g ∣ c 時,該方程有解。當方程有解時,使用歐幾里得算法可以求出 方程 a u + m v = g au+mv=g a u + m v = g 的一組解 u = u 0 , v = v o u=u_0, v=v_o u = u 0 , v = v o .由於此時 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
a g c u 0 + m g c v 0 = c
即:x 0 ≡ c u 0 g ( m o d m ) x_0\equiv\frac{cu_0}g(\ mod\ m) x 0 ≡ g c u 0 ( m o d m ) 是同餘式方程 a x ≡ c ( m o d m ) ax\equiv c(\ mod \ m) a x ≡ c ( m o d m ) 的解。
這樣,就求出了同餘式方程的一個解,但是同餘式方程往往不止一個解。假設 x 1 x_1 x 1 是方程的另一個解,則 a x 1 ≡ a x 0 ( m o d m ) ax_1\equiv ax_0(\ mod\ m) a x 1 ≡ a x 0 ( m o d m ) ,所以 m m m 整除 a x 1 − a x 0 ax_1-ax_0 a x 1 − a x 0 則:
m g ∣ a ( x 1 − x 0 ) g
\frac m g \mid \frac{a(x_1-x_0)}g
g m ∣ g a ( x 1 − x 0 )
已知 g c d ( m / g , a / g ) = 1 gcd(m/g,a/g)=1 g c d ( m / g , a / g ) = 1 ,故 m / g ∣ ( x 1 − x 0 ) m/g\mid(x_1-x_0) m / g ∣ ( x 1 − x 0 ) ,則存在整數 k k k 使:
x 1 = x 0 + k m g
x_1=x_0+k\frac m g
x 1 = x 0 + k g m
上式中由 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 = g c d ( a , m )
如果 g ∤ c g\nmid c g ∤ c 則同餘式 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) a x ≡ c ( m o d m ) 無解
如果 g ∣ c g\mid c g ∣ c 則同餘式 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) a x ≡ c ( m o d m ) 有 g g g 個不同解
要求方程的解,首先使用線性方程定理求 a u + m v = g au+mv=g a u + m v = g 的一個解 ( u 0 , v 0 ) (u_0,v_0) ( u 0 , v 0 ) 則 x 0 = c u 0 / g x_0=cu_0/g x 0 = c u 0 / g 是 a x ≡ c ( m o d m ) ax\equiv c(\ mod\ m) a x ≡ c ( m o d 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 ≡ x 0 + k g m , k = 0 , 1 , … , g − 1
給出。
重要 :線性同餘式定理最重要的情形是 g c d ( a , m ) = 1 gcd(a,m)=1 g c d ( a , m ) = 1 此時同餘式方程只有一個解。我們將其寫成分數:
x ≡ c a ( m o d m )
x\equiv \frac c a(\ mod\ m)
x ≡ a c ( m o d 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