筆記 數學數論(三)

2022-09-14 16:09:22 字數 3137 閱讀 1196

\[\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...