• 扩展欧几里得算法


    裴蜀定理:对于任意整数a,b,存在一对整数x,y,满足ax+by=gcd(a,b)
    证明
    $ quad $ 在欧几里得算法的最后一步,即b=0时,显然有一对整数x=1,y=0,使得a1+00=gcd(a,0)。
    $ quad $ 若b>0,则gcd(a,b)=gcd(b, a mod b)。假设存在一对整数x,y,满足b*x+(a mod b) * y =gcd(b, a mod b), 因为bx+(a mod b)y=bx+(a-b$lfloor a/b floor $)y=ay+b(x- $ lfloor a/b floor $ y),所以令(x^{prime})=y,(y^{prime}) =x-(lfloor a/b floor y),就得到了(ax^{prime}+by^{prime}=gcd(a,b))
    $ quad $ 对欧几里得算法的递归过程应用数学归纳法,可证。
    证毕
    裴蜀定理是按欧几里得算法的思路证明的,且上述证明同时给出了整数x和y的计算方法。这种计算方法被称为扩展欧几里得算法
    模板

    int exgcd(int a, int b, int &x, int &y) {
    	if(!b) {
    		x = 1;
    		y = 0;
    		return a;
    	}
    	int d=exgcd(b,a%b,x,y);
        int z=x;x=y;y=x-(a/b)*y;
        return d;
    }
    

    上述程序返回了d=gcd(a,b),并将满足ax+by=gcd(a,b)的一组解用引用的方式返回了。
    对于更一般的方程ax+by=c,它有解当且仅当d|c。(因为a,b为gcd(a,b)的倍数,ax+by也会是gcd(a,b)的倍数)我们可以先求出ax+by=d的一组解(x_0,y_0),然后令(x_0,y_0)同乘c/d,就可以得到方程ax+by=c的一组解了。
    其实,方程ax+by=c通解可以表示为

    [ x=frac{c}{d} x_0+k frac{b}{d} \ y=frac{c}{d} y_0-k frac{a}{d} \ ]

    其中,k为任意整数,d为gcd(a,b)。(x_0,y_0)为方程ax+by=c的一组解。
    证明
    不妨设

    [egin{equation} egin{cases} ax_1+by_1=c\ ax_2+by_2=c \ end{cases} end{equation} \ \ 于是可以有a(x_1-x_2)=b(y_1-y_2) \ 方程两边同除gcd(a,b),得到 \ a^{prime}(x_1-x_2)=b^{prime}(y_1-y_2)\ 易知a^{prime} perp b^{prime} 根据等式的性质,可以知道kb^{prime}=(x_1-x_2) \ 所以x=kb^{prime}+x_2 \ 而x_0=frac{c}{d}x_2,frac{b}{d}=b^{prime} y同理 ]

    证毕

    本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15080797.html

  • 相关阅读:
    Cobbler学习之一--Fedora17下配置Cobbler安装环境
    linux下 tar解压 gz解压 bz2等各种解压文件使用方法
    linux性能检测工具
    firefox的plugin-container进程关闭方法
    部署额外域控制器,Active Directory
    利用yum下载软件包的三种方法
    HP iLo2 试用序列号
    (转)Linux下root密码丢失和运行级别错误的解决办法
    linux下的5个查找命令
    (转)CentOs上配置samba服务
  • 原文地址:https://www.cnblogs.com/QQ2519/p/15080797.html
Copyright © 2020-2023  润新知