同余方程笔记
線性同余方程
定義:
形同 \(ax \equiv b\ (mod\ m)\),其中\(x\)是未知整數的同余式。
定理:
\(a,b \in Z\) 且 \(m \in N^+\),\(gcd(a,m)=d\),若\(d|b\),則方程恰好有\(d\)個模\(m\)不同余的解,否則方程無解。
解法:
· 拓展歐幾里得:
由同余方程的定義式可得 \(ax+my=b\),這個方程就是二元一次不定方程。若方程有解,則對于轉化而來的方程 \(ax+my=b\),設 \(d=gcd(a,m)\),則 \(a=d*a_0\),\(m=d*m_0\),\(b=d*b_0\)。
方程轉化為 \(a_0x+m_0y=b_0\),且 \(gcd(a_0,m_0)=1\),可以利用拓展歐幾里得求出一可行解 \(x\)。
雖然 \(x\) 不唯一,但是屬于一個模 \(m\) 剩余系,由定理可知,共有 \(d\) 個模 \(m\) 剩余類滿足方程,由 \(a_0x \equiv b_0(mod\ m_0)\),其分別為
其最小正整數解可表示為 \((x \mod m + m) \mod m\)。
· 另一種神奇的方法:
對于方程 \(a_0x \equiv b_0(mod\ m_0)\),由歐拉定理,\(x \equiv a_0^{\phi(m_0) - 1}b_0(mod\ m_0)\)。最終所有的解可以表示為 \(x \equiv a_0^{\phi(m_0) - 1}b_0 + km_0(mod\ m)\)。
****
線性同余方程組
形式:
\(\left\{ \begin{array}{lcl} x \equiv a_1 (mod\ n_1 )\\ x \equiv a_2 (mod\ n_2 )\\ x \equiv a_3 (mod\ n_3 )\\ ....\\ x \equiv a_k (mod\ n_k ) \end{array} \right.\)
給定\(A = {a_1, a_2, a_3 ... a_k}\),\(N = {n_1,n_2,n_3...n_k}\),求一個\(x\)。
解法:
· 當 \(\forall{gcd(n_i,n_j) = 1}\) 時:
中國剩余定理。
首先求出 \(lcm(n_1,n_2,n_3...n_k)\),即 \(\Pi_{i = 1}^k n_i\),令 \(m_1= \frac{lcm}{n_1}\),\(m_2= \frac{lcm}{n_2}\),\(m_3= \frac{lcm}{n_3}\)\(...\)\(\ m_k= \frac{lcm}{n_k}\),然后構造出一個方程組:
\(\left\{ \begin{array}{lcl} t_1m_1 \equiv 1 (mod\ n_1 )\\ t_2m_2 \equiv 1 (mod\ n_2 )\\ t_3m_3 \equiv 1 (mod\ n_3 )\\ ....\\ t_km_k \equiv 1 (mod\ n_k ) \end{array} \right.\)
利用拓展歐幾里得可以求得 \(t_1,t_2,t_3...t_k\),最后
· 當 \(\exists{gcd(n_i,n_j) \ne 1}\) 時:
拓展中國剩余定理。
先考慮只有兩個方程的情況:\(\left\{ \begin{array}{lcl} x \equiv a_1 (mod\ n_1 )\\ x \equiv a_2 (mod\ n_2 ) \end{array} \right.\)
得到 \(\left\{ \begin{array}{lcl} x = a_1 + t_1n_1\\ x = a_2 + t_2n_2 \end{array} \right.\)
可以合并為 \(t_1n_1 + a_1 = t_2n_2 + a_2\),因為 \(t_1,t_2 \in (-\infty,\infty)\),所以項的符號并不對過程及解造成影響,變形得到一個又可以用拓歐求解的二元一次不定方程 \(t_1n_1 + t_2n_2 = a_2 - a_1\)。
得到一個最小正整數解 \(x_1\),現在令 \(k = (n_1x_1 + b_1)\),構造一個方程 \(x \equiv k(mod\ lcm(a_1, a_2))\),與下一個方程繼續重復上述過程求解即可。
· 另一種神奇的方法:
同樣先僅考慮只有兩個方程的情況,設 \(y=x-a_1\),則
\(\left\{ \begin{array}{lcl} y \equiv 0 (mod\ n_1)\\ y \equiv a_2-a_1 (mod\ n_2) \end{array} \right.\)
\(g=gcd(n_1,n_2)\),若保證方程有解則 \(g|(a_2-a_1)\),設 \(a_0=\frac{a_2-a_1}{g}\),\(y_0=\frac{y}{g}\),\(n_1\ '=\frac{n_1}{g}\),\(n_2\ '=\frac{n_2}{g}\):
\(\left\{ \begin{array}{lcl} y_0 \equiv 0 (mod\ n_1\ ')\\ y_0 \equiv a_0 (mod\ n_2\ ') \end{array} \right.\)
得\(kn_1\ ' \equiv a_0(\ mod n_2\ ')\),由歐拉定理
現在將以上推算代回原方程:
\(y_0 \equiv n_1^{\ \ '\phi(n_2\ ')}a_0\ (mod\ n_1n_2)\),
\(x \equiv gy_0 + a_1\equiv g(n_1^{\ \ '\phi(n_2\ ')}a_0) + a_1\ (mod\ n_1n_2)\)
至此,兩個同余方程合并成了一個同余方程。迭代若干次可得到原方程組的解。
****
第一類指數同余方程
形式:
形同 \(a^x \equiv b(mod\ p)\) 的方程。
解法:
· 當 \(gcd(a,p) = 1\) 時:
\(Baby-step-Giant-step(BSGS)\)法。
首先存在一個結論:若 \(gcd(a,p)=1\),則有 \(a^{x \mod \phi(p)} \equiv a^x (mod\ p)\)。
證明如下,因為 \(gcd(a,p)=1\),根據歐拉定理 \(a^{\phi(p)}\equiv 1(mod\ p)\),因此顯然若 \(k \in N\),那么 \(a^{k \phi(p)}\equiv 1(mod\ p)\)。
設 \(t \in N\) 且 \(t < \phi (p)\),所以 \(a^{k \phi(p) + t}\equiv a^t(mod\ p)\),故\(a^{x \mod \phi(p)} \equiv a^x (mod\ p)\)。
因此可以確定的是若方程有解,則在 \([0, \phi(p))\) 內一定有一個解。是的,這個結論在下面并沒什么用。
\(BSGS\)算法實際上是利用了分塊思想來優化暴力枚舉,有很多形式不同但本質相同的構造方程的方法,這里可以令 \(m=\lfloor \sqrt{p} \rfloor\),設
即 \(a^x=a^{im}a^j\)。
設 \(d = a^{im}\),則原方程轉化為 \(da^j=b(mod\ p)\),枚舉\(i\),拓歐求得 \(a^j\)。預處理出 \(a^i \mod p(i \in [0, m])\),就可以利用哈希表近似 \(O(1)\) 查詢 \(j\)。
· 當 \(gcd(a,p) \ne 1\) 時:
拓展\(BSGS\)。
\(g=gcd(a,p)\),原式為 \((a'g)^x \equiv b'g(mod\ c'g)\),即 \(a'(a'g)^{x-1} \equiv b'(mod\ c')\)。
對 \((a'g)^{x-1}\) 一項迭代求解,將每次產生的前面的 \(a'\) 乘起來作為 \(d\),直到 \(g=1\) 為止,此時產生一個方程
\(da^{x-num} \equiv b(mod\ c)\)。
令 \(x=im+j+num\),枚舉求出 \(a^i(i \in [0,m+num])\),即轉化成與之前相同的問題。
****
第二類指數同余方程
形式:
形同 \(x^k \equiv b(mod\ p)\) 的方程。
解法:
· 當\(p\)是質數時:
表示成原根的若干次冪的形式后解線性方程。
使 \(a^y \equiv x(mod\ p)\) 且為 \(p\) 的一個原根,通過第一類指數同余方程的解法求得 \(b \equiv a^m(mod\ p)\),則
根據原根的性質,\(ky-m \equiv 0(mod\ (p-1))\),解線性同余方程得到 \(y\),\(x=a^y\mod p\)。
關于原根,即設 \(p\) 是質數,若 \(a^0,a^1,a^2...a^{p-2}\) 互不相等,則稱\(a\)是\(p\)的一個原根。
若廣義黎曼猜想成立,則 \(p\) 的最小正原根是 \(O(log^6 p)\) 級別的,通過枚舉法可以快速找到原根。
關于原根的判斷與尋找,由于費馬小定理成立,因此方程 \(a^x \equiv 1(mod\ p)\) 的一個解是 \(x = p ? 1\),所以它的最小整數解 \(x_{min} |(p ? 1)\)。此時若 \(x_{min} =(p ? 1)\),則 \(a\) 是 \(p\) 的原根。
因此逐個嘗試\(p ? 1\)的約數即可。
· 當\(p\)不是質數時:
設\(p=p_1^{a_1}p_2^{a_2}p_3^{a_3}...p_k^{a_k}\),則此類方程與方程組
\(x^k \equiv b(mod\ p_i^{a_i}),i \in [1,k]\) 等價。
還不太會。
****
歡迎糾錯 ……
轉載于:https://www.cnblogs.com/nanjoqin/p/10190172.html
總結
- 上一篇: git在实际开发中的应用
- 下一篇: requireJS 从概念到实战