填坑。html
本文中涉及的概念較少,將不在給出相關概念。算法
參考資料:《算法競賽進階指南》 李煜東 著。工具
歐幾里得算法之展轉相除法是求解同餘方程相關問題一種很是好用的工具。ui
網上講這個的不少,講的也都不錯,這裏再也不贅述。spa
代碼htm
線性同餘方程解法能夠直接使用一次歐幾里得算法解決。blog
(下文中引用內容皆來自 《算法競賽進階指南》 李煜東 著)get
線性同餘方程
給定整數 \(a, b, m\),求線性同餘方程 \(ax \equiv b (\bmod m)\) 的解 \(x\)。
原方程等價於 \(ax + my = b (y \in \mathbb Z)\)。根據裴蜀定理和推論,該線性同餘方程組有解當且僅當 \(\gcd(a, m) | b\)。
求解時,先用歐幾里得求出一組整數解 \(x_0, y_0\) 知足 \(ax_0 + my_0 = \gcd(a, m)\),而後 \(x = \frac{x_0b}{\gcd(a, m)}\) 就是原方程組的一個特解。方程的通解爲 \(x_t = x + tm (t \in \mathbb Z)\)數學
中國剩餘定理 (CRT)
對於線性同餘方程組 \(x \equiv a_i (\bmod m_i), i \in \{1, 2, \cdots, n\}\),若 \(m_i\) 兩兩互質, 那麼設 \(m = \prod_{i = 1}^{n} m_i, M_i = \frac{m}{m_i}, t_i\) 是線性同餘方程 \(M_it_i \equiv 1(\bmod m_i)\) 的一個解, 那麼方程組的解爲 \(\sum_{i = 1}^na_iM_it_i\)。
證實略。
解法:使用 \(n\) 次歐幾里得,求出 \(t_i\),獲得答案。
其實主要用到的仍是 exCRT。
exCRT 能夠在模數不知足兩兩互質的狀況下獲得線性同餘方程組的解。
求解過程:
考慮使用數學概括法,如今假設已經求出了前 \(k - 1\) 個線性同餘方程構成的方程組的解 \(x\)。設 \(m = \operatorname{lcm}\{m_i\}(i \in \{1, 2, \cdots, k - 1\})\), 則 \(x = tm (t \in \mathbb Z)\) 是前 \(k - 1\) 個線性同餘方程的通解。
那麼考慮第 \(k\) 個方程,找到一個整數 \(t\) 知足 \(x + tm \equiv a_k (\bmod m_k)\) 該方程等價於線性同餘方程 \(mt \equiv a_k - x (\bmod m_k)\)。這是一個線性同餘方程,可使用歐幾里得算法解決。
求解形如 \(a^x \equiv m\) 的高次同餘方程通常使用 BSGS 算法。
BSGS 的思想是,計 \(t = \sqrt{m}\),設 \(x = it - j\),則 \(a^x \equiv b (\bmod m)\) 轉化爲 \((a^t)^i \equiv ba^j(\bmod m)\)。因爲 \(j > t\) 時原式等價於 \((i + 1)t - (j - t)\),所以 \(j \in [0, t)\),所以能夠存下 \(j \in [0, t)\) 的時候分別的 \(ba^j \bmod m\) 的值。又因爲 \(ij < m\) 所以 \(i \in [0, t]\)。計算出 \(i \in [0, t]\) 時分別的 \((a^t)^i \bmod m\) 的值,而後找到原先右式計算值中有沒有與計算結果同餘的。若是有,就更新一下最小答案。