扩展欧几里德算法.....哦,扩欧

首先推荐两篇比较好的博客

http://blog.csdn.net/lincifer/article/details/49391175

(然后下面便是一个蒟蒻的总结QAQ)

扩展欧几里德算法

基本算法:

  对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 ax + by = gcd(a, b) = d

证明:

  设 a > b。

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

  2. ab != 0 时

  原式:  ax + by = gcd(a, b)(假设a ≥ b)

  • 当 b = 0 时有 gcd(a, b) = a, 此时 x = 1, y = 0
  • 当b不为0时, 根据欧几里得定理 gcd(a, b) = gcd(b, a mod b) 可得 ax + by = gcd(a, b) = gcd(b, a mod b) = bx′ + (a mod b)y′,
  • 即 ax + by = bx′ + (a mod b)y′ = bx′ + (a − b ∗ ⌊a / b⌋)y′  

  【我们知道 a % b = a - (a / b) * b(这里的 “/” 指的是整除,例如 5 / 2 = 2 , 1 / 3 = 0)】

  • 移项得 ax + by = bx′ + (a mod b)y′ = ay′ + b(x′ − ⌊a / b⌋ y′)

   根据恒等定理,有

   x = y′ 

   y = x′ − ⌊a / b⌋y′

  

  这有什么用呢? x′ 和 y′ 还是不知道呀.

  重新来看看我们得到的两个等式.

  x 和 y 是 gcd(a, b) = ax + by 的解,

  而 x’ 和 y’ 是在对 gcd(a, b) 按欧几里德算法进行一步后的结果对应的贝祖等式 gcd(b, a mod b) = bx′ + (a mod b)y′ 的解。

  也就是说, gcd(a, b) 对应的贝祖等式的解 x, y 可以由 gcd(b, a mod b) 对应等式的解 x’, y’ 计算得出。

  更进一步,对于任意不定式 ax′ + by′ = c, 只需要在等式 ax + by = gcd(a, b) = d 两边乘上 c /d 即可得到解为 x′ = x ∗ c / d, y′ = y ∗ c / d

扩欧代码:

 1 int exgcd(int a, int b, int &x, int &y) {
 2     if(b == 0) {
 3         x = 1; y = 0;
 4         return a;
 5     }
 6     int ans = exgcd(b, a % b, x, y);
 7     int x1 = x;
 8     x = y;
 9     y = x1 - a / b * y;
10     return ans;
11 }
时间: 2024-11-05 06:18:50

扩展欧几里德算法.....哦,扩欧的相关文章

HDU 1098 Ignatius's puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

扩展欧几里德算法详解

扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法,用 C++ 语言描述如下: 由于是用递归写的,所以看起来很简洁,也很好记忆.那么什么是扩

扩展欧几里得算法------扩展欧几里德算法

扩展欧几里得算法及其应用 一.扩展欧几里得算法 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,若gcd(a,b)表示 a,b 的最大公约数,必然存在整数对x,y ,使得 ax+by = gcd(a,b). 算法过程: 设 a>b,当 b=0时,gcd(a,b)=a.此时满足ax+by = gcd(a,b)的一组整数解为x=1,y=0:当a*b!=0 时, 设 a*x1+b*y1=gcd(a,b):b*x2+(a mod b)*y2=gcd(b,a mod b): 根据欧几里得原理知 g

POJ-1061 青蛙的约会-数论扩展欧几里德算法入门及推导

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

【zz】欧几里德与扩展欧几里德算法相关

关于欧几里德与扩展欧几里德算法在此附上我自学的时用的网站:感谢:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 这里我会结合该大牛的成果以及自己的收获总结一下: 欧几里德算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 证明: a可以表示成a = kb +

扩展欧几里德算法

文章来源:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设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

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

转自网上大牛博客,讲的浅显易懂. 原文地址:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设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的一个公约数,则有

扩展欧几里德算法及其证明

扩展欧几里德算法: 已知a, b求解一组x,y,使它们满足等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理). 扩展欧几里德常用在求解模线性方程及方程组中. 证明: ax+by=gcd(a,b); 1. (1) a = 0,ax+by = gcd(a,b) = gcd(0,b) = b, 此时x = 0(此时x的值是任意的),y = 1: (2)b = 0, ax + by = gcd(a,b) = gcd(a,0) = a, 此时x = 1,y = 0(此时y