同余方程笔记
线性同余方程
定义:
形同 \(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\ ')\),由欧拉定理
现在将以上推算代回原方程:
至此,两个同余方程合并成了一个同余方程。迭代若干次可得到原方程组的解。
第一类指数同余方程
形式:
形同 \(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\) 为止,此时产生一个方程
令 \(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}\),则此类方程与方程组
还不太会。