zoukankan      html  css  js  c++  java
  • 扩展欧几里得

    $$扩展欧几里得$$

    【前置芝士】

    至于欧几里得的基础算法就是辗转相除法,用式子来表示也就是,

    $forall a , b , b eq0, gcd(a,b) = gcd(b,a mod b) $,

    对于此,也就不证明其正确性了。

    【其代码实现】:

    gcd(a, b)//更相减损术
        a, b = max(a, b), min(a, b)
        while a != b:
            a, b = max(b, a-b), min(b, a-b)
        return a
    
    gcd(a, b) // 辗转相除法
        a, b = max(a, b), min(a, b)
        while a % b != 0:
            a, b = b, a%b
        return b
    

    (gcd(a,b)和lcm(a,b))

    刚刚提到了(gcd(a,v)),那么求解(gcd)也就可以用上方的辗转相除法了。
    那么(lcm(a,b))呢,$lcm(a,b) = a / gcd(a,b) imes b $
    证明如下:

    (x = gcd(a,b)).
    则显然 (x mid a),(xmid b).
    (a_0 = [a / x] , b_0 = [b / x]).
    (lcm(a_0 , b_0) = a_0 imes b_0). (gcd(a_0,b_0) = 1)
    (lcm(a_0,b_0) imes gcd(a_0,b_0) imes x = a_0 imes b_0 imes x)
    又因为 ,最大公约数
    所以 , (lcm(a,b)= frac {a imes b}{x})
    也就是 (lcm(a,b) imes x = a imes b)
    所以 , (lcm(a,b) imes gcd(a,b) = a imes b)
    证毕,$over ~ $

    【同余的性质】

    1.(left ( a+b ight )mod p=left (amod p+ bmod p ight )mod p)
    2.(left ( a-b ight )mod p=left (amod p- bmod p ight )mod p)
    3.(left ( a imes b ight )mod p=left (amod p) imes (bmod p ight )mod p)
    4.若(aequiv b(mod p)),那么(a^{n}equiv b^{n}(mod p))
    5.若(amod p1=x,amod p2=x),且(p1,p2)互质,(amod (p imes q)=x)
    6.若(aequiv b(mod p))(k)(c)为整数,而且$k> 0 (,那么)a^{k}cequiv 7.b^{k}c(mod p)( 8.若)acequiv bc(mod p)(,那么)aequiv b(mod frac{p}{gcd(p,c)})(就可以推出)gcd(p,c)=1(,则有)aequiv b(mod p)$

    【正篇】


    【裴蜀定理】:

    【前置芝士】

    【定义】:

    对于任意的整数(a,b),关于未知数(x,y)的线性不定方程: 若(a,b)为整数,且(gcd=d),那么对于任意的整数(x,y,) (d|(ax+by))


    【推论】:

    (a,b)互质的充分必要条件是存在整数(x,y)使(ax+by=1)


    【证明1】:
    (d=gcd(a,b))(d|a,d|b)由整除的性质,对于任意的整数(x,y)(d|(ax+by))

    (s)(ax+by)最小正值。令(q=[frac{a}{s}])

    (r=amods=a-q(ax+by)=a(1-qy)+b(-qy))

    可见(r)也为(a,b)的线性组合。

    由于(r)(mods)所得,所以(0 leq r<s)

    由于(s)(a,b)线性组合的最小正值,可知(r=0)

    (s|a),(s|b),因此,s是a与b的公约数,所以(d>=s……)

    因为(d|a,d|b),且(s)(a,b)的一个线性组合,所以由整除性质知 (d|s)

    但由于(d|s,s>0),所以,(d<=s)

    综上,(d=s),证毕;


    【证明2】
    于下面中,可以通过目录跳转


    【推广】:
    方程 (ax+by+cz+……nm=f)有解的充要条件就是 (f)(gcd(a,b,c,……,n))的倍数


    【证明】:
    充分性证明:

    设gcd(a,b)=d,于是设a=k1d,b=k2d,c=k3*d其中k1,k2互质

    那么原等式等价于k1dx+k2dy=k3d,即k1x+k2*y=k3,其中k1,k2互质

    那么这个方程等价于模线性方程egin{matrix} k1*x & equiv & k3 &mod & k2 end{matrix},由拓展gcd知,该方程一定有解

    那么该方程的一组解即为原方程的解

    必要性证明:

    采用反证法,假设c不是gcd(a,b)的倍数,于是:

    设a=k1d,b=k2d,c=k3*d+c{}'

    那么:

    k1dx+k2dy=k3*d+c{}'

    两边同时除以d,有:

    k1x+k2y=k3+frac{c{}'}{d}

    由于k1,x,k2,y,k3均为整数,而frac{c{}'}{d}显然不是整数,故原方程无解

    这与方程有解矛盾,故c一定为gcd(a,b)的倍数


    例题:裴蜀定理

    code:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    int gcd(int a,int b)
    {
    	if(b==0) return a;
        else return gcd(b,a%b);
    }
    int n;
    int main() 
    {
        scanf("%d", &n);
        int ans = 0,s;
        for(int i=1; i<=n; i++) 
    	{
            scanf("%d", &s);
            s=abs(s);
            ans = gcd(ans, s);
        }
        printf("%d", ans);
    }
    

    【扩展欧几里得】:


    【杂言】:

    一般是用来求解线性不定方程,同余方程和逆元的


    【引理】:
    存在 (x , y) 使得 (gcd(a,b)=a imes x+b imes y)(bezout定理)


    ————来源于李煜东《算法竞赛进阶指南》

    【证明】:
    在欧几里得的算法的最后一步,即(b=0)时,显然有一对整数(x=1, , y = 0),

    使得(a imes b + 0 imes 0 = gcd(a,0))

    (b > 0)时,则(gcd(a,b)=gcd(b,a mod b))

    假设存在一对整数(x,y),满足(b imes x + (a mod b ) imes y = gcd(b,a mod b)),

    因为(b imes x + (a - b imes [a/b]) imes y = a imes y + b imes(x - [a/b] imes y)),

    所以令 (x^{'}=y,y^{'} = x -[a/b] imes y),

    也就得到了(a imes x^{'} + b imes y^{'}=gcd(a,b))

    对欧几里得算法的递归过程进行数学归纳法,得证

    证毕


    上文的证明,就是按照欧几里得的思路来证明的,且同时给出了如何求解(x,y),这种的计算方法叫做 扩展欧几里得


    同余方程,即和上方一致,上方已经给出了其求解(x,y)的值的方法了。


  • 相关阅读:
    VPS服务器 基本配置
    WCF 系列 → HelloWord
    ASP.NET MVC3 常用整理
    ASP.NET MVC3 过滤器 Filter
    NVelocity系列 → NVelocity配置详解
    网站安全检测 Web 安全测试工具
    ASP.NET MVC3.0 静态化实现
    CSS3的动画泡沫按钮
    SQL 大数据优化
    用友备份失败,超时己过期
  • 原文地址:https://www.cnblogs.com/Zmonarch/p/14130326.html
Copyright © 2011-2022 走看看