同余方程笔记

线性同余方程

定义
 形同 (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,x+m_0,x+2m_0... x+(d−1)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),最后
 

(ans=(t_1m_1a_1 + t_2m_2a_2 + t_3m_3a_3 ... t_km_ka_k)mod lcm)

· 当 (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 ')),由欧拉定理
 

(k equiv n_1^{ 'phi(n_2 ')-1}a_0( mod n_2 '))

 
 现在将以上推算代回原方程:
 
(y_0 equiv n_1^{ 'phi(n_2 ')}a_0 (mod n_1n_2))

 
(x equiv gy_0 + a_1equiv 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} floor),设
 

(x = im+j (i in [0,m], jin[0, m], i,jin N))

 
 即 (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) 为止,此时产生一个方程
 
(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)),则
 

(a^{ky}equiv a^m(mod p)),得 (a^{ky-m} equiv 1(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}),则此类方程与方程组
 
(x^k equiv b(mod p_i^{a_i}),i in [1,k]) 等价。

 
 还不太会。
 


欢迎纠错 ……
原文地址:https://www.cnblogs.com/nanjoqin/p/10190172.html