zoukankan      html  css  js  c++  java
  • 拓展欧几里得算法揭秘

    最大公约数

    更相减损术:(gcd(x,y)=gcd(y-x,x)(xleq y))

    (gcd(x,y)=k,x=kp,y=kq,gcd(p,q)=1)

    那么 (gcd(y-x,x)=gcd(kq-kp,kp)=k imesgcd(q-p,p))

    (gcd(q-p,p)=r,q-p=rb,p=ra)

    那么 (q=r(a+b))

    因为 (gcd(p,q)=1=gcd(ra,r(a+b)))

    所以 (r=gcd(a,a+b)=1,gcd(y-x,x)=gcd(x,y)=k)


    辗转相除法(欧几里得算法):(gcd(x,y)=gcd(ymod x,x)(xleq y))

    取模相当于做多次减法,其实就是更相减损术的优化。

    最小公倍数

    容斥,两数之积除以两数的最大公约数。

    有一个小技巧,若数以质因数分解的形式给出,算最大公约数系数取 (min),算最小公倍数系数取 (max)

    拓展欧几里得算法

    有不定方程 (ax+by=gcd(a,b)),求出任意一个整数解(根据裴蜀定理,这东西一定有整数解)。

    假设我们当前已经得出了方程

    [bmod a imes x+ay=gcd(bmod a,a) ]

    的一组整数解 (x=p,y=q),根据 gcd 的性质有

    [bmod a imes p+aq=gcd(a,b) ]

    将取模拆掉

    [(b-lfloor b/a floor a)p+aq=gcd(a,b) ]

    整理成最初的形式

    [a(q-lfloor b/a floor p)+bp=gcd(a,b) ]

    那么 (x=q-lfloor b/a floor p,y=p) 就是方程 (ax+by=gcd(a,b)) 的一组整数解。

    所以在求解 (ax+by=gcd(a,b)) 时我们可以先递归求解 (bmod a imes x+ay=gcd(bmod a,a)) 然后计算当前的解。

    这个递归的终止条件是 (a=0),此时 (x=0,y=1) 是一组解,返回即可(虽然 (x) 取什么都没有关系但我们想让解的绝对值尽量小)。


    考虑归纳求出解的范围。假设递归得到 (-bmod aleq y'leq bmod a,-aleq x'leq a),现在 (x=y'-lfloor b/a floor x',y=x')

    (y'=bmod a,x'=-a)(xleq bmod a+lfloor(b-bmod a)/a floor aleq b,ygeq-a)

    (y'=-bmod a,x'=a)(xgeq-bmod a-lfloor(b-bmod a)/a floor ageq-b,yleq a)

    所以拓欧求出的 (ax+by=gcd(a,b)) 的解 (x,y) 满足 (xin[-b,b],yin[-a,a]),显然边界同样满足。

  • 相关阅读:
    凹凸函数
    HashMap数据类型使用注意不能使用基本数据类型
    Tomcat部署发布JSP应用程序的三种方法
    Ubuntu忘记密码,进不了系统的解决方法
    matlab之运算符及其优先级
    java和tomcat配置
    MySQL中 MySQL X.X Command Line Client 一闪而过
    Pearson(皮尔逊)相关系数
    CG, DCG, NDCG
    C#中ListBox中SelectedItem使用注意
  • 原文地址:https://www.cnblogs.com/May-2nd/p/13425779.html
Copyright © 2011-2022 走看看