zoukankan      html  css  js  c++  java
  • 最小乘法正逆元(扩展欧几里德解的分布)

    众所周知逆元是由扩展欧几里得算法得来的。

    可是经由扩展欧几里德算法算出来的解。只是一个特解。

    我们实际生活中往往需要这些解集中的一个最小正解。又或者有某个式子来描绘整个解集的状态。

    在这里我们有一个这样的式子。

    对于方程nn'+mm'=t

    已知n',m'为该方程的一组特解。

    那么解集组为:(n'+m/d,m'-n/d).其中d = gcd(n,m)

    那么对于计算乘法逆元:(n'+m,m'-n).

    我们首先来证明当(n',m')为方程解的时候。

    (n'+m/d,m'-n/d)确实为方程的解。

    因为nn'+mm'=t

    所以n(n'+m/d)+m(m'-n/d)=nn'+nm/d+mm'-mn/d = nn'+mm' = t 成立。

    接下来证明其最小性。

    因为水平有限。这个也许我描述也许不会特别清楚。望见谅。

    我们要求最小当然需要的是最小的整数添量。

    我们首先只考虑一个变量。n' (假如一个变量的最小整数添量为m/d。那么当然就可以直接对应的m'所更变的量。因为是对应的。)

    nn' + mm' = t 可以看作同余式。

    nn' ≡ t (mod m)

    即 nn' mod m = t mod m. 

    令 g = t mod m .

    那么 nn' mod m = g

    我们令n'加上m/d.

    n(n'+m/d) = nn'+nm/d  (再提醒一次d =  gcd(n,m))

    (nn'+nm/d) mod m = nn' mod m 这是显然的。从这里我们也可以看出(n'+m/d,m'-n/d)确实为方程的解。

    笼统地讲nm/d mod m = 0

    即我们要构造出来的增量乘上n之后一定是m的倍数。knm.

    我们自然会想到最小增量是m/n 因为m/n*n = m 而m是最小的m的倍数。(废话,也许不能称作倍数)

    可是你有考虑过。是最小整数增量嘛?注意整数。所以自然而然地 m/gcd(n,m) 才是最小整数增量。

    因此当我们计算出n'的时候。要转换成最小的正整数解。

    设 q = m/gcd(n,m)

    n'+kq>0

    如果n'>0

    n' = n'%q

    如果n'<0

    n ' = n'%q + q

    即可。

    总结是: n' = (n'%q+q)%q.

    注意题设。有可能n' = 0要特判。

    实际上我们往往求的不是n'。而是nn'。那么对于nn'。的解集会如何分布呢?

    设。x =  nn'. X 为 x 的解集。

    X =  n(n'+k*m/gcd(n,m)) = nn'+k*m*n/gcd(n,m) = nn' + k*lcm(n,m).

    其中nn'为一个解集中的一个解。

    这个X解集也是很有用的。在求中国剩余定理的时候。求最小正整数X满足同余线性方程组的时候。即会用到。

  • 相关阅读:
    P1363-幻象迷宫
    P1582-倒水
    P2123-皇后游戏
    P1233-木棍加工
    P1052-过河
    P1541-乌龟棋
    P1736-创意吃鱼法
    P1417-烹调方案
    LeetCode--043--字符串相乘(java)
    LeetCode--041--缺失的第一个整数(java)
  • 原文地址:https://www.cnblogs.com/Milkor/p/4446088.html
Copyright © 2011-2022 走看看