zoukankan      html  css  js  c++  java
  • 【数论】不定方程&逆元&中国剩余定理

    一、不定方程

    要求逆元,首先要知道什么是不定方程。

    已知a,b,c,求解x,y,形如ax + by = c 的方程就是不定方程。

    不定方程有两种解的情况:

    1.无解

    2.存在且有无限的解

    那么,如何判断解的情况呢?

    这时候,只需要拿出gcd就可以了,

    若gcd(a,b) | c,则方程存在解,为什么呢

    因为我们要使用扩展欧几里得来求不定方程,我们都知道欧几里得是求

    ax + by = gcd(a,b)

    中的 x,y的,因此如果我们要把c代换成gcd(a,b)的话,c一定是gcd(a,b)的整数倍,因此gcd(a,b) | c,因此如果c不是gcd(a,b)的整数倍的话,该不定方程无解。

    接下来,就要解这个方程了

    因为之前我们得到c一定是gcd(a,b)的整数倍,所以设c = k * gcd(a,b),则 k * x 和 k * y就是方程的一组解,很好理解,因为我们要求

    ax + by = c

    代入扩展欧几里得

    ax + by = gcd(a,b)

    因为二者是等价的,且 c = k * gcd(a,b),所以两边同乘k

    k * (ax + by) = k * gcd(a,b)

    化简得

    k * x * a + k * y * b = k * gcd(a,b)

    将k * gcd(a,b) 等量代换为 c,得到

    k*x * a + k*y * b = c

    所以对于扩展欧几里得,k*x和k*y就是该不定方程的一个解。

    现在有特解,需要求通解:

    因为有了解,所以它存在无限的解,所以设t为任意常数代入扩展欧几里得方程,设p1a + q1b = gcd(a,b)

    设p = p1 * t

    q = q1 * t

    显然,因为 p1a + q1b = gcd(a,b)

    所以pa + qb = gcd(a,b) * t

    两边同除以gcd(a,b)

    得到pa / gcd(a,b) + qb / gcd(a,b) = t

    两边同除t

    得到p1a / gcd(a,b) + q1b / gcd(a,b) = 1

    p1a / gcd(a,b) + q1b / gcd(a,b) = 1

    p1*(a / gcd(a,b) ) + q1*(b / gcd(a,b)) = 1

    根据之前扩展欧几里得的公式,在ax + by = c中,

    c必须是gcd(a,b)的整数倍,现在c = 1,gcd(a,b) = gcd( a / gcd(a,b) , b / gcd(a,b) )

    所以c必须是gcd( a / gcd(a,b) , b / gcd(a,b) )的整数倍,且 c = 1,所以gcd( a / gcd(a,b) , b / gcd(a,b) ) 只能等于1,

    所以a / gcd(a,b) 和 b / gcd(a,b)必须是互质的,这样方程才有解。

    知道了判断条件后,我们就可以用扩展欧几里得求不定方程的通解。

    二、同余&逆元

    接下来需要了解一个概念,叫做同余:

    如果 a mod m = b mod m,则称 a,b 在模 m 的意义下同余
    可以写成 a b(mod m)

    同余有以下的性质:

    a a(mod m)
    a b(mod m),则 b a(mod m)
    a b(mod m); b c(mod m),则 a c(mod m)
    a b(mod m)c d(mod m),则
    a + c b + d(mod m)
    a - c b - d(mod m)
    ac bd(mod m)
    通过上述定义,可以得出ax 1(mod m) 这个同余方程

    等同于求解不定方程 ax - my = 1  

    所以求解ax ≡ 1(mod m)就变成了求解ax - my = 1,所以求解同余方程相当于求解不定方程。

    这时候,我们可以引入逆元的定义:

    逆元素是指一个可以取消另一给定元素运算的元素,

    所以设a的逆元为x,则

    ax = 1

    在模m的情况下则为

    ax ≡ 1(mod m)

    这恰恰是一个同余方程,所以可以转化为ax - my = 1,用exgcd求解这个不定方程。

    三、中国剩余定理(求同余方程组)

    那么如何求解同余方程组呢?

    同余方程组:

    x ≡ a1(mod m1)

    x ≡ a2(mod m2)

    ...

    x ≡ an(mod mn)

    在gcd(m1,m2,m3,...,mn) = 1(m1,m2,...,mn互质)时解同余方程组,求解x的最小非负整数解。

    这时候设m = ∏(i = 1, n)mi,Mi = m/mi,

    设 Miti = 1(mod mi) ,即ti为Mi在模mi情况下的逆元

    因为m是m1~mn的公倍数,且Mi = m/mi,所以Mi是除了mi以外的m1~mn的公倍数,

    k为除了i以外的1~n的中的整数,则 Mi = 0 (mod mk) ,即 mk | Mi

    所以,aiMiti = 0 (mod mk) 所以只要模数是m1~mn之间且模数不是mi,aiMiti 就等于 0

    因为我们定义 Miti = 1(mod mi)

    所以 aiMiti = ai (mod mi),所以只要模数是mi,aiMiti 就等于ai

    所以aiMiti只有在mod mi的时候才等于ai,mod 其它模数的时候都等于0

    因此x = ∑(i = 1, n) aiMiti 时,对于每个方程组:

     x = ai(mod mi)

    代入x = ∑(i = 1, n) aiMiti 得

    ∑(i = 1, n) aiMiti = ai (mod mi)

    在两边一起 mod mi,

    设i = i1时

    所以i只要不等于i1,aiMiti都等于0

    所以 ai1 = ai1 (mod mi1)

    所以x = ∑(i = 1, n) aiMiti 时,方程组有解

    此时求出的x是特解,显然,x+km(k为整数)是通解。

    易证如果要求最小整数解,只要把x对m取模即可。

    中国剩余定理证毕Q.E.D

  • 相关阅读:
    .NET中的一些设计模式
    (原创)无废话C#设计模式之三:Abstract Factory
    一步一步学Linq to sql(一):预备知识
    使用主题来自动包装控件样式
    (原创)无废话C#设计模式之六:Builder
    (原创)无废话C#设计模式之四:Factory Method
    当前匿名用户和当前连接的区别
    单一登陆的例子
    使用rar.exe压缩的例子
    (原创)无废话C#设计模式之九:Proxy
  • 原文地址:https://www.cnblogs.com/dudujerry/p/11620728.html
Copyright © 2011-2022 走看看