\[\huge
\]形如 \(ax \equiv c \pmod b\) 的方程被稱為線性同餘方程(congruence equation)。
方程 \(ax+by=c\) 與方程 \(ax \equiv c \pmod b\) 是等價的,有整數解的充要條件為 \(\gcd(a,b) \mid c\)。
根據定理 \(1\) ,方程 \(ax+by=c\),我們可以先用擴充套件歐幾里得演算法求出一組 \(x_0,y_0\),也就是
\[ax_0+by_0=\gcd(a,b)
\]兩邊同時除以 \(\gcd(a,b)\),
\[\dfrac + \dfrac=1
\]乘以 \(c\) ,得到
\[\dfrac + \dfrac = c
\]然後就找到了方程的乙個解。
若 \(\gcd(a,b)=1\),且 \(x_0\)、\(y_0\) 為方程 \(ax+by=c\) 的一組解,則該方程的任意解可表示為:
\[x=x_0+bt\\y=y_0-at
\]且對任意整數 \(t\) 都成立。由此即可以求出方程的所有解。
但在實際問題中,我們往往被要求求出乙個最小整數解,也就是乙個特殊解
\[x=(x \bmod t+t) \bmod t
\]其中 \(t=\dfrac\)。
**:
int ex_gcd(int a, int b, int &x, int &y)
int t = ex_gcd(b, a % b, x, y);
int tmp = x;
x = y;
y = tmp - a / b * y;
return t;
}bool lieu(int a, int b, int c, int &x, int &y)
逆元(素),是指乙個可與取消另乙個元素運算的元素。數學中逆元有加法逆元和乘法逆元(乘法中的倒數)
本篇文章只介紹乘法逆元。/dk
不難得出,\(ax \equiv c \pmod b\) 等價於 \(a \times x + b \times y = c\) ,那麼顯然當 \(\gcd(a,b) \ne 1\) 時,上述方程無解。
也就是說,使得 \(a \times x + b \times y = c\) 有解的充要條件是 \(c \% \gcd(a, b) =0\) 。
一般情況下,上式能夠計算出無數組合法解,但是題目往往要求計算出最小的那組解。我們可以首先求出乙個特殊解 \(x_0\) ,那麼最小的解便是 \(x_0 \% b\)。
正確性?
首先,\(x\) 的通解是 \(x_0 + b \times t\) 嗎?
那麼,也就是說, \(a\) 關於 \(b\) 的逆元是乙個關於 \(m\) 同餘的,那麼根據最小整數原理,一定存在乙個最小的正整數,它是 \(a\) 關於 \(b\) 的逆元,而最小的肯定是在\((0 , b)\) 之間的,而且只有乙個,這就好解釋了。
當 \(b\) 是負數的時候,我們取 \(b\) 的絕對值就行了,當 \(x_0\) 是負數的時候,他模上 \(b\) 的結果仍然是負數(在計算機計算的結果上是這樣的,雖然定義的時候不是這樣的),這時候,我們仍然讓 \(x_0\) 對abs(b)
取模,然後結果再加上abs(b)
就行了,於是,我們不難寫出下面的**求解乙個數 \(a\) 對於另乙個數 \(b\) 的乘法逆元:
int cl(int a, int b)
因為 \(ax \equiv 1 \pmod b\),
又由費馬小定理可得 \(ax \equiv a^ \pmod b\) ,
所以 \(x \equiv a^ \pmod b\)。
**:
int qpow(int a, int b)
return ans;
}
求出 \(1,2,...,n\) 中每個數關於 \(p\) 的逆元。顯然有 \(1^ \equiv 1 \pmod p\)。
證明:對於 \(\forall p \in \mathbf\),有 \(1 \times 1 \equiv 1 \pmod p\) 恆成立,故在 \(p\) 下 \(1\) 的逆元是 \(1\)。
其次對於遞迴情況 \(i^\),令 \(k = \lfloor \frac \rfloor\),\(j = p \bmod i\),有 \(p = ki + j\)。
則有\[ki+j \equiv 0 \pmod p
\]兩邊同時乘 \(i^ \times j^\)
\[\begin
kj^+i^ &\equiv 0 &\pmod p\\
i^ &\equiv -kj^ &\pmod p
\end
\]代入 \(j = p \bmod i\)
\[p = ki + j
\]又有
\[i^ \equiv -\lfloor\cfrac\rfloor (p \bmod i)^ \pmod p
\]由於 \(p \bmod i < i\),則在迭代中我們完全可以假設我們已經知道了所有的模 \(p\) 下的逆元 \(j^, j < i\)。
故我們就可以推出逆元,利用遞迴的形式,而使用迭代實現:
\[i^ \equiv \begin
1 , &i = 1, \\
-\lfloor\cfrac\rfloor (p \bmod i)^, &\text.
\end \pmod p
\]**:
inv[1] = 1;
for (int i = 2; i <= n; ++i)
通過 \(p-\lfloor \cfrac \rfloor\) 來防止出現負數。
另外,根據線性求逆元方法的式子
\[i^ \equiv -kj^ \pmod p
\]遞迴求解 \(j^\), 直到 \(j=1\) 返回 \(1\)。
其實還可以利用記憶化來避免多次遞迴導致的重複,但是這樣求 \(1,2,...,n\) 中所有數的逆元的時間複雜度仍是 \(o(n)\)。
線性同餘方程、逆元完結!!
筆記 數學數論(一)
由於作者也是邊學習邊記錄,所以必然會存在某些神筆錯誤,感謝指正。由於 oi 涉及到的數學數論知識實在太多,本內容也會分為幾篇文章共同呈上。過後這裡會新增完整筆記的索引 huge 如果存在乙個整數 k 使得 a kd 則稱 d 整除 a 記做 d mid a 稱 a 是 d 的倍數,如果 d 0 稱 ...
學習筆記 數學建模
層次分析法 將與決策總是有關的元素分解成目標,準側和方案等層次,在此基礎之上進行定性和定量分析。使用層次分析法建模,首先要把問題條理化和層次化,構想出乙個有層次的模型。層次分析法建模大體分為三步 建立遞階層次模型 大致分為 目標層 準側層 最低層。將複雜問題分解成構層問題的元素,再對按照元素之間的關...
演算法筆記 數學問題
原題鏈結 原理 最大公約數 遞迴 歐幾里得演算法 最小公倍數 得到a,b的最大公約數d 最小公倍數 a d b include include intgcb int a,int b 求最大公約數 intmain printf d n d return0 include include include...