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

    裴蜀定理:对于任意整数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

  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/QQ2519/p/15080797.html
Copyright © 2011-2022 走看看