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

    裴蜀定理

    对于任意正整数a,b,一定存在一组正整数x和y,使得xa + yb = (a, b),并且(a, b)是a和b能凑(系数>0)出来的最小正整数。

    为什么是最小?

    因为a和b的最大公约数是(a, b),所以xa + yb = k(a, b)必定成立,又因为k是整数, a, b, x, y > 0, 所以k >= 1, 所以(a, b)是xa + yb的最小值。

    而裴蜀定理的证明可以用构造的方法来证明,即对于任意一个a, b都能找到x,y使得ax + by = (a, b),求x,y可以用扩展欧几里得算法求。

    首先复习一下递归版欧几里得算法,求最大公约数的:

    int gcd(int a, int b){
    	if(b == 0) return a;
    	if(a < b) return gcd(b, a);
    	return gcd(b, a % b);
    }
    

    而扩展欧几里得算法就是要在求(a, b)的时候顺便把x和y求出来。

    过程:

    (xa + yb \= gcd(a, b)\=gcd(b, a \% b))

    对于b和a % b,存在p和q使得

    (pb+q(a\%b) = gcd(b, a\%b))

    由上式得(pb+q(a\%b) = gcd(a, b))

    (gcd(a, b) = d)

    那么(xa + yb \= pb + q(a \% b)\=pb + q(a - lfloor a/b floor b)\=qa+(p-qlfloor a/b floor)b)

    所以(x = q\y=p-qlfloor a/b floor)

    由此得到递归本层和下一层得关系

    可得代码

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

    这样就同时得到了x,y和d,并且注意a对应得是x,b对应y,注意传参顺序。

  • 相关阅读:
    CentOS 出错处理
    g13 root
    修复误删系统文件
    c++ list sort方法
    批量修改outlook联系人头像,并同步手机
    IT大牛们 学术搜索
    oracle 表空间操作
    CentOS 5.5 安装MPICH2\MRNet\Launchmon时遇到的问题
    自我反省
    积累航程
  • 原文地址:https://www.cnblogs.com/tomori/p/13707265.html
Copyright © 2011-2022 走看看