標籤:沒有 同餘方程 splay line lcm 計算 play 精簡 歐幾裡得演算法
中國剩餘定理問題引入
求出一個數,使得這個數除 \(3\) 餘 \(2\), 除 \(5\) 餘 \(3\), 除 \(7\) 餘 \(2\)。
問題求解
下面我們依照中國剩餘定理的演算法流程對這個問題進行求解,並且逐步解釋其原理
對於這個問題,我們有一個比較簡單的方法是:先找出每一個方程的解,再通過加其模數使之與其他方程的解的值相等
然而這樣的想法是很難進行求解的,我們引入如下兩個性質:
性質一:\((a + b) \bmod p = a \bmod p + b \bmod p\)
性質二:\((a * b) \bmod p = (a \bmod p) * b\)
性質一告訴我們:如果有一個數除 \(5\) 餘 \(3\),還有任意兩個數被 \(5\) 整除,則這三個數的和滿足除 \(5\) 餘 \(3\)
那麼,我們構造出三個數 \(a, b, c\) 分別滿足這三個方程,並且能被其它兩個數整除,那麼\(a + b + c\)就是這個方程組的一個解
因此,這個問題被我們轉化成了一個簡單的問題:求一個 \(x\),使得\(x \bmod 3 = 0, x \bmod 7 = 0\) 並且 \(x \bmod 5 = 3\)
顯然,x會是 \(3 * 7 = 21\) 的倍數,那我們直接考慮 \((k * 21) \bmod 5 = 3\) 就行了。由性質二可以得知,我們只需將 \(21 \bmod 5\) 擴大 \((5 \times d) / (21 \bmod 5)\) 倍就行了,這個值就是 \(k\) 的值
上面這個問題(以本體為例)相等於求解一個 \(x\) 使得 \(1 * x = 3 \pmod 5\) 這個問題可以通過拓展歐幾裡得演算法求解
以本體為例,我們寫出計算過程。
- 求出最小公倍數:\(lcm = 3 * 5 * 7 = 105\)
- 求出個數對應基礎數:
對於第一個條件, 我們有\(105 / 3 = 35\), \(35 \bmod 3 = 2\) 滿足,則基礎數為 \(35\)
對於第二個條件, 我們有\(105 / 5 = 21\), \(21 \bmod 5 = 1\) 不滿足,將這個式子乘 \(3\),使得 \(63 \bmod 5 = 3\) 則基礎數為 \(63\)
對於第三個條件, 我們有\(105 / 7 = 15\), \(15 \bmod 7 = 1\) 不滿足,與上一個步驟相同,乘 \(2\) 得到基礎數為 \(30\)
把基礎數相加: \(35 + 63 + 30 = 128\)
- 減去最小公倍數(在比最小公倍數大的情況下)
得到\(x = 128 - 105 = 23\)
數學模型
設 \(m_1, m_2, \cdots, m_n\) 是兩兩互質的整數,\(m = \prod_{i = 1}^nm_i, M_i = m / m_i\) ,\(t_i\) 是線性同餘方程 \(M_it_i = 1 \pmod m_i\) 的一個解,對於任意的 \(n\) 個數 \(a_1, a_2, \cdots, a_n\), 方程組 \[x = a_i \pmod m_i\]有整數解,解為 \(x = \sum_{i = 1}^na_iM_it_i\)
證明
因為 \(M_i = m / m_i\) 是除 \(m_i\) 意外所有數的倍數,所以 \(\forall k \not= i, a_iM_it_i = 0 \pmod m_k\), 又因為 \(a_iM_it_i = a_i \pmod m_i\) 所以帶入 \(x\), 原方程成立
代碼
還沒有精簡
中國剩餘定理