zoukankan      html  css  js  c++  java
  • 拓展欧几里得算法的多解

    写在前面:

      这篇博客是我在[◹]对 算术基本定理 的研究 中的一部分

    by pixelkitties

    • 拓展欧几里得算法的多解

      []拓展欧几里得算法

      拓展欧几里德算法是用来在已知a,b的情况下求解一组p,q,使它们满足[◹]Bézout恒等式: pa+qb = gcd(a, b) ==d

    ——bia度百科


      求解得到的是一组p,q,是任意的一组p,q吗?

      p,q肯定不止一对,那么如何获得多对p,q呢?

     

      是否为随意的一组解先存疑

      但能肯定的是,得到的不一定是最小整数解

      如wikipedia上的例子:

      想要求得多解也很容易:

        设gcd(a,b) == d

        ∵p*a + q*b == d

        ∴p*a + q*b + n*a*(b/d) - n*(a/d)*b == d

        ∴(p + n*(b/d) )*a + (q - n*(a/d) )*b == d

    注意,n不为0时,上下红色部分不相等

    注意,此处除去gcd(a,b)是为了得到所有解

      即任意一组解满足:

    (p+n*(b/d) )(q-n*(a/d) )

    (d == gcd(a,b) )

      显然,对于任意的n∈Z都成立

      利用这个性质就能求出所有解了!

    此处p,q为利用拓展欧几里得算法得到的一组p,q

      那么如何求得p或q的最小整数解呢?

      其实同理:

        p*a + q*b == gcd(a, b)

        (p' + n*b)*a + (q' - n*a)*b == gcd(a, b)

      则p%b,q%a就好了

    注意,n不为0时,上下红色部分不相等

      还有以下情况:

      希望在MOD gcd(a,b)的意义下,希望得到最小的一组非负整数解

      即求得最小的p,q∈Z*,使得p*a + q*b ≡ 0 (MOD gcd(a,b) )

      但是p或q有可能为负数啊?

    ((p%b)+b)%b((q%a)+a)%a

      这样就能保证是正整数了!

  • 相关阅读:
    sql 相关子查询
    sql 执行计划
    SQL表连接查询(inner join、full join、left join、right join)
    sql执行顺序
    sql 语句 嵌套子查询 执行顺序分析
    只有程序员才看得懂的情书
    Give Me an E
    hdu 1114 (背包变形)
    模版 并查集
    背包 讲解
  • 原文地址:https://www.cnblogs.com/Antigonae/p/10106068.html
Copyright © 2011-2022 走看看