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

推荐博客     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 )

欧几里得算法

 1 int gcd(int m,int n)  //求m,n最大公约数
 2 {
 3     if(m<n)
 4         gcd(n,m);
 5     int r;
 6     do{
 7         r=m%n;
 8         m=n;
 9         n=r;
10     }while(r);
11     return m;
12 }

欧几里得算法递归实现

1 int gcd(int m,int n)
2 {
3     if(n<m)gcd(n,m);
4     if(n==0)return m;
5     else return gcd(n,m%n);
6 }

由欧几里得算法得知 如果gcd(  m , n )= 1,则m,n互素



扩展欧几里得算法

扩展欧几里得算法: 对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数d,则存在整数对x,y,使得gcd(a,b)=ax+by。

定理 :对于不定整数方程ax+by=c,若c mod gcd(a,b)=0(记为(a,b)|c,或d|c),则该方程存在整数解,否则不存在整数解。

证明:设 a>b。

  1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;

  2,ab!=0 时

  设 ax1+by1=gcd(a,b);

  bx2+(a mod b)y2=gcd(b,a mod b);

  根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);

  则:ax1+by1=bx2+(a mod b)y2;

  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

  根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;

这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.

    上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

扩展欧几里得递归代码

 1 int exgcd(int a,int b,int &x,int &y)   //&引用符号,修改x,y,函数返回的是a,b的最大公约数
 2 {
 3     if(b==0)
 4     {
 5         x=1;
 6         y=0;
 7         return a;
 8     }
 9     int r=exgcd(b,a%b,x,y);            //递归下去
10     int temp=x;
11     x=y;
12     y=temp-a/b*y;
13     return r;
14 }
时间: 2024-10-06 02:45:56

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

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

百度百科: 欧几里德算法又称辗转相除法,是指用于计算两个正整数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

欧几里得算法与扩展欧几里得算法_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

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

欧几里得算法基于这样一个 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

欧几里得算法的扩展形式

这个算法是用来求满足下列条件的整数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

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

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

扩展欧几里得算法详解

一:欧几里得算法(辗转相除法) 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a

扩展的欧几里得算法

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