欧几里得算法的扩展形式

这个算法是用来求满足下列条件的整数x和y:

                d = gcd(a,b) = ax+by (d为a,b的最大公约数)

算法导论上给出的伪代码:

        EXTENDED_EUCLID(a,b)

       1 if b==0

       2   return (a,1,0)

       3 else (d1,x1,y1) = EXTENDED_EUCLID(b,a mod b)

       4   (d,x,y) = (d2,y1,y1-(a/b)*y1)

       5   return (d,x,y)

注意第四行是关键。

如果看不懂没关系,下面给出推导过程:

  

  gcd(a,b)==gcd(b,a%b),同时都代入式1,有ax+by==b*x1+(a%b)*y1。

  因为 i%j = i-(i/j)*j,所以可以将右边变形为如下形式

    b*x1+(a%b)*y1==b*x1+(a-(a/b)*b)*y1==a*y1+b*(x1-(a/b)*y1),最终得到ax+by==a*y1+b*(x1-(a/b)*y1)

  也就是说,上一深度的x等于下一深度的y1,上一深度的y等于下一深度的x1-(a/b)*y1。    需要注意,上面推导时用的除法都是整型除法

例题:

  题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=775

思路:直接套即可,贴出代码,方便理解

  

#include <iostream>
#include <cstdio>
using namespace std;
int x,y,d;//d代表最大公约数

void extend_gcd(int a,int b)
{
    int t;//用来记录当前的x值,因为在计算y的时候会用到
    if(b==0)
    {
        x = 1;
        y = 0;
        d = a;
    }
    else
    {
        extend_gcd(b,a%b);
        t = x;
        x = y;
        y = t-(a/b)*y;
    }
} 

int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
            extend_gcd(a,b);
        printf("%d %d\n",x,y);
    } 

    return 0;
}

参考资料:http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html

时间: 2024-10-17 18:23:05

欧几里得算法的扩展形式的相关文章

欧几里得算法与扩展欧几里得算法_C++

先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证明,对后续知识有用) 欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数 定义 gcd(a,b) 为整数 a 与 b 的最大公约数 引理:gcd(a,b)=gcd(b,a%b) 证明: 设 r=a%b , c=gcd(a,b) 则 a=xc , b=yc , 其中x , y互质

欧几里得算法以及扩展欧几里得算法(过河noip2005提高组第二题)

欧几里得算法:也被称作辗转相除法 gcd(a,b)=gcd(b,a%b); 终止条件a=gcd b=0; (gcd为a,b的最大公约数) 扩展欧几里得算法: a 和 b 的最大公约数是 gcd ,一定能够找到这样的 x 和 y ,使得: a*x + b*y = gcd 成立 我们只需要找到特殊解x0,y0; 则通解为 x = x0 + (b/gcd)*t    y = y0 – (a/gcd)*t 那如何求出下一组解呢 仿照欧几里得算法a=b,b=a%b代入. a%b = a - (a/b)*b

欧几里得算法与扩展算法相关内容

推荐博客     http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里得算法求最大公约数(辗转相除) 定理 gcd( m , n )=gcd ( n , m mod n ) ( m>n 且 m mod n 不为0) 最小公倍数记为lcm( m , n ),显然lcm( m , n )=m*n / gcd( m , n ) 对于正整数k,有性质 lcm( km , kn)=k*gcd( m , n ) 欧几里得算

欧几里得算法与扩展欧几里得算法

欧几里得算法基于这样一个 GCD 递归定理: $gcd(a, b) = gcd(b, a\bmod{b}) $ 证明如下: 假设 $a > b$, $a = kb + r(0 <= r < b)$, 即 $a\bmod{b} = r$. 若有 $d \mid a$ 且 $d \mid b$, 必然有 $d \mid a - kb$, 即 $d \mid r$. 由此得知, $a$ 与 $b$ 的所有公约数必然是 $b$ 与 $r$ 的公约数. 若有 $d \mid r$ 且 $d \mi

数论杂谈——欧几里得算法及扩展欧几里得

数学是oi的重要基础,所以说数论在oi中占据了非常重要的地位,因此,学好数学,对于一个oier来说也是非常重要的. oi中的数学,其实也就和数竞并没有什么区别. 欧几里得法辗转相除法求最大公约数 我们可以证明gcd(a,b)=gcd(b,a%b),也就是我国古代数学智慧的结晶,更相损减术.并且一直递归下去,直到b的值为零,最大公约数值即为a.在这里就不给出详细证明了,大家可以代几个数据去验证它一下.谁叫我数学太菜. 代码如下 int GCD(int a,int b) { if(!b) { ret

欧几里得算法及扩展算法。

百度百科: 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = gcd(b,a mod b). 证明: r = a mod b,  a = b * k + r; =>   r = a - b * k; d|a && d|b =>(a/d - b / d * k) = r / d =>d|r ∴ gcd(a, b) = gcd(b, a mod b); 代码 int gcd(int a, int

算法学习 之 欧几里得算法和扩展欧几里得算法(二)

关于扩展欧几里得算法(Extended Euclidean Algorithm),我是在做青蛙的约会这一经典题目才接触到这个算法的.后面也有关于这一题的AC代码和解题思路. 内容:已知a, b,求解一组x,y,使它们满足贝祖等式: ax+by =gcd(a, b) 扩展欧几里得算法,就和它的名字一样是对欧几里得算法的扩展.何为扩展?一是,该算法保留了欧几里得算法的本质,可以求a与b的最大公约数.二是,已知a, b求解二元一次方程ax+by =gcd(a, b)的一组解(x,y). 证明: 假设 

扩展欧几里得算法(extgcd)

相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义就是对欧几里得算法的扩展. 切入正题: 首先我们来看一个问题: 求整数x, y使得ax + by = 1, 如果gcd(a, b) != 1, 我们很容易发现原方程是无解的.则方程ax + by = 1有正整数对解(x, y)的必要条件是gcd(a, b) = 1,即a, b 互质. 此时正整数对解

扩展的欧几里得算法

最近的密码学实验,要求模逆,以前都没认真的研究过扩展的欧几里得算法,就趁着这个机会,把扩展的欧几里得算法好好的研究了一番: 扩展的欧几里得算法的应用范围也很广泛:1.可以用来求解不定方程的解.2.可以用来求解模线性方程(线性同余方程)3.求解模的逆元. 由这个名称我们就可以得知,这个算法是对欧几里得算法的扩展,欧几里得算法是求两个数的最大公约数,而扩展的算法就是对上面式子的x,y进行求解. 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对