noip知识点总结之--欧几里得算法和扩展欧几里得算法

一、欧几里得算法

名字非常高大上的不一定难,比如欧几里得算法。。。其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法

需要先知道一个定理:

gcd(a, b) = gcd(b, a mod b) (其中a mod b != 0)  或  b (其中a mod b == 0)

证明:

后半部分呢。。。是废话,于是只要证明前半部分即可。

不妨设g = gcd(a, b),于是有 a = g * A, b = g * B 且 (A, B) = 1

故gcd(b, a mod b) = gcd(g * B, (g * A) mod (g * B)) = g * gcd(B, A mod B)

若gcd(B, A mod B) != 1,我们可以得到:

存在g‘ > 1,使g‘ | B且g‘ | A mod B,故g‘ | A, 与(A, B) = 1矛盾!

故gcd(B, A mod B) = 1,也即gcd(b, a mod b) = g * 1 = g = gcd(a, b)

证毕。。。(貌似搞烦了?)

于是就可以做了。。。时间复杂度是O(log(max(a, b)))

十分简单地code:(只有一行额。。。)

1 int gcd(int a, int b){
2     return !b ? a : gcd(b, a % b);
3 }

应用的话。。。除了求gcd(a, b)以外。。。

貌似还可以求a,b的最小公倍数lcm(a, b) = a * b / gcd(a, b)(废话+1。。。)

但是许多地方都用得到gcd。。。还是挺重要的

二、扩展欧几里得算法

Now,我们已经会求了gcd(a, b)了。。。

而同时有一个叫裴蜀定理(搞得像吃的"焙薯"一样。。。饿了>.< 唔~):

若gcd(a, b) = 1,则存在x, y,使a * x + b * y = 1(证略)

改一改就变成了:

对任意的a和b,存在x, y,使a * x + b * y = gcd(a, b)

而x, y的计算是可以在上面求解gcd(a, b)中一起完成的。。。推一下就出来了。。(有便加深记忆)

此处不再赘述,请直接参考code:

 1 int extend_gcd(int a, int b, int &x, int & y){
 2     if (!b){
 3         x = 1, y = 0;
 4         return a;
 5     }
 6     int res = extend_gcd(b, a % b, x, y), tmp = x;
 7     x = y;
 8     y = tmp - a / b * y;
 9     return res;
10 }

而求出的(x, y)有可能会大(小)的非常离谱,于是就需要进行调整。。。

不定方程的通解形式大家都会吧。。。

扩展欧几里德算法的应用主要有以下三方面:

(1)求不定方程

(2)求模线性方程(线性同余方程)

(3)求模的逆元

作为noip的复习嘛。。。(1)就是本来的用处,(2)(3)应该不会考的说(奇怪的flag)

时间: 2024-08-09 06:32:49

noip知识点总结之--欧几里得算法和扩展欧几里得算法的相关文章

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

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

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

就像之前说的,接触到扩展欧几里得算法,是由于做到了这一题SWUST OJ 青蛙的约会之二(0481) http://www.cnblogs.com/haveyoueverbeen/p/4483218.html (查看题目信息可以戳上面的地址) 解题思路: 设输出结果为 s,则(m*s+x)-(n*s+y)= kl (k∈Z),即(n-m)*s + kl = x-y,设 a=n-m,b=l,c=x-y,即as +bk=c (ax+by=c),求最小正整数x,然后用扩展欧几里得算法,得到一组解x0 

回档|欧几里得算法和扩展欧几里得算法

欧几里得算法:用于求两个非负整数a.b的最大公因数(用gcd(a,b)表示).这里用d表示,假设d一定存在. 证明:由题设知d|a,d|b(d|a代表d能整除a,即a mod d=0) 设a=kb+r,这里k和r都是整数.则r=a mod b.        我们可以让a=n1d,b=n2d.则r=(n1-k*n2)d        ∴d|r  ∴gcd(a,b)=gcd(b,a mod b) 扩展的欧几里得算法: 对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数

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

1 实现代码: #include <iostream> 2 using namespace std; 3 4 void exgcd(long long a, long long b, long long &d, long long &x, long long &y) { 5 if (b == 0) { 6 d = a, x = 1, y = 0; 7 } 8 else { 9 exgcd(b, a%b, d, y, x); y-=a/b*x; 10 } 11 } 12

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

这是我算法学习标签下的第一篇随笔,首先我想声明,在看了很多博客后,我的想法就是,尽量不去盲目复制别人的东西,一个原因是盲目复制不一定能发现其文章中的错误,二是可以加深自己的理解程度,并且将博客写得通俗易懂,转载别人的东西一定要注明出处.还有我的一个习惯就是,把东西写短一点,所以有可能会将一个本来应在一篇文章的东西,写成好几节. Euclid Algorithm 又称辗转相除法,用途是求两个正整数a,b的最大公约数,gcd(a,b )表示a和b的最大公约数(gcd = greatest commo

简练软考知识点整理-ABC成本法和ABC分析图法

ABC成本法即基于活动的成本计算法,ABC成本法主要用于对现有流程的描述和成本分析.ABC成本法和价值链分析法有某种程度的相似,都是将现有的业务进行分解,找出基本活动.但作业成本分析法着重分析各个活动的成本,特别是活动中所消耗的人工.资源等. 通过对作业成本的确认和计量,以及对所有作业活动的追踪和动态反映,从而消除"不增值作业".改进"可增值作业",将企业的损失.浪费减少到最低限度,提高决策.计划.控制的科学性和有效性,促进企业管理水平的不断提高. ABC分析图法又

扩展欧几里得算法学习记

话说以前我刷noip题的时候就想学这个东西了,结果却一直拖到了现在…… 到了高二才会这种东西的我实在是个蒟蒻啊! 将扩展欧几里得算法之前,先讲讲欧几里得算法是什么:gcd(a,b)=gcd(b,a%b).很显然是不?但我们还是要给出证明(设r=a%b): 设x是a,b的一个公约数,由于存在k使得a=k*b+r,又由于a|x,b|x,则有r|x,所以x是b,r的公约数 设x是b,r的一个公约数,因为存在k使得a=k*b+r,且b|x,r|x,那么a|x,所以x是a,b的公约数 综上所述,a和b的所

扩展欧几里得算法模板题 zoj 3609

Modular Inverse Time Limit: 2 Seconds      Memory Limit: 65536 KB The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (mod m). This is equivalent to ax≡1 (mod m). Input There are multiple test cases. Th

扩展欧几里得算法的模板实现

我居然现在还记不住扩欧的板子,我太弱啦! 扩展欧几里得算法解决的是这样的问题: 给定一个不定方程组ax+by=gcd(a,b),求他的一组整数解 先给出实现代码 void exgcd(int a,int b,int &x,int &y) { if(!b) { x=1,y=0;//gcd(a,0)显然等于1*a-0*0=a return a; } int ans=exgcd(b,a%b,x,y); int tem=x; x=y; y-=tem-(a/b)*y; return ans;} 但实