zoukankan      html  css  js  c++  java
  • 同余方程笔记

    线性同余方程

    定义
     形同 (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]) 等价。

     
     还不太会。
     


    欢迎纠错 ……
  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/nanjoqin/p/10190172.html
Copyright © 2011-2022 走看看