线性同余方程
定义:
形同 (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{
egin{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}
ight.)
给定(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{
egin{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}
ight.)
利用拓展欧几里得可以求得 (t_1,t_2,t_3...t_k),最后
· 当 (exists{gcd(n_i,n_j)
e 1}) 时:
拓展中国剩余定理。
先考虑只有两个方程的情况:(left{
egin{array}{lcl}
x equiv a_1 (mod n_1 )\
x equiv a_2 (mod n_2 )
end{array}
ight.)
得到 (left{
egin{array}{lcl}
x = a_1 + t_1n_1\
x = a_2 + t_2n_2
end{array}
ight.)
可以合并为 (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{
egin{array}{lcl}
y equiv 0 (mod n_1)\
y equiv a_2-a_1 (mod n_2)
end{array}
ight.)
(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{
egin{array}{lcl}
y_0 equiv 0 (mod n_1 ')\
y_0 equiv a_0 (mod n_2 ')
end{array}
ight.)
得(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}
floor),设
即 (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) e 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^ymod 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}),则此类方程与方程组
还不太会。