欧几里得 & 拓展欧几里得算法 解说 (Euclid & Extend- Euclid Algorithm)
欧几里得& 拓展欧几里得(Euclid & Extend-Euclid)
欧几里得算法(Euclid)
背景:
欧几里德算法又称辗转相除法。用于计算两个正整数a。b的最大公约数。
——百度百科
代码:
递推的代码是相当的简洁:
int gcd(int a,int b) { return b == 0 ? a : gcd(b, a % b); }
分析:
方法说了是辗转相除法,自然没有什么好介绍的了。
。
Fresh肯定会认为这样递归下去会不会爆栈?实际上在这里是不会爆栈的,由于递归的层数是很小的,不信你能够随便拿一些大数測试一下,lrj的白书和紫书上讲到gcd函数的递归层数不超过40785lgN + 1.6723,当中N=max{a,b}。让gcd函数递归层数最多的是gcd(F(n),F(n-1))。F(n)是Fibonacci数!!至于为什么博主没有证明。有想法的小伙伴麻烦在评论在说下下。(*^__^*) 嘻嘻……
拓展欧几里得(Extend- Euclid)
背景:
扩展欧几里德算法是用来在已知a, b求解一组x,y [x,y都是整数],使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在。依据数论中的相关定理)。
扩展欧几里德经常使用在求解模线性方程及方程组中。
——百度百科
用到的几个欧几里得重要结论:
1) gcd(a,b) = gcd(b,a %b);
2) gcd(a,0) = a.
代码:
typedef __int64 ll;
void exgcd(ll a, ll b, ll& d, ll& x, ll &y)
{
if(!b)
{
d = a, x = 1, y = 0;
}
else
{
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
分析:
设例如以下两个方程:
ax+by = gcd(a,b) = d。
bx’+(a%b)y’ = gcd(b,a%b);
那么由重要结论(1)有gcd(a,b) = gcd(b,a %b),
那么ax+by = bx’+(a%b)y’ = bx’ +(a – [a/b]*b)y’ = ay’ + b(x’ – [a/b]y’),
由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。
........
那么如今就能够用exgcd(a,b,d,x,y)表示方程ax+by = d,那么由上面一直递归下去,直到 b = 0。递归结束。此时 d = gcd(a,0) =a , x = 1,y =0;【由于 ax+0*y = gcd(a,0)嘛~】
拓展欧几里得的几个应用
求解不定方程
比如:求解不定整数方程ax+by = c
求ax+by = c。 令d =gcd(a,b);
那么(a / d ) * x + (b / d )* y = c / d
由于(a / d )、(b / d ) 、x、y都是整数,那么保证原不定整数方程ax+by = c有解的充要条件就是c / d为整数,即c是gcd(a,b)的倍数。
假设有解。那么令 K = c/d;
那么。对方程aX+bY = d;如果有拓展欧几里得求出一组解为(X0,Y0)。那么aX0+bY0 = d;等式两边同一时候乘以K,即K*( aX0+bY0 ) = d*K = c。由恒等关系。原方程的解(x0。y0):
X0 = KX0 = c/d * X0,y0 = KY0 = c/d *Y0。
不定方程的通解:
若(x0,y0)是不定整数方程ax+by = c的一组解,则他的随意整数解都能够表示成(x0+ kb’, y0-ka’),当中a’ = a/gcd(a,b), b’ = b/gcd(a,b).
例题:
POJ 1061青蛙的约会 链接: http://poj.org/problem?id=1061
求解模线性方程
方法跟上面类似。将同余方程转化为常规线性方程就能够了,跟上面一样,谈到同余方程的一个解时,事实上指的是一个同余等价类....
详细内容待补充...
求模的逆元
待补充…
欧几里得 & 拓展欧几里得算法 解说 (Euclid & Extend- Euclid Algorithm)的更多相关文章
- ACM数论-欧几里得与拓展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- ACM数论-欧几里得与拓展欧几里得
ACM数论——欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd ...
- POJ 1601 拓展欧几里得算法
学习链接:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 先来学习一下什么是欧几里得算法: 欧几里得原理是:两个整数 ...
- POJ 1061 青蛙的约会(拓展欧几里得算法求解模线性方程组详解)
题目链接: BZOJ: https://www.lydsy.com/JudgeOnline/problem.php?id=1477 POJ: https://cn.vjudge.net/problem ...
- <数论相关>欧几里得与拓展欧几里得证明及应用
欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...
- 数论入门——斐蜀定理与拓展欧几里得算法
斐蜀定理 内容 斐蜀定理又叫贝祖定理,它的内容是这样的: 若$a,bin N$,那么对于任意x,y,方程$ax+by=gcd(a,b)*k(kin N)$一定有解,且一定有一组解使$ax+by=gcd ...
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...
- GCD欧几里得的拓展算法
欧几里得算法的拓展主要是用于求解 : 已知整数 a, b,然后我们进行 ax + by == gcd(a , b) 的问题求解 那么如何进行求解呢?和欧几里得算法一样, 我们需要进行递归的方式进 ...
- 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)
欧几里得算法 又称辗转相除法 迭代求两数 gcd 的做法 由 (a,b) = (a,ka+b) 的性质:gcd(a,b) = gcd(b,a mod b) int gcd(int a,int b){ ...
随机推荐
- 生成错误:对路径".dll"的访问被拒绝
第一步:检查dll所在的目录的访问权限,右键文件夹>属性>安全>设置添加EveryOne用户并将完全控制的权限赋给它. 如果问题还没有解决,请不要一遍遍的重启,看第二步: 第二步:右 ...
- session一致性架构设计实践.
一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...
- 实现X*N
#include<iostream> using namespace std; double foo(int n,double x) { if(1==n) { return x; } el ...
- 屏蔽scrollview的滚动
外层有scrollview时,手指移动方向跟滚动条方向相同时,会导致scrollview的滚动.此时如果不想滚动的话,可以在要接受ontouch的子视图,或者子子视图中的touch监听里加上v.get ...
- cmd 切换目录和配置环境变量
记录一下: 在用cmd进行切换盘符的时候, 如果是从 C盘切换到其他盘的话: D:直接回车就行了. 如果是在同一个盘符内切换文件夹的话,cd D:\ComputerSoft\curl\curl-7.6 ...
- 【YOLO】实时对象检测使用体验
官网:https://pjreddie.com/darknet/yolo/ 以下全部在服务器上完成,服务器上是有opencv等. 1.安装Darknet git clone https://githu ...
- 原生Ajax的使用——含开放API接口
看了两天关于Ajax的使用,总感觉云里雾里的. 故在此总结梳理一下,如果疏漏错误还请纠正支出. Ajax能够在向服务器请求额外的数据时,不必重新加载/卸载整个页面,实现一小块区域性的刷新,也是常说的异 ...
- 2977,3110 二叉堆练习1,3——codevs
二叉堆练习1 题目描述 Description 已知一个二叉树,判断它是否为二叉堆(小根堆) 输入描述 Input Description 二叉树的节点数N和N个节点(按层输入) 输出描述 Outpu ...
- Dijkstra算法模板
自己对Dijstra算法的理解是: 首先输入保存点,边的权值(注意无向图和有向图在保存时的区别). 将表示从起点st到顶点 i 的距离的d[ i ]数组的每一个值初始化为INF,令d[st] = 0. ...
- 66.零停机下reindex
主要知识点: 理解reindex的使用场景和必要性 学会reindex 一.理解reindex的使用场景和必要性 假设:在某一个index中依靠dynamic mapping插入数据, ...